【javac添加python 列表特性8】list assignment和list下標爲負數的...

爲了支持給列表進行賦值,使用這樣的語法 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] 變量

相關文章
相關標籤/搜索