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

前面几篇提到的一些特性,都是通过把特殊的新语法,翻译成java可以支持的语法来实现的。javac编译一个文件的过程为:(参见javac编译文件过程

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

那么之前我的工作都是集中在Parser和Attribute上面的。添加新语法的时候,就是把Parser修改一下,使其能够识别新语法为一个新的节点,然后Annotation,Enter,Attribute基本不变,在Attribute过后可以获得类型等额外信息,然后对这个时候的AST运用一个Translator,把新语法转变为旧的语法。因此Flow和以后的过程都没有任何改变。

而这次是涉及到全过程的改变。这次我想实现的是这样的语法:

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的代码写过来的

3.修改Parser使其接受新的语法节点。将JCBlockExp作为一个term3.

4.修改Attribute中的visitBlockExp,把本来的result=null,仿照成其他expression的处理的结尾,变成result=check(...)

5.修改Generate中的visitBlockExp,本来block中所有的语句都是用genStat来生成代码的,而我只需要把最后一条语句用genExp来生成,前面的语句都不变

调试调试应该就可以了




转载于:https://my.oschina.net/superpdm/blog/100712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值