2011-03-01 121 views
4

仍然在學習yacc和flex,並且遇到了我沒有涉及的操作指南和教程的場景。我試圖解析一個文件,並且當我正在進行時,我在我放入我的parser.y文件中的代碼中進行了一些輔助錯誤檢查。當我遇到按字典順序正確(即解析正確匹配)但邏輯不正確(意外值或不適當值)的情況時,如何退出yyparse?另外,我可以讓它返回一個錯誤代碼給我,我可以在我的調用代碼中檢查嗎?使用yacc時,你如何告訴yyparse()你想停止解析?

/* Sample */ 
my_file_format: 
    header body_lines footer 
    ; 
header: 
    OBRACE INT CBRACE 
    | 
    OBRACE STRING CBRACE { 
    if (strcmp ($1, "Contrived_Example") != 0) { /* I want to exit here */ } 
    } 
    ; 
/* etc ... */ 

我意識到,在我的例子,我可以簡單地尋找「Contrived_Example」使用規則,但我的觀點是在if - 塊 - 我可以告訴yyparse,我想停在這裏解析?

回答

4

您可以使用宏YYERRORYYABORT,具體取決於您想要的內容。 YYABORT會導致yyparse立即以失敗返回,而YYERROR會導致它發生錯誤並嘗試恢復(如果無法恢復,將返回失敗)。您可以使用YYACCEPT來使yyparse立即返回成功。

+0

將調查;謝謝。 – Will 2011-03-02 02:56:21

+0

+1幾乎是我想要的 - 它確實退出瞭解析,儘管以一種相當突然的方式。 – Will 2011-03-02 17:00:27