2014-02-14 3 views
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 отсутствует, программа не распознает новую строку и перестает читать. Как решить? Заранее спасибо

ответ

0

Правило начала должно заканчиваться явным EOF, которое сообщает ANTLR продолжить чтение в конец файла.

macchinaTuring 
: { init();} 
    listaIstruzioni 
    EOF // <-- add this 
    {env.insertwarning();} 
; 
+0

Я уже пробовал это и другие решения с EOF, но это не сработало. Если в начале строки нет LP, я получаю эту ошибку: 'строка 3: 0 \t отсутствует EOF в '1'' где 3 - номер строки без LP – RioMario

+0

ANTLR 4 использует улучшенный механизм восстановления ошибок в этот конкретный случай, известный как «восстановление синхронизации» Jim Idle's «ошибка синхронизации». Если вы хотите эту функцию в ANTLR 3, вам нужно будет реализовать ее самостоятельно на протяжении всей грамматики (документация по этой функции для ANTLR 3 в лучшем случае разрежена, вы в основном сами по себе). Реализация ANTLR 4 упоминается в главе 9 окончательного ANTLR 4 Reference. –

+0

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