下面的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);
答案 0 :(得分:5)
我建议看一下antlr网站上的示例语法。 java语法可以满足您的需求。
基本上你可以这样做:
expr : andexpr;
andexpr : orexpr (AND andexpr)*;
orexpr : notexpr (OR orexpr)*;
notexpr : atom | NOT expr;
关键是,每个表达式都可以结束为原子。