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