簡體   English   中英

如何防止 Bison 中的默認“語法錯誤”

[英]How to prevent default "syntax error" in Bison

如標題中所述,我使用 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;}
;

但是,我總是收到一個味精“語法錯誤”,我不知道它來自哪里以及如何防止它以便執行我自己的“錯誤代碼”。 我試圖在這里進行錯誤恢復,以便我的解析器將繼續解析輸入直到 EOF。

人們經常混淆 yacc/bison 中error規則的目的——它們用於錯誤恢復,而不是用於錯誤處理。 因此,不會調用錯誤規則來響應錯誤——錯誤發生,然后錯誤規則用於恢復。

如果您想自己處理錯誤(因此避免打印“語法錯誤”消息),則需要定義自己的yyerror函數(即錯誤處理程序),該函數對“語法錯誤”字符串執行某些操作而不是打印它。 一種選擇是什么都不做,然后在您的錯誤恢復規則中打印一條消息(例如,在您調用 yyerror 的地方,將其改為 printf)。 問題是,如果錯誤恢復失敗,您將不會收到任何消息(您將從 yyparse 獲得失敗返回,因此可以在那里打印一條消息)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM