如何防止 Bison 中的默认 "syntax error"
How to prevent default "syntax error" in Bison
如header中所述,我正在使用 Bison 和 Flex 来获取解析器,但我需要处理错误并在找到错误后继续。因此我使用:
Stmt: Reference '=' Expr ';' { printf(" Reference = Expr ;\n");}
| '{' Stmts '}' { printf("{ Stmts }");}
| WHILE '(' Bool ')' '{' Stmts '}' { printf(" WHILE ( Bool ) { Stmts } ");}
| FOR NAME '=' Expr TO Expr BY Expr '{' Stmts '}' { printf(" FOR NAME = Expr TO Expr BY Expr { Stmts } ");}
| IF '(' Bool ')' THEN Stmt { printf(" IF ( Bool ) THEN Stmt ");}
| IF '(' Bool ')' THEN Stmt ELSE Stmt { printf(" IF ( Bool ) THEN Stmt ELSE Stmt ");}
| READ Reference ';' { printf(" READ Reference ;");}
| WRITE Expr ';' { printf(" WRITE Expr ;");}
| error ';' { yyerror("Statement is not valid"); yyclearin; yyerrok;}
;
然而,我总是收到一条消息"syntax error",我不知道它来自哪里,也不知道如何防止它,这样我自己的"error code"就会被执行。
我试图在这里进行错误恢复,以便我的解析器将继续解析输入直到 EOF。
人们经常混淆 yacc/bison 中 error
规则的用途——它们用于错误恢复,而不是用于错误处理。因此,不会调用错误规则来响应错误——错误发生,然后使用错误规则来恢复。
如果您想自己处理错误(因此避免打印 "syntax error" 消息),您需要定义自己的 yyerror
函数(即错误处理程序),该函数使用 "syntax error" 字符串而不是打印它。一种选择是什么都不做,然后在您的错误恢复规则中打印一条消息(例如,在您调用 yyerror 的地方,将其更改为 printf)。问题是,如果错误恢复失败,您将不会收到任何消息(您将从 yyparse 收到失败 return,因此可以在那里打印一条消息)。
如header中所述,我正在使用 Bison 和 Flex 来获取解析器,但我需要处理错误并在找到错误后继续。因此我使用:
Stmt: Reference '=' Expr ';' { printf(" Reference = Expr ;\n");}
| '{' Stmts '}' { printf("{ Stmts }");}
| WHILE '(' Bool ')' '{' Stmts '}' { printf(" WHILE ( Bool ) { Stmts } ");}
| FOR NAME '=' Expr TO Expr BY Expr '{' Stmts '}' { printf(" FOR NAME = Expr TO Expr BY Expr { Stmts } ");}
| IF '(' Bool ')' THEN Stmt { printf(" IF ( Bool ) THEN Stmt ");}
| IF '(' Bool ')' THEN Stmt ELSE Stmt { printf(" IF ( Bool ) THEN Stmt ELSE Stmt ");}
| READ Reference ';' { printf(" READ Reference ;");}
| WRITE Expr ';' { printf(" WRITE Expr ;");}
| error ';' { yyerror("Statement is not valid"); yyclearin; yyerrok;}
;
然而,我总是收到一条消息"syntax error",我不知道它来自哪里,也不知道如何防止它,这样我自己的"error code"就会被执行。 我试图在这里进行错误恢复,以便我的解析器将继续解析输入直到 EOF。
人们经常混淆 yacc/bison 中 error
规则的用途——它们用于错误恢复,而不是用于错误处理。因此,不会调用错误规则来响应错误——错误发生,然后使用错误规则来恢复。
如果您想自己处理错误(因此避免打印 "syntax error" 消息),您需要定义自己的 yyerror
函数(即错误处理程序),该函数使用 "syntax error" 字符串而不是打印它。一种选择是什么都不做,然后在您的错误恢复规则中打印一条消息(例如,在您调用 yyerror 的地方,将其更改为 printf)。问题是,如果错误恢复失败,您将不会收到任何消息(您将从 yyparse 收到失败 return,因此可以在那里打印一条消息)。