【javac添加python 列表特性7】解决List各种下标访问的翻译

在Python式的列表访问中,下标访问有很多种形式,详见:

http://ez2learn.com/index.php/python-tutorials/python-tutorials/167-slice

而这些访问一定要用到for循环,如把

List k=[1,2,3,4,5];
System.out.println(k[1:3:2]); //k[1:3:2]的翻译要用到for循环
                              //所以只能用函数来替换k[1:3:2]
所以就只能把k[1:3:2]替换成:__list_access(k,1,3,2);

那么这就意味着我必须要把__list_access的定义添加到每个类的源代码中。

为了解决这个问题,我在javacParser.java里面,调用了它自己提供的parser,把我自己写的__list_access的定义parse了进去,并且添加到了语法树上面。

这样,在translator中进行转换的时候,就能把k[1:3:2]节点转换成__list_access(k,1,3,2);

另外,对于__list_access的定义,今天晚上还真是写了半天啊。本来以为挺简单的。。。没想到python的list访问规则这么麻烦。最后写出来一份比较简单的代码,希望它没有问题吧:

private static java.util.List __list_access(java.util.List list, int beg,
			int end, int step) {
		int len = list.size();
		java.util.List tmpList = new java.util.ArrayList();
                
                beg += (beg < 0) ? len : 0;
	        end += (end < 0) ? len : 0;
		if (step == Integer.MAX_VALUE)
			step = 1;
		if (step > 0) {
			if (beg == Integer.MAX_VALUE)
				beg = 0;
			if (end == Integer.MAX_VALUE)
				end = len;
			for (int i = beg; i < end; i += step) {
				tmpList.add(list.get(i));
			}
		} else {
			if (beg == Integer.MAX_VALUE)
				beg = len - 1;
			if (end == Integer.MAX_VALUE)
				end = -1;

			for (int i = beg; i > end; i += step) {
				tmpList.add(list.get(i));
			}
		}

		return tmpList;
}

你可能感兴趣的:(python,OpenJDK,javac,List访问)