根据之前的内容,这两天空闲的时候补充了一下功能
增加了Operation类的print和for的简单识别,复杂的暂时没打算写。同时明确了下一步的想法,找到缩进数为倒数第二大的行,这些行如果是块,那一般是for,if,def等等,他们的内容都是简单语句(pass,print,赋值),因为如果是复杂的if,for等等的语句,那么缩进就会增加一个级别了。如果这些块是简单的pass,print或者赋值语句,那就更方便。
未完待续。。。。。。
package PYTHONtoJAVA;
import java.util.Map;
import javax.management.Query;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Operation {
//记录存在的变量名、方法名和类名
static List<String> variable = new ArrayList<>();
//记录python程序和新创建的java
Map<Integer,String> mapString = new HashMap<>();
Map<Integer,String> mapNew = new HashMap<>();
//python程序代码
char[] article;
//写入的行数
static int writeIndex = 0;
//初始化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;
}
//获得指定行的空格字符串
public String getBlanks(int index) {
String blanks = "";
for(int i=0;i<getBlank(index);i++) {
blanks += " ";
}
return blanks;
}
//从指定行向下搜索,找到class或者def或者for之类的语句负责的代码块
public int searchRange(int index) {
if(mapString.get(index).isBlank()) {
return index;
}
if(index == mapString.size()-1) {
return index;
}
int blank = getBlank(index);
int orange = index + 1;
while(true) {
if(orange == mapString.size()) {
break;
}
if(!mapString.get(orange).isBlank() && getBlank(orange) <= blank) {
break;
}else {
orange++;
}
}
for(int i=orange-1;i>=0;i--) {
if(!mapString.get(i).isBlank()) {
orange = i;
break;
}
}
return orange;
}
//得到指定行()内的内容
public String getContent(int index) {
char[] str = mapString.get(index).toCharArray();
int from = 0;
int to = 0;
String strnew = "";
for(int i=0;i<str.length;i++) {
if(str[i] == '(') {
from = i+1;
break;
}
}
for(int i=str.length-1;i>0;i--) {
if(str[i] == ')') {
to = i;
break;
}
}
for(int i=from;i<to;i++) {
strnew += str[i];
}
return strnew;
}
//得到for item in ...:的item
public String getForName(int index) {
String str = mapString.get(index);
int from = 0;
String name = "";
for(int i=0;i<str.length();i++) {
if(str.substring(i,i+3).equals("for")) {
from = i+3;
break;
}
}
for(int i=from;i<str.length();i++) {
if(!str.substring(i,i+1).equals(" ")) {
from = i;
break;
}
}
for(int i=from;i<str.length();i++) {
if(!str.substring(i, i+1).equals(" ")) {
name += str.substring(i,i+1);
}else {
break;
}
}
return name;
}
//得到for item in ...:的...
public String getForString(int index) {
char[] arr = mapString.get(index).toCharArray();
int from = 0;
int to = 0;
String str = "";
for(int i=arr.length-2;i>0;i--) {
if(arr[i] != ':' && arr[i] != ' ') {
to = i+1;
break;
}
}
for(int i=to-1;i>0;i--) {
if(arr[i] == ' ') {
from = i+1;
break;
}
}
for(int i=from;i<to;i++) {
str += arr[i];
}
return str;
}
//得到此类方法的类名
public String getClassName(int index) {
int tmp = index-1;
while(true) {
if(!mapString.get(tmp).isBlank() && contains(mapString.get(tmp), "class") && getBlank(index) > getBlank(tmp)) {
char[] arr = mapString.get(tmp).toCharArray();
int from = 0;
int to = 0;
String strnew = "";
for(int i=0;i<arr.length;i++) {
if(arr[i] == ' ') {
from = i;
break;
}
}
for(int i=arr.length-1;i>0;i--) {
if(arr[i] == ':') {
to = i;
break;
}
}
for(int i=from;i<to;i++) {
strnew += arr[i];
}
strnew = strnew.strip();
return strnew;
}else {
tmp--;
}
}
}
//得到
//处理pass语句,自带判断语句
public void pass(int index) {
String str = mapString.get(index);
if(contains(str, "pass") && str.strip().length() == 4) {
mapNew.put(writeIndex++, "\n");
}
}
//处理赋值语句,自带判断
public void assignment(int index) {
String str = mapString.get(index);
if(contains(str, "=") && !contains(str, "print(") && searchRange(index)==index) {
String blanks = getBlanks(index);
if(variable.contains(getName(index))) {
mapNew.put(writeIndex++, blanks+str+";\n");
}else {
variable.add(getName(index));
mapNew.put(writeIndex++, blanks+"Object "+str+";\n");
}
}
}
//处理print语句,自带判断
public void output(int index) {
String str = mapString.get(index);
if(contains(str, "print(") && searchRange(index) == index) {
String blanks = getBlanks(index);
char[] arr = mapString.get(index).toCharArray();
int from = 0;
int to = 0;
//()内的修改后内容
String strnew = "";
//()内双引号数量
int quateNum = 0;
//()内单引号的数量
int quaNum = 0;
//将print()里的内容区别开来
for(int i=0;i<arr.length;i++) {
if(arr[i] == '(') {
from = i+1;
break;
}
}
for(int i=arr.length-1;i>0;i--) {
if(arr[i] == ')') {
to = i;
break;
}
}
//判断内容并且修改,这里要考虑单引号双引号和单双同时存在的情况
for(int i=from;i<to;i++) {
if(quateNum == 0 && quaNum == 0) {
if(arr[i] == ',') {
strnew += '+';
}
else if(arr[i] == '"') {
quateNum += 1;
strnew += '"';
}
else if(arr[i] == '\'') {
quaNum += 1;
strnew += '"';
}
else {
strnew += arr[i];
}
}
else if(quaNum == 1) {
if(arr[i] == '\'' && arr[i-1] != '\\') {
quaNum -= 1;
strnew += '"';
}
else if(arr[i] == '"' && arr[i-1] != '\\') {
strnew += "\\"+"\"";
}
else {
strnew += arr[i];
}
}
else if(quateNum == 1) {
if(arr[i] == '"' && arr[i-1] != '\\') {
quateNum -= 1;
strnew += '"';
}
else {
strnew += arr[i];
}
}
}
mapNew.put(writeIndex++, blanks+"System.out.println("+strnew+");\n");
}
}
//处理for语句,这里假设使用range,字符串,数组,等等简单的for语句
public void forCircle(int from) {
String str = mapString.get(from);
//确定是不是for语句
if(contains(str, "for") && contains(str, "in") && contains(str, ":") && str.substring(getBlank(from),getBlank(from)+3).equals("for")) {
//确定for语句范围
int to = searchRange(from);
//如果是range
if(contains(str, "range") && !contains(str, "'") && !contains(str, "\"")) {
String blanks = getBlanks(from);
//range(10)
if(!contains(str, ",")) {
int num = Integer.parseInt(getContent(from));
mapNew.put(writeIndex++, blanks+"for(int "+getForName(from)+"=0;"+getForName(from)+"<"+num+";"+getForName(from)+"++){\n");
for(int i=from+1;i<=to;i++) {
pass(i);
output(i);
assignment(i);
}
mapNew.put(writeIndex++, blanks+"}\n");
}
//range(10,50)
else if(contains(str, ",")) {
String nums = getContent(from);
int interrupt = 0;
for(int i=0;i<nums.length();i++) {
if(nums.substring(i,i+1).equals(",")) {
interrupt = i;
break;
}
}
int num1 = Integer.parseInt(nums.substring(0,interrupt));
int num2 = Integer.parseInt(nums.substring(interrupt+1));
mapNew.put(writeIndex++, blanks+"for(int "+getForName(from)+"="+num1+";"+getForName(from)+"<"+num2+";"+getForName(from)+"++){\n");
for(int i=from+1;i<=to;i++) {
pass(i);
output(i);
assignment(i);
}
mapNew.put(writeIndex++, blanks+"}\n");
}
}
//如果是字符串
else if((contains(str, "'") || contains(str, "\"")) && (getForString(from).substring(0,1).equals("\"") || getForString(from).substring(0,1).equals("'"))) {
int length = getForString(from).length()-2;
String blanks = getBlanks(from);
String name = getForName(from);
String forString = getForString(from);
mapNew.put(writeIndex++, blanks+"String "+name+"="+forString+";\n");
mapNew.put(writeIndex++, blanks + "for(int thisFornum=0;thisFornum<"+length+";thisFornum++){\n");
for(int i = from+1;i<=to;i++) {
pass(i);
output(i);
assignment(i);
}
mapNew.put(writeIndex++, blanks+"}\n");
}
//如果是数组
else if(contains(str, "[") && contains(str, "]") && getForString(from).substring(0, 1).equals("[")) {
char[] arr = getForString(from).toCharArray();
int num = 1;
int quanum = 0;
String blanks = getBlanks(from);
String name = getForName(from);
for(int i=0;i<arr.length;i++) {
if(arr[i] == ',') {
if(quanum%2 == 1) {
}else {
num++;
}
}
else if(arr[i] == '\'' || arr[i] == '"') {
quanum++;
}
}
mapNew.put(writeIndex++, blanks+"List<> "+name+" = new ArrayList<>();\n");
mapNew.put(writeIndex++, blanks+name+".add("+getForString(from).substring(1,getForString(from).length()-1)+");\n");
mapNew.put(writeIndex++, blanks+"for(int thisFornum=0;thisFornum<"+num+";thisFornum++;){\n");
for(int i=from+1;i<=to;i++) {
pass(i);
output(i);
assignment(i);
}
mapNew.put(writeIndex++, blanks+"}\n");
}
}
}
//处理if语句
public void ifMent(int index) {
String str = mapString.get(index);
if(contains(str, "if") && contains(str, ":") && str.substring(getBlank(index),getBlank(index)+2).equals("if")) {
int to = searchRange(index);
if(!contains(str, "(") && !contains(str, ")")) {
}
}
}
//处理def语句
public void function(int from) {
int to = searchRange(from);
//如果是类中方法
if(contains(getContent(from), "self")) {
//如果是__init__方法
if(contains(getContent(from), "__init__")) {
String className = getClassName(from);
String strnew = "public "+className+"(";
}
//不考虑其他魔法方法,如果是其他方法
else {
}
}
//不是类中方法
else {
}
}
//处理索引范围内的mapString的程序段
public void gan(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(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);
}
}
}