Отсутствующее определение правила в ANTLR4

Я взламывал свою грамматику ANTLR4, пытаясь устранить все ее двусмысленности, ошибки правил лексера за раз. Кажется, ничто из того, что я делаю, не решает проблемы. В частности, эти правила лексера, которые вызывают у меня ту же ошибку, следующие:

Identifier: Letter (Letter | Digit | Und)+;
Keyword   : Letter+;
Param: Number | Identifier;
Statement: Keyword Lpr Param+ Rpr;
Block: Lbc Statement+ Rbc;

Как вы могли заметить, у всех них есть общий токен Letter. Этот и другие токены определяются как:

fragment Digit: '0'..'9';
fragment Letter: ('A'..'Z');
Und: '_';
Lpr: '(';
Rpr: ')';

Я не могу найти, как это могло вызвать двусмысленность, если только ANTLR не допускает множественное определение с потенциально идентичными результатами.


person Geoffrey Carlton    schedule 12.04.2017    source источник


Ответы (1)


Только ANTLR (действительно) работает с однозначной грамматикой. Разрешены определенные левые рекурсии, а для обработки / устранения двусмысленностей можно использовать предикаты и режимы лексического анализатора.

Однако ANTLR allow for multiple definition with potentially identical outcomes.

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

person GRosenberg    schedule 12.04.2017
comment
Спасибо, что прояснили это для меня. К сожалению, это означает, что мой первоначальный вопрос все еще в силе. Что может быть причиной того, что все эти правила выдают одну и ту же ошибку? - person Geoffrey Carlton; 12.04.2017
comment
Все правила, которые в конечном итоге зависят от Keyword, который полностью затенен, выйдут из строя с той же ошибкой (Number, похоже, не определен). Простое переключение порядка Identifier и Keyword не сработает (все идентификаторы, содержащие только буквы, будут использоваться как ключевые слова). Обычно ключевые слова указываются явно, за ними следует правило перебора, такое как правило Identifier; это означает, что любой Letter+, явно не названный в качестве ключевого слова, является идентификатором. - person GRosenberg; 13.04.2017
comment
Теперь я понял. Проблема в том, что я пытаюсь определить грамматику, которая позволяет определять дополнительные ключевые слова (ключевые слова в основном будут именами функций), поэтому я пытался определить только синтаксис в лексере и определить семантику в анализаторе. - person Geoffrey Carlton; 13.04.2017
comment
Итак, все сводится к классической проблеме ключевых слов и идентификаторов. Об этом уже говорилось несколько раз. Используйте предпочитаемую вами поисковую систему, чтобы найти возможные решения (включая мое собственное обсуждение в списке рассылки ANTLR). - person Mike Lischke; 13.04.2017
comment
Имена функций на самом деле не являются ключевыми словами (из точки зрения грамматики). Это идентификаторы, которые структурно идентифицируются в правилах синтаксического анализатора как представляющие имена функций. Точно так же переменные являются идентификаторами, но появляются в различных структурных отношениях, как определено в их собственных правилах синтаксического анализатора. Результирующее дерево синтаксического анализа предоставляет явную (и простую в использовании) основу для различения типа идентификатора. - person GRosenberg; 13.04.2017