2014-02-14 45 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,我收到这个错误: 'line 3:0 \t在'1''处丢失EOF 其中3是没有LP的行的编号 – RioMario

+0

ANTLR 4使用改进的错误恢复机制这种特定的情况称为“Jim Idle的魔术同步”错误恢复。如果你想在ANTLR 3中使用这个特性,你需要在整个语法中自己实现它(ANTLR 3的这个特性的文档最好是稀少的,你基本上是自己的)。 ANTLR 4实现在最终ANTLR 4参考文献的第9章中提到。 –

+0

这真的是解决这个问题的唯一方法吗?我不擅长使用ANTLR,但与其他类似的语法我从来没有遇到过这种麻烦。 – RioMario