如何编写用于词汇和语法错误恢复的语法?

时间:2019-05-19 06:31:33

标签: compiler-construction javacc

我正在尝试使用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函数中。

0 个答案:

没有答案