2013-05-06 3 views
0

Мне нужно выполнить пользовательскую инициализацию & в большинстве моих правил. Есть ли способ избежать дублирования в блоках @ init/finally?Пользовательская инициализация/очистка в ANTLR3

В настоящее время мои правила похожи:

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

Итак, что я хочу, чтобы объявить как-то «это правило должно сделать эти стандартные вызовы инициализации/очистки» без копирования вставки @ инициализации/наконец блоков везде.

Я использую ANTLR3, а целевой язык - Java.

+0

Какой у вас целевой язык? –

+0

@ 280Z28 целевой язык - это Java. –

+0

Что такое init()/cleanup()? Возможно, что-то еще можно сделать в целом. –

ответ

1

Существует нет простого способа сделать то, что вы хотите с ANTLR 3. Вы даже не могли подклассифицировать созданный парсер, потому что все правила правил объявлены окончательными.

Возможно, самым простым в обслуживании будет либо предварительная обработка, либо ввод кода. Если код, как и в вашем примере, никогда не используется действиями правил, то вы можете сделать это с помощью инъекции кода, например AspectJ http://www.eclipse.org/aspectj/ или Spring AOP http://static.springsource.org/spring/docs/2.0.x/reference/aop.html. Если это сложнее в том, что ваши правила будут обращаться к переменной mark, тогда вам нужно будет использовать какой-то препроцессор, чтобы добавить все inits и finallys.

Лично я бы скопировал и вставлял. Как правило, синтаксические анализаторы проходят много начального развития, а затем получают лишь незначительные исправления. Любой путь, по которому вы идете туда, будет иметь определенное количество хлопот с ним.

Смежные вопросы