Antlr совпадение ввода с ошибкой нескольких альтернатив - PullRequest
5 голосов
/ 28 июня 2011

Я получаю предупреждение, когда antlr v3.1 компилируется по этому правилу

 sentence
:
(CAPITAL_LETTERS_AND_NUMBERS | INT | ANY_WORD ) 
(
    INT
| CAPITAL_LETTERS_AND_NUMBERS
| ANY_WORD 
)*;

Предупреждение:

 5:2: Decision can match input such as "CAPITAL_LETTERS_AND_NUMBERS" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.
 Decision can match input such as "INT" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.

Причина, по которой я запутался, - это грамматика, котораяпроходит довольно сложно, пока я не помещу другую подправилу в другое место в файле, который также использует предложение.Он принимает вышеуказанное правило, пока это не произойдет, что кажется странным.Я ищу подсказки о том, как лучше всего отладить и понять, как это может произойти?

Спасибо, Ричард

1 Ответ

10 голосов
/ 28 июня 2011

Это сложно.Особенно с большими грамматиками, изменение (или добавление) правил может вызвать неоднозначности, которые трудно отследить.

ANTLRWorks может помочь найти эти двусмысленности.Учитывая следующую грамматику:

grammar T;

parse
  :  other? WORD? EOF
  ;

other
  :  WORD
  ;

WORD
  :  ('a'..'z' | 'A'..'Z')+
  ;

парсер не знает, как правильно обрабатывать правило parse.Входные данные, такие как foo (один WORD токен), могут совпадать с other EOF и с WORD EOF, что является предупреждением:

Решение может совпадатьввод, такой как «WORD» с использованием нескольких альтернатив

означает.

Генерация синтаксического анализатора и лексера с использованием ANTLRWorks приводит к следующей визуализации проблемы:

enter image description here

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

...