解决ANTLR互左递归规则
下面的 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);
the 'expr' rule in the ANTLR grammar below obviously mutually left-recursive. As a ANTLR newbie it's difficult to get my head around solving this. I've read "Resolving Non-LL(*) Conflicts" in the ANTLR reference book, but I still don't see the solution. Any pointers?
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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我建议查看 antlr 网站上的示例语法。 java语法可以满足你的要求。
基本上你可以做这样的事情:
关键是,每个表达式最终都可以成为一个原子。
I would suggest to have a look at the example grammers on the antlr site. The java grammar does what you want.
Basicly you can do something like this:
The key is, that every expression can end to be an atom.