ANTLR3中的自定义初始化/清理

时间:2013-05-06 18:48:50

标签: java antlr3

我需要做自定义初始化&在我的大多数规则中清理。有没有办法避免@ init / finally块中的重复?

目前我的规则如下:

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

所以,我想要的是以某种方式声明“这条规则应该使这些标准的init / cleanup调用”没有复制粘贴@ init / finally块到处都是。

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

1 个答案:

答案 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变量,那么您需要使用某种预处理器来添加所有initsfinallys

就个人而言,我会复制并粘贴。通常解析器经历了很多前期开发,然后只获得小错误修正。无论你走到哪里都会有一定的麻烦。