Antlr4 соответствует всей входной строке или перебору

Я новичок в Antlr4 и уже несколько дней ломаю голову над поведением, которое я просто не понимаю. У меня есть следующая комбинированная грамматика, и я ожидаю, что она завершится ошибкой и сообщит об ошибке, но это не так:

grammar MWE;
parse: cell EOF;
cell: WORD;
WORD: ('a'..'z')+;

Если я подам ему ввод

a4

Я ожидаю, что он не сможет его проанализировать, потому что я хочу, чтобы он соответствовал всей входной строке, а не только ее части, как это обозначено EOF. Но вместо этого он не сообщает об ошибке (я прослушиваю ошибки с помощью прослушивателя ошибок, реализующего интерфейс IAntlrErrorListener) и дает мне следующее дерево синтаксического анализа:

(parse (cell a) <EOF>)

Почему это?


person RobV    schedule 10.11.2014    source источник


Ответы (1)


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

a

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

ErrChar
  : .
  ;
person Sam Harwell    schedule 10.11.2014