2016-08-16 2 views
1

Я хотел бы иметь возможность написать «мета-правило» в ANTLR4, которое принимает правило в качестве входного аргумента и выполняет модификацию этого правила. Вот пример грамматики:Правила парсера ANTLR4 с другими правилами анализатора в качестве аргументов (мета-правила)

grammar G; 

WS: [ \t\n\r] + -> skip; 
CHAR: [a-z]; 
term: (CHAR)+; 
sum: term ('+' term)+; 
pterm: '(' term ')' | '(' pterm ')'; 
psum: '(' sum ')' | '(' psum ')'; 
expr: term | sum | pterm | psum; 

Правила pterm и psum выполняют те же действия на term и sum, заключая их в возможно вложенных скобок. Я хотел бы иметь возможность заменить последние три строки выше с чем-то вроде следующего:

enclose[rule]: '(' rule ')' | '(' enclose(rule) ')'; 
expr: term | sum | enclose(term) | enclose(sum); 

Есть ли способ построить мета-правила, как это?

ответ

1

Короткий ответ: нет.

Лучше разрешить рефакторинга грамматику и определения структурно значимые условия:

expr: LPAREN sum RPAREN | LPAREN expr RPAREN ; 
sum : term ('+' term)* ; // changed to Kleene star 
term: CHAR+ ; 

LPAREN : '(' ; 
RPAREN : ')' ; 
CHAR : [a-z] ; 
WS  : [ \t\n\r]+ -> skip ; 

sum правило будет потреблять все term с, поэтому expr правило нужно только обрабатывать sum с.

+0

Благодарим за проверку того, что это невозможно. Кажется, я пытался сделать слишком много в парсере. Я переписал (более сложный) парсер, чтобы быть более общим и переместил некоторые из того, что я пытался сделать с обработчиком парсера. – user2487951

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