Подтвердить что ты не робот

Когда требуется EOF в ANTLR 4?

TestDriver в ANTLRWorks2 выглядит довольно придирчиво, когда он принимает грамматику без явного EOF а когда нет. Грамматика Hello в Руководстве по началу работы с ANTLR4 нигде не использует EOF, поэтому я сделал вывод, что по возможности лучше избегать явного EOF.

Какова наилучшая практика использования EOF? Когда вам это действительно нужно?

4b9b3361

Ответ 1

Вы должны включить явный EOF в конце вашего правила ввода каждый раз, когда вы пытаетесь разобрать весь входной файл. Если вы не включаете EOF, это означает, что вы не пытаетесь разобрать весь ввод, и допустимо разбирать только часть ввода, если это означает, что вы избегаете синтаксической ошибки.

Например, рассмотрим следующее правило:

file : item*;

Это правило означает "Разбирайте как можно больше элементов item, а затем остановитесь". Другими словами, это правило никогда не попытается восстановить из синтаксической ошибки, поскольку оно всегда будет считать, что синтаксическая ошибка является частью некоторой синтаксической конструкции, выходящей за рамки правила file. Синтаксические ошибки даже не сообщаются, потому что парсер просто остановится.

Если бы у меня было следующее правило:

file : item* EOF;

В означает "Файл состоит именно из последовательности элементов с нулем или более item". Если синтаксическая ошибка достигается при анализе элемента item, это правило попытается восстановить (и сообщить) синтаксическую ошибку и продолжить, поскольку требуется EOF и еще не достигнуто.


Для правил, в которых вы пытаетесь разобрать часть ввода, ANTLR 4 часто работает, но не всегда. Следующая проблема описывает техническую проблему, при которой ANTLR 4 не всегда принимает правильное решение, если EOF опущен.

https://github.com/antlr/antlr4/issues/118

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