2014-02-14 43 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