爲了支持給列表進行賦值,使用這樣的語法 list[1]=10, 而這跟a=list[1]是不同的,由於前者用java的語法應該翻譯成 list.set(1,10),然後在應該翻譯成 a= list.get(1)。因此要判斷list[1]是在賦值的左邊仍是右邊。 java
對於list[1]=10,抽象語法樹的遍歷過程是 spa
JCAssign(list[1]=10) -> JCIndexed(list[1]) 翻譯
->JCLiteral(10) code
JCAssign(list[1]=10) <- get
採用後序遍歷,先子樹,後父樹 it
因此採用一個全局變量來記錄當前是否是在左邊(isLeft)和一個變量記錄當前是否是list的賦值(isSet), class
boolean tmpIsLeft = isLeft; // save isLeft states, to solve nested // problem such as list[list[1]=a]=a; isLeft = true; // set isLeft=true boolean tmpIsSet = isSet; // save isSet states isSet = false; tree.lhs = translate(tree.lhs); // translate left tree of assign isLeft = false; tree.rhs = translate(tree.rhs); // translate right tree of assign if(isSet) {//是賦值的set,翻譯}
爲了支持負數下標的訪問,翻譯很簡單,list[expr]==>list[expr<0?(expr+list.size()):expr] 變量