Генерация конкретных предупреждений / сообщений об ошибках из прослушивателя Antlr4

Я использую Antlr4 для токенизации и анализа устаревшего языка, моя конечная цель - сгенерировать код C # и выполнить этот код в среде выполнения, которая имитирует физическое оборудование, которое выполняет устаревший язык.

Симулятор и генерация кода работают очень хорошо.

Я хотел бы генерировать определенные сообщения об ошибках или предупреждающие сообщения от слушателя, возможно ли это?

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

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

Спасибо, Грегг


person Gregg Swanson    schedule 17.07.2015    source источник


Ответы (1)


Вероятно, лучшим подходом было бы выдавать предупреждения от парсера. В построении парсера есть два метода:

parser.addErrorListener(new YourErrorListener());
parser.setErrorHandler(new YourParserErrorStrategy());

Слушатель ошибок позволяет настраивать сообщения об ошибках. Стратегия ошибок определяет, как анализатор работает с конкретными ошибками: повторная синхронизация с потоком токенов или эффективная вставка «отсутствующих» токенов.

person GRosenberg    schedule 17.07.2015
comment
Вы предлагаете, чтобы я потребовал; в конце строки. Если в строке отсутствует точка с запятой, я бы добавил точку с запятой и выдал собственное сообщение об ошибке. Я попробую. - person Gregg Swanson; 18.07.2015
comment
Если наличие точки с запятой (или другого «необычного» токена обстоятельств) делает последующий анализ дерева синтаксического анализа более простым / регулярным, сделайте его необязательным (угадайте, это то, что вы имели в виду под запросом) и добавьте его, если он отсутствует. Также можно пойти другим путем: пропустить лишние / неожиданные токены в зависимости от того, определяет ли ErrorStrategy, они значимы или нет - он может предупреждать, исправлять или освобождать. - person GRosenberg; 18.07.2015