0

我需要在我的大部分规则中进行自定义初始化和清理。有什么方法可以避免 @init/finally 块中的重复?

目前我的规则如下:

rule
@init { int mark = init(); } // Don't want to duplicate this!
...
;
finally { cleanup(mark); } // ... and that!

所以,我想要以某种方式声明“这条规则应该进行这些标准的初始化/清理调用”,而不是到处复制粘贴 @init/finally 块。

我正在使用 ANTLR3,目标语言是 Java。

4

1 回答 1

1

用 ANTLR 3 做你想做的事并没有一种直接的方法。你甚至不能对生成的解析器进行子类化,因为所有的规则方法都被声明为 final。

可能最容易维护的是预处理或代码注入。如果代码(如您的示例中所示)从未真正被规则操作使用,那么您可以使用 AspectJ http://www.eclipse.org/aspectj/或 Spring AOP http://之类的代码注入来做到这一点static.springsource.org/spring/docs/2.0.x/reference/aop.html。如果您的规则将访问mark变量更复杂,那么您需要使用某种预处理器来添加所有的initsand finallys

就个人而言,我会复制和粘贴。一般来说,解析器经过大量的前期开发,然后只得到小的错误修正。无论你去哪里都会有一定的麻烦。

于 2013-05-07T05:33:01.810 回答