3

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

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

输入:expr EOF;
expr : (andexpr | orexpr | notexpr | atom);
andexpr : expr 和 expr;
orexpr : expr 或 expr;
notexpr : 不是 expr;
短语:'"' WORD* '"';
原子:(短语|字);
4

1 回答 1

5

我建议看一下 antlr 网站上的示例语法。java语法做你想做的事。

基本上你可以这样做:

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

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

于 2010-08-24T11:59:01.103 回答