当有歧义时,Antlr 4获取(打印)所有解析树

时间:2018-06-03 19:49:26

标签: antlr antlr4 ambiguity

考虑以下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

1 个答案:

答案 0 :(得分:0)

这个小语法没有任何不公正。 e中有2个alts具有明确的路径。一个ambiquity将是这样的:

e = a b | a c;

解析器需要一些前瞻来确定要采用的路径。但回到你的解析树问题。你想要的是定义一个不同的关联性。通常,默认情况下,所有运算符都是左关联的,从而导致此解析树:

enter image description here

将运算符+定义为右关联,如下所示:

grammar Example;

start: e EOF;

e : <assoc=right> e '+' e     #op
  | NUMBER      #atom
;

NUMBER: [0-9]+;

导致:

enter image description here

<强>更新

为了在发现ambiquity时收到通知,您的错误侦听器reportAmbiguity功能会被触发。在这种情况下,覆盖它以进行自己的处理。