Это сложно.Особенно с большими грамматиками, изменение (или добавление) правил может вызвать неоднозначности, которые трудно отследить.
ANTLRWorks может помочь найти эти двусмысленности.Учитывая следующую грамматику:
grammar T;
parse
: other? WORD? EOF
;
other
: WORD
;
WORD
: ('a'..'z' | 'A'..'Z')+
;
парсер не знает, как правильно обрабатывать правило parse
.Входные данные, такие как foo
(один WORD
токен), могут совпадать с other EOF
и с WORD EOF
, что является предупреждением:
Решение может совпадатьввод, такой как «WORD» с использованием нескольких альтернатив
означает.
Генерация синтаксического анализатора и лексера с использованием ANTLRWorks приводит к следующей визуализации проблемы:
Да, я понимаю, что это всего лишь тривиальный пример, и что ваша проблема немного сложнее, но здесь, на самом деле, нет Святого Грааля.Если бы вы могли опубликовать грамматику, которая генерирует синтаксический анализатор и лексер без проблем и отредактированную грамматику, которая выдает эти предупреждения, я мог бы взглянуть на нее, чтобы увидеть, вижу ли я проблему.