先写一个对文件操作的功能类
暂时只用得到读
package PYTHONtoJAVA;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class IO {
//指定编码格式的路径读取
public static char[] getTheFile(String path,String format) {
char[] article = null;
try {
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,format);
char[] articleF = new char[(int) file.length()];
int len;
while((len=isr.read(articleF))!=-1) {
article = new char[len];
for(int i=0;i<len;i++) {
article[i] = articleF[i];
}
}
isr.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return article;
}
//不带编码格式的,默认为“utf-8”的路径读取
public static char[] getTheFile(String path) {
char[] article = null;
try {
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
char[] articleF = new char[(int) file.length()];
int len;
while((len=isr.read(articleF))!=-1) {
article = new char[len];
for(int i=0;i<len;i++) {
article[i] = articleF[i];
}
}
isr.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return article;
}
public static void createFile(String path) {
}
public static void createFile() {
}
}
再写操作程序的功能类
写起来发现很难,有些想法只在脑子里简单,很多功能很难实现,还有很多小细节,因为没有仔细研究过python的底层,所以全靠自己的经验。
目前想法是,把读到的python程序放入一个HashMap中并且编号,进行一行行或者多行分析。再建立一个HashMap用于存放转译过后的代码。创建一个ArrayList用于存放出现的变量名、方法名、类名等等。具体操作分开写,比如赋值语句、print语句、、、单独对他们进行分析转义,目前已经写了赋值语句,后面会继续写,不知道能不能行。操作整体对象时将分为“块”,比如class整体是一个块,def整体是一个块,for语句是一个块、、、先写着。
package PYTHONtoJAVA;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
public class Operation {
//记录存在的变量名、方法名和类名
static ArrayList<String> variable;
//记录python程序和新创建的java
Map<Integer,String> mapString = new HashMap<>();
Map<Integer,String> mapNew = new HashMap<>();
char[] article;
//初始化map,将目标文件变成一行一行处理
public Operation(char[] article) {
this.article = article;
int row=1;
for(int i=0;i<article.length;i++) {
if(article[i] == '\n') {
row++;
}
}
int j=0;
for(int i=0;i<row;i++) {
String tmp = "";
for(;j<article.length;j++) {
if(article[j] != '\n' && j != article.length-1) {
tmp += article[j];
}else if(article[j] == '\n'){
mapString.put(i, tmp);
j++;
break;
}else if(j == article.length-1) {
tmp += article[j];
mapString.put(i, tmp);
}
}
}
}
//字符串内是否含有指定字符串
public boolean contains(String str,String keywords) {
int length = keywords.length();
for(int i=0;i<=str.length()-length;i++) {
if(str.substring(i,i+length).equals(keywords)) {
return true;
}
}
return false;
}
//得到赋值语句“=”前的变量名
public String getName(int index) {
String str = mapString.get(index);
String news;
int to = 0;
for(int i=0;i<str.length();i++) {
if(str.substring(i,i+1).equals("=")) {
to = i;
break;
}
}
news = str.substring(0,to).strip();
return news;
}
//获取字符串开头空格数量
public int getBlank(int index) {
String str = mapString.get(index);
int blank = 0;
for(int i=0;i<str.length();i++) {
if(str.substring(i,i+1).equals(" ")) {
blank++;
}else {
break;
}
}
return blank;
}
//从指定行向下搜索,找到class或者def或者for之类的语句负责的代码块
public int searchRange(int index) {
if(index == mapString.size()-1) {
return index;
}
int blank = getBlank(index);
int orange = index + 1;
while(true) {
if(orange == mapString.size()-1) {
return orange;
}
if(!mapString.get(orange).isBlank() && getBlank(orange) <= blank) {
return orange-1;
}else {
orange++;
}
}
}
//处理赋值语句
public void assignment(int writeIndex,int index) {
String str = mapString.get(index);
if(variable.contains(getName(index))) {
mapNew.put(writeIndex, str);
}else {
variable.add(getName(index));
mapNew.put(writeIndex, "Object"+str);
}
}
//处理print语句
public void output(int writeIndex,int index) {
char[] arr = mapString.get(index).toCharArray();
int from;
for(int i=0;i<arr.length;i++) {
}
}
//处理索引范围内的mapString的程序段
public void gan(int writeIndex,int from,int to) {
//判断语句是不是赋值语句“=”,如果是,判断变量名是否已经存在,不存在添加Object,并且放到变量名堆里。
//如果是for语句,需要重写。如果是elif需要改变。如果是print需要改变。如果是def,class需要改变。如果是魔法方法,需要改变。
//如果是self,需要改变。如果是random之类的需要改变。
//如果处理块是一行
if(from == to) {
String str = mapString.get(from);
if(contains(str, "=") && !contains(str, "print")) {
assignment(writeIndex, from);
}
else if(contains(str, "print")){
}
}
}
//一起处理
public void operate() {
//将class和def分成块,从index开始读,总共orange行。
int index = 0;
int orange = 0;
//flag判断已经将import语句全部导入,进入主体转换
boolean flag = true;
//写入mapNew的索引
int writeIndex = 0;
while(flag) {
if(mapString.get(index).equals("")) {
index++;
}
else if(this.contains(mapString.get(index),"import")) {
mapNew.put(writeIndex++, mapString.get(index++));
}
else {
flag = false;
}
}
//至此,包含import的行都已经自动略过,保留原格式
while(true) {
orange = searchRange(index);
}
}
}