【javac添加python 列表特性10】爲Block添加返回值

前面幾篇提到的一些特性,都是經過把特殊的新語法,翻譯成java能夠支持的語法來實現的。javac編譯一個文件的過程爲:(參見javac編譯文件過程java

Scanner->Parser->Annotation(optional)->Enter->Attribute->Flow->Desugar->Generate express

那麼以前個人工做都是集中在Parser和Attribute上面的。添加新語法的時候,就是把Parser修改一下,使其可以識別新語法爲一個新的節點,而後Annotation,Enter,Attribute基本不變,在Attribute事後能夠得到類型等額外信息,而後對這個時候的AST運用一個Translator,把新語法轉變爲舊的語法。所以Flow和之後的過程都沒有任何改變。 spa

而此次是涉及到全過程的改變。此次我想實現的是這樣的語法: .net

int r1=10,r2=100;
double area;
double sum={double PI=Math.PI; area=PI*r1*r1;}
           +
           {double PI=Math.PI; area=PI*r2*r2;};
其實就是把Block做爲一個能夠有值的結構,他的值就是block最後一個語句的值。block依然是原來的功能,能夠有任何的語句,block的結果也能夠參與運算。

只是這是一個實實在在的新語法,不能經過翻譯來解決問題。實現的方法其實沒有我想象中那麼難。 翻譯

1.添加新的語法節點JCBlockExp,裏面的成員就一個JCBlock。 調試

2.修改visitor和visitor子類的定義,在裏面加入一個visitBlockExp,添加的內容參照JCBlock,也就是至關於BlockExp只是一個包裝,而實際上仍是處理它的成員JCBlock。因此雖然要改不少文件,但基本是參照JCBlock的代碼寫過來的 code

3.修改Parser使其接受新的語法節點。將JCBlockExp做爲一個term3. blog

4.修改Attribute中的visitBlockExp,把原本的result=null,仿照成其餘expression的處理的結尾,變成result=check(...) get

5.修改Generate中的visitBlockExp,原本block中全部的語句都是用genStat來生成代碼的,而我只須要把最後一條語句用genExp來生成,前面的語句都不變 it

調試調試應該就能夠了

相關文章
相關標籤/搜索