Рассмотрим следующую грамматику ANTLR 4:
grammar Test;
start: e EOF;
e : e '+' e #op
| NUMBER #atom
;
NUMBER: [0-9]+;
Исходя из правил устранения неоднозначности ANTLR, в этом случае бинарные операторы, оставленные ассоциативными, результат анализа строки 1+2+3
равен ((1+2) +3).Но возможно другое дерево анализа, а именно (1+ (2 + 3)), если вы не учитываете правило устранения неоднозначности ANTLR по умолчанию.
Есть ли способ получить оба разбирать деревья в ANTLR?Или, по крайней мере, включить флаг или что-то еще, чтобы он сказал мне, что было другое дерево разбора и, возможно, напечатало его?
Обновление Я понимаю, что в ANTLR,эта грамматика однозначна, потому что бинарные операторы всегда левоассоциативны, но я не мог придумать другой пример.Весь мой смысл в том, что я хотел бы получать предупреждение (или что-то подобное) всякий раз, когда ANTLR пытается устранить неоднозначность.Например, в старом добром Yacc (Bison), если у меня такая же грамматика:
s : e
;
e : e '+' e
| NUMBER
;
при генерации парсера, я получаю предупреждение State 6 conflicts: 1 shift/reduce
.