2013-05-06 25 views
0

我需要在我的大部分規則中進行自定義初始化&清理。有沒有辦法避免@ init/finally塊中的重複?在ANTLR3中自定義初始化/清除

目前我的規則是這樣的:

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

所以,我要的是申報莫名其妙無處不在「這一規則應使這些標準的init /清除呼叫」沒有複製粘貼@ INIT/finally塊。

我使用的是ANTLR3,目標語言是Java。

+0

你的目標語言是什麼? – 2013-05-06 20:49:29

+0

@ 280Z28目標語言是Java。 – 2013-05-07 00:04:10

+0

什麼是init()/ cleanup()在幹什麼?可能還有其他的東西你可以做整體 – 2013-05-07 05:29:30

回答

1

有沒有一種簡單的方法可以用ANTLR 3來做你想做的事情,你甚至不能對生成的解析器進行子類化,因爲所有的規則方法都被聲明爲final。

可能最容易維護的是預處理或代碼注入。如果您的示例中的代碼從未真正被規則操作使用過,那麼您可以使用AspectJ http://www.eclipse.org/aspectj/或Spring AOP http://static.springsource.org/spring/docs/2.0.x/reference/aop.html等代碼注入來完成此操作。如果你的規則更復雜,那麼你需要使用某種預處理器來添加所有的initsfinallys

個人而言,我會複製並粘貼。一般來說,解析器經歷了大量的前期開發,然後只得到小的錯誤修正。任何你去那裏的方式都會有一定的麻煩。