我需要做自定义初始化&在我的大多数规则中清理。有没有办法避免@ init / finally块中的重复?
目前我的规则如下:
rule
@init { int mark = init(); } // Don't want to duplicate this!
...
;
finally { cleanup(mark); } // ... and that!
所以,我想要的是以某种方式声明“这条规则应该使这些标准的init / cleanup调用”没有复制粘贴@ init / finally块到处都是。
我使用的是ANTLR3,目标语言是Java。
答案 0 :(得分: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
变量,那么您需要使用某种预处理器来添加所有inits
和finallys
。
就个人而言,我会复制并粘贴。通常解析器经历了很多前期开发,然后只获得小错误修正。无论你走到哪里都会有一定的麻烦。