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,我收到這個錯誤: 'line 3:0 \t在'1''處丟失EOF 其中3是沒有LP的行的編號 – RioMario
ANTLR 4使用改進的錯誤恢復機制這種特定的情況稱爲「Jim Idle的魔術同步」錯誤恢復。如果你想在ANTLR 3中使用這個特性,你需要在整個語法中自己實現它(ANTLR 3的這個特性的文檔最好是稀少的,你基本上是自己的)。 ANTLR 4實現在最終ANTLR 4參考文獻的第9章中提到。 –
這真的是解決這個問題的唯一方法嗎?我不擅長使用ANTLR,但與其他類似的語法我從來沒有遇到過這種麻煩。 – RioMario