Antlr 4 получает (распечатывает) все деревья разбора, когда есть неоднозначность - PullRequest
0 голосов
/ 03 июня 2018

Рассмотрим следующую грамматику 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.

1 Ответ

0 голосов
/ 04 июня 2018

В этой маленькой грамматике нет двусмысленности.В e есть 2 альта, каждый с определенным путем.Двусмысленность может выглядеть примерно так:

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

Обновление

Для того, чтобыПолучайте уведомления всякий раз, когда обнаружена неоднозначность, срабатывает функция прослушивания ошибок reportAmbiguity.Переопределите это, чтобы сделать свою собственную обработку в этой ситуации.

...