как сообщить об ошибке для неопределенной грамматики, определенной с помощью anltr - PullRequest
0 голосов
/ 07 марта 2019

Я сейчас пытаюсь импровизировать / исправить ошибку в существующей грамматике, созданной кем-то другим.

У нас есть собственный язык, для которого мы создали редактор. Мы используем eclipse ide.

Некоторые примеры грамматики, такие как

calc : choice INTEGER INTEGER

choice : add|sub|div|mul

INTEGER :   ('0'..'9')+ 

Так что в моем редакторе, если я наберу

calc add 2 aaa

Таким образом, анализатор ошибок antlr распознает его как ошибку, так как он ожидает целое число, и мы ввели строку и выдают сообщение об ошибке, например

extraneous input 'aaa' expecting {'{', INTEGER}"

(у меня мой класс расширяет BaseErrorListener, где я создаю маркеры для этих ошибок)

Точно так же у меня есть такая грамматика для моего редактора.

Теперь вопрос: для всего этого он определяет, что что-то не так в синтаксисе, и выдает ошибки, но что за синтаксис, который не является частью грамматики, такой как

Если я введу какое-либо значение мусора, например

abc add 2 3 

или

just_type_junk_in_editor

не выдает никакой ошибки, поскольку ‘abc’ или ‘just_type_junk_in_editor‘ не входит в мою грамматику

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

1 Ответ

0 голосов
/ 08 марта 2019

Не видя полной грамматики, я думаю, что ваша проблема в том, что в вашем основном правиле отсутствует токен EOF.ANTLR4 потребляет столько данных, сколько может, но если он не соответствует чему-либо хотя бы в основном правиле, он игнорирует остальные, что объясняет, почему вы не видите ошибку.Добавляя EOF, вы сообщаете ANTLR4, что все входные данные должны совпадать:

calc: choice INTEGER INTEGER EOF;
...