解决ANTLR相互左递归规则

时间:2010-08-24 11:49:06

标签: antlr antlr3

下面的ANTLR语法中的'expr'规则显然是相互左递归的。作为一名ANTLR新手,很难解决这个问题。我在ANTLR参考书中读过“解决非LL(*)冲突”,但我仍然没有看到解决方案。有什么指针吗?

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 个答案:

答案 0 :(得分:5)

我建议看一下antlr网站上的示例语法。 java语法可以满足您的需求。

基本上你可以这样做:

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

关键是,每个表达式都可以结束为原子。