我正在尝试使用Javacc编写用于词法和语法错误恢复的语法,但是我不知道如何使用error_skipto()语法。我首先试图仅从多行print()或in我的语言“ syout()”语句,以了解其工作原理并将其应用于其余的语法,但是我无法获得我期望的输出,而且,我的try-catch语句无法捕获TokenMnger
我在其中声明语法的错误,而被我的解析器类的主函数中声明的错误捕获
用我的语言编写的源代码的结构看起来像这样
//source code
start
syout(1)~
syout(2)
syout(3)
syout(4)~
over
//source code
//the "~" symbol is the line-end indicator,and "start" and "over" delimits
//the "main function"
我连续3次出现语法错误
下面是我对syout()语句的语法,将“〜”符号和异常传递给error_skip()语法
void imprimir():
{}
{
try{
<DATA_OUT><OPEN_PAREN>(<NUM_INT>|
<NUM_FLOAT>|<CHAR>|<STRING>|<IDENTIFIER>)
<CLOSE_PAREN><LINE_END>
}catch(ParseException e){
error_skipto(LINE_END, e);
}catch(TokenMgrError err){
error_skipto2(LINE_END,err);
}
}
我正在使用Javacc文档中的error_skipto()语法,并添加了一个用于输出确切错误消息的参数
JAVACODE
void error_skipto(int kind, ParseException ex){
System.out.println(ex.toString());
Token t;
do {
t=getNextToken();
} while (t.kind!=kind);
}
对于此源代码,我应该从解析器中得到3条错误消息,但我只会得到一条,第一个。但是当我产生非连续错误时,我会得到所有错误。此外,如果我产生一个词法错误,它不会被捕获在语法的try-catch块中,而是会被捕获在我的解析器类内部的main函数中。