在Python式的列表访问中,下标访问有不少种形式,详见: php
http://ez2learn.com/index.php/python-tutorials/python-tutorials/167-slice java
而这些访问必定要用到for循环,如把
python
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); code
另外,对于__list_access的定义,今天晚上还真是写了半天啊。原本觉得挺简单的。。。没想到python的list访问规则这么麻烦。最后写出来一份比较简单的代码,但愿它没有问题吧: get
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; }