Кажется, это ошибка, появившаяся в версии 3.3 (и выше).При создании синтаксического анализатора из вашей грамматики ANTLR 3.2 выдает следующую ошибку:
warning (205): Test.g: 31: 2: ANTLR не удалось проанализировать это решение на предмет равенства правил;часто это происходит из-за рекурсивных ссылок на правила, видимых с левого края альтернатив.ANTLR повторно проанализирует решение с фиксированным прогнозом k = 1.Подумайте об использовании «options {k = 1;}» для этого решения и, возможно, добавьте синтаксический предикат.ошибка (10): внутренняя ошибка: org.antlr.tool.Grammar.createLookaheadDFA (Grammar.java:1279): не удалось даже сделать k = 1 для решения 6;причина: истекло время ожидания (> 1000 мс)
Мне кажется, вы использовали грамматику LR в качестве основы для своей грамматики ANTLR.Подумайте о том, чтобы начать сначала, но потом с разбором LL.Взгляните на следующие вопросы и ответы, чтобы узнать, как анализировать выражения с помощью ANTLR: ANTLR: простой пример?
Кроме того, я вижу, что вы используете несколько токенов, которые выглядят ужасноочень похожи друг на друга: LETTER
, CHAR
, SENTENCE
и IDENTIFIER
.Вы должны понимать, что если все они могут начинаться, например, со строчной буквы, то будет найдено только одно из правил (то, которое соответствует большинству, или, в случае связи, то, которое определено первым в грамматике лексера),Лексер не создает токены на основе того, о чем «запрашивает» синтаксический анализатор, он создает токены независимо от синтаксического анализатора.
Наконец, для простого синтаксического анализатора выражений вам действительно не нужнопредикаты (и backtrack=true
заставляет ANTLR автоматически вставлять предикаты перед всеми правилами синтаксического анализатора!).