0
У меня есть проблема с этой грамматикой:ANTLR Программа прекращает чтение входного файла
//parser
macchinaTuring: { init();}
listaIstruzioni
{env.insertwarning();
}
;
listaIstruzioni : (istruzioni)+
;
istruzioni : (LP statoiniziale VI statofinale VI DIR RP PV (commento)? CAPO)
;
statoiniziale:s=STATE VI c=CHAR
{env.insertstatoiniziale($s, $c);}
;
statofinale: x=STATE VI y=CHAR
{env.insertstatofinale($x, $y);}
;
commento : BAR STRING
;
// lexer
LP : '(' ;
RP : ')' ;
VI : ',' ;
PV : ';' ;
DIR : ('='
| '<'
| '>'
)
;
BAR : '//' ;
CAPO : (('\r' '\n') | ('\n') | ('\r'));
CHAR : (('a'..'z')|('A'..'Z')) ;
STATE : ('0'..'9')+ ;
STRING: (('a'..'z')|('A'..'Z')|('0'..'9')|' ')* ;
ERROR : . ;
Я сделал тестовый класс, который анализирует входной файл, в котором каждая строка представляет собой предложение istruzioni
. Если символ LP отсутствует, программа не распознает новую строку и перестает читать. Как решить? Заранее спасибо
Я уже пробовал это и другие решения с EOF, но это не сработало. Если в начале строки нет LP, я получаю эту ошибку: 'строка 3: 0 \t отсутствует EOF в '1'' где 3 - номер строки без LP – RioMario
ANTLR 4 использует улучшенный механизм восстановления ошибок в этот конкретный случай, известный как «восстановление синхронизации» Jim Idle's «ошибка синхронизации». Если вы хотите эту функцию в ANTLR 3, вам нужно будет реализовать ее самостоятельно на протяжении всей грамматики (документация по этой функции для ANTLR 3 в лучшем случае разрежена, вы в основном сами по себе). Реализация ANTLR 4 упоминается в главе 9 окончательного ANTLR 4 Reference. –
Это действительно единственный способ решить эту проблему? Я не эксперт, использующий ANTLR, но с другими подобными грамматиками у меня никогда не было таких проблем. – RioMario