Python转Java程序(3)

根据之前的内容,这两天空闲的时候补充了一下功能

增加了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);
			
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值