解决ANTLR互左递归规则 [英] Solving ANTLR Mutually left-recursive rules
本文介绍了解决ANTLR互左递归规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面ANTLR语法中的'expr'规则显然是相互左递归的.作为一个 ANTLR 新手,我很难解决这个问题.我已经阅读了 ANTLR 参考书中的解决非 LL(*) 冲突",但我仍然没有看到解决方案.有什么指点吗?
<前>LPAREN : ( '(' ) ;RPAREN : ( ')' );AND :( 'AND' | '&' | 'EN' ) ;或 :( '或' | '|' | 'OF' );不是 : ('-' | 'NOT' | 'NIET' );WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;字 : (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*;输入:expr EOF;expr : (andexpr | orexpr | notexpr | atom);andexpr : expr AND expr;orexpr : expr 或 expr;notexpr : 不是 expr;短语:'"' WORD* '"';原子:(短语|单词); 解决方案
我建议查看 antlr 站点上的示例语法.Java 语法可以满足您的需求.
基本上你可以这样做:
expr : andexpr;andexpr : orexpr (AND andexpr)*;orexpr : notexpr (OR orexpr)*;notexpr : 原子 |不是 expr;
关键是,每个表达式都可以以原子结尾.
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);
解决方案
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:
expr : andexpr;
andexpr : orexpr (AND andexpr)*;
orexpr : notexpr (OR orexpr)*;
notexpr : atom | NOT expr;
The key is, that every expression can end to be an atom.
这篇关于解决ANTLR互左递归规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文