考虑以下ANTLR 4语法:
grammar Test;
start: e EOF;
e : e '+' e #op
| NUMBER #atom
;
NUMBER: [0-9]+;
根据ANTLR的消歧规则,在这种情况下,二元运算符是左关联的,解析字符串1+2+3
的结果是((1 + 2)+3)。但是如果你不考虑ANTLR的默认消歧规则,还有另一个解析树,即(1+(2 + 3))。
有没有办法在ANTLR中获取两个解析树?或至少启用一个标志或其他东西,以便它告诉我有另一个解析树并可能打印它?
更新 我理解在ANTLR中,这个语法是明确的,因为二元运算符总是左关联的,但我无法想出另一个例子。我的全部观点是,当ANTLR试图解决歧义时,我想得到一个警告(或类似的东西)。例如,在古老的Yacc(Bison)中,如果我有相同的语法:
s : e
;
e : e '+' e
| NUMBER
;
生成解析器时,我收到警告State 6 conflicts: 1 shift/reduce
。
答案 0 :(得分:0)
这个小语法没有任何不公正。 e
中有2个alts具有明确的路径。一个ambiquity将是这样的:
e = a b | a c;
解析器需要一些前瞻来确定要采用的路径。但回到你的解析树问题。你想要的是定义一个不同的关联性。通常,默认情况下,所有运算符都是左关联的,从而导致此解析树:
将运算符+
定义为右关联,如下所示:
grammar Example;
start: e EOF;
e : <assoc=right> e '+' e #op
| NUMBER #atom
;
NUMBER: [0-9]+;
导致:
<强>更新强>
为了在发现ambiquity时收到通知,您的错误侦听器reportAmbiguity
功能会被触发。在这种情况下,覆盖它以进行自己的处理。