Bison-从If Else错误中恢复



我正试图从If Else语句中的错误中恢复。在我的语法中,If后面总是跟一个Else。

statement:      OBRACES statements CBRACES
    |       IF OPAR exp CPAR statement ELSE statement
    |       IF OPAR exp CPAR statement error 'n'       { yyerrok; yyclearin;}
    ;

发现的错误在最后一行的注释中:

public boolean Equal(Element other){
    if (!this.Compare(aux01,Age))
        ret_val = false ;
    //else 
        //nt = 0 ;
}

错误:语法错误,意外的CBRACES,应为ELSE->}@行29

它并没有从错误中恢复,忽略了随后出现的错误。

也许我不太了解这个错误是如何工作的,但我只能在每个网站上找到两个关于错误恢复的例子:"错误'\n'"one_answers"'('error')'"

任何人都知道如何从这个错误中恢复(当if后面没有else时)。

感谢

您没有提供足够的上下文来准确地知道,但我的猜测是,向解析器提供令牌的lexer/tokenizer跳过了空白,包括'\n'。所以解析器永远不会看到换行符,而它的b/c永远不会减少

IF OPAR exp CPAR statement error 'n'

生产及其作用

{ yyerrok; yyclearin;}

永远不会被执行,因此错误不会被恢复。

在找不到else的情况下,您可能不需要跳过任何标记(尽管在没有看到更多语法的情况下很难说)。

最有可能的情况是,程序只是缺少else子句(可能是因为它的作者习惯于else是可选的其他编程语言),解析可以简单地继续,就像有一个空的else子句一样。所以你应该能够使用:

IF OPAR exp CPAR statement error       { yyerrok; }

注意:我删除了yyclearin,因为你几乎肯定不想这么做。如果OP中出现错误,结果将忽略"}"标记,从而在稍后的解析中导致无关错误。)

您可能应该利用这个错误生成中的操作来生成一个清晰的错误消息("if语句必须具有else子句"),尽管默认消息也相当清晰。

当然,无论使用什么令牌作为错误上下文,都必须由扫描仪生成。这通常排除了诸如"跳到行的末尾"之类的错误恢复技术,但换行符具有语法意义的语言除外。

我发现了这个问题。无论如何,谢谢你的帮助。

我把错误放在括号里,现在正在工作。

statement:      OBRACES statements CBRACES
    |           OBRACES error CBRACES             { yyerrok; yyclearin;}
    |           IF OPAR exp CPAR statement ELSE statement
    ;

最新更新