求解ANTLR互左递归规则

求解ANTLR互左递归规则,antlr,antlr3,Antlr,Antlr3,下面ANTLR语法中的“expr”规则显然是相互左递归的。作为一名ANTLR新手,我很难找到解决这个问题的方法。我在ANTLR参考书中读过“解决非LL(*)冲突”,但我仍然没有看到解决方案。有什么建议吗 LPAREN : ( '(' ) ; RPAREN : ( ')' ); AND : ( 'AND' | '&' | 'EN' ) ; OR : ( 'OR' | '|' | 'OF' ); NOT : ('-' | 'NOT' | 'NIET' ); WS : ( ' ' | '\t' |

下面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); LPAREN:('('); RPAREN:(“)”; 和:(‘AND’|’&‘EN’); 或:(“或”|“|”|“OF”); 不:(“-”|“不”|“涅特”); WS:(“”|’\t’|’\r’|’\n’{$channel=HIDDEN;}; 单词:(~(“|”\t“|”\r“|”\n“|”(“|”)“|””)*; 输入:expr-EOF; expr:(andexpr | orexpr | notexpr | atom); andexpr:expr和expr; orexpr:expr或expr; 注xpr:非expr; 短语:““‘单词*””; 原子:(短语|词);
我建议您看看antlr站点上的示例语法,java语法可以满足您的需要

基本上你可以这样做:

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

关键是,每个表达式都可以最终成为一个原子。

谢谢你的回答。我的问题是,这个解决方案的解析树看起来很奇怪:每个原子都有一个notexpr作为父级,即使它不是真正的notexpr。可能LL(*)解析器不是此类解析的最佳解决方案?对于此类语法,LL解析器没有任何问题(使用此类表达式非常常见)。如果生成AST,则可以使用重写规则创建不包含“超流”的AST“家长们。@Arne我在寻找解决原始海报上同样问题的方法时,偶然发现了你的答案。我发现您的代码中有一点输入错误:第一行应该是
expr:andexpr
,而不是
expr:andexp
。我自己无法编辑它,因为出于某些原因,我需要更改超过6个字符才能接受编辑。你能自己修改它吗?这样像我这样不知情的复制粘贴者会遇到同样的编译错误吗?