Решение ANTLR Взаимно леворекурсивные правила - PullRequest
3 голосов
/ 24 августа 2010

правило 'expr' в грамматике ANTLR ниже явно взаимно-рекурсивно. Как новичку в ANTLR, мне сложно решить эту проблему. Я прочитал «Разрешение конфликтов без LL (*)» в справочнике ANTLR, но я до сих пор не вижу решения. Есть указатели?

LPAREN : ( '(' ) ;
RPAREN : ( ')' );
AND : ( 'AND' | '&' | 'EN' ) ;
OR : ( 'OR' | '|' | 'OF' );
NOT : ('-' | 'NOT' | 'NIET' );
WS :  ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;}  ;
WORD :  (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*;

input : expr EOF;
expr : (andexpr | orexpr | notexpr | atom);
andexpr : expr AND expr;
orexpr :  expr OR expr;
notexpr : NOT expr;
phrase : '"' WORD* '"';
atom : (phrase | WORD); 

1 Ответ

5 голосов
/ 24 августа 2010

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

Обычно вы можете сделать что-то вроде этого:

expr : andexpr;
andexpr : orexpr (AND andexpr)*;
orexpr : notexpr (OR orexpr)*;
notexpr : atom | NOT expr;

Ключ в том, что каждое выражение может заканчиваться атомом.

...