Antlr4 съответства на целия входен низ или бюст

Аз съм нов в Antlr4 и от няколко дни си разбивам мозъка за поведение, което просто не разбирам. Имам следната комбинирана граматика и очаквам да се провали и да докладва грешка, но не се случва:

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

Ако го захраня с входа

a4

Очаквам да не може да го анализира, защото искам да съответства на целия входен низ, а не само на част от него, както е обозначено с EOF. Но вместо това не съобщава за грешка (слушам за грешки с errorlistener, внедряващ интерфейса IAntlrErrorListener) и ми дава следното дърво за анализ:

(parse (cell a) <EOF>)

Защо е това?


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


Отговори (1)


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

a

Решението е да инструктирате лексера да създаде токен за изпуснатия знак, вместо да го игнорира, и да прехвърлите този токен към анализатора, където ще бъде докладвана грешка. В граматиката това правило приема следната форма и винаги се добавя като последно правило в граматиката. Ако имате няколко режима на лексер, правило с този формуляр трябва да се показва като последно правило в режима по подразбиране, както и като последно правило във всеки допълнителен режим.

ErrChar
  : .
  ;
person Sam Harwell    schedule 10.11.2014