AntlrWorks и ошибки грамматики языка - PullRequest
1 голос
/ 03 декабря 2010

Работа над игровым проектом, включающим язык сценариев, который я хочу интерпретировать в код виртуальной машины, который может быть выполнен напрямую.Я включил грамматику ниже.Все правила лексера правильно отображаются на синтаксической диаграмме, но когда я щелкаю по телам любого из правил синтаксического анализатора, я получаю «Невозможно отобразить правило« X », потому что начальное состояние не найдено» для данного правила синтаксического анализатора X.

Я не совсем уверен, почему ANTLR жалуется на отсутствие начального состояния.Грамматика должна начинаться с кодовой строки, на которую не ссылается никакое другое правило синтаксического анализатора.Кроме того, поле в правом верхнем углу зеленого цвета, что указывает на отсутствие синтаксических ошибок.

Я пролистал некоторые другие сообщения на доске объявлений, а также многие грамматики, представленные в примере загрузки грамматики ANTLRv3,но ни у одного из них нет специального кода, который указывает ANTLR, какое из правил синтаксического анализа является начальным состоянием.Я чувствую, что что-то простое сломано, но я нахожусь в тупике относительно того, что именно это.

Любой совет или помощь будет принята с благодарностью!Даже если это просто в духе «иди и прочитай это».

grammar RobotWarsGrammar;



EQUAL
options {
    paraphrase = "=";
}
   : '='
   ;

1 Ответ

2 голосов
/ 04 декабря 2010

Если вы используете ANTLR 3.x.

Все это:

options {
    paraphrase = ...;
}

материал - это (AFAIK) старый синтаксис ANTLR 2 - попробуйте удалить его.

Кроме того, ! в вашем comment правиле:

comment
  :  !(DIGIT | LETTER | SPACE)*
  ;

является оператором перезаписи дерева ( см. Шпаргалку ). Но это работает только тогда, когда у вас есть:

options { 
  output=AST;
}

в вашей грамматике (чего вы не делаете). Итак, удалите это ! из вашего правила comment. Если вы не хотите совпадать с литералом !, в этом случае вам нужно заключить в него одинарные кавычки:

comment
  :  '!' (DIGIT | LETTER | SPACE)*
  ;
...