Bison - recover from If Else error

大兔子大兔子 提交于 2019-12-25 02:56:10

问题


I'm trying to recover from an error in an If-Else statement. In my grammar an If is always followed by an Else.

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

The error found is in the commented else in the last lines:

public boolean Equal(Element other){

    if (!this.Compare(aux01,Age))
        ret_val = false ;
    //else 
        //nt = 0 ;
}

error: syntax error, unexpected CBRACES, expecting ELSE -> } @ line 29

It is not recovering from that error ignoring the errors that come after.

Maybe i'm not understanding well how this error works but i can only find 2 examples on every site about error recovery: "error '\n'" and "'(' error ')'"

Anyone have an idea how to recover from this error (when an if is not followed by an else).

Thanks


回答1:


You've provided not enough context to know exactly, but my guess is that the lexer/tokenizer, which feeds tokens to your parser, skips white space - including '\n'. So the parser never sees the newline and b/c of that never reduces the

IF OPAR exp CPAR statement error '\n'

production and so its action

{ yyerrok; yyclearin;}

never gets executed and so the error is not recovered.




回答2:


Probably (although it is hard to say for sure without seeing more of the grammar) you don't need to skip any tokens in the case that else is not found.

The most likely case is that the program is simply lacking an else clause (perhaps because its author is used to other programming languages in which else is optional), and parsing can simply continue as though there were an empty else clause. So you should be able to just use:

IF OPAR exp CPAR statement error       { yyerrok; }

(Note: I removed yyclearin because you almost certainly don't want to do that. In the case of the error in the OP, the result would be to ignore the '}' token, leading to extraneous errors later in the parse.)

You probably should take advantage of the action in this error production to produce a clear error message ("if statements must have else clauses"), although the default message is reasonably clear as well.

It is certainly the case that whatever token(s) are used as error context must be produceable by the scanner. That generally precludes error recovery techniques such as "skip to the end of the line", except in the case of languages in which newlines are syntactically significant.




回答3:


I found out the problem. Thanks for the help anyway.

I put the error inside the braces and now is working.

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


来源:https://stackoverflow.com/questions/29514355/bison-recover-from-if-else-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!