2013-03-23 58 views
3

我正在用flex和bison編寫我自己的腳本語言。我有一個語法,我能夠生成一個解析器,它可以正確使用腳本。我希望能夠爲特殊的錯誤情況添加一些有意義的錯誤消息。例如,我希望能夠識別不匹配的語句塊或缺少分號等的括號。 假設我有這些語句(這裏的語法是不完整):用Bison解析錯誤

... 
statements: statement SEMICOLON statements 
    | statement SEMICOLON; 

statement: ifStatement 
    | whileStatement 
    ; 

ifStatement: IF expression THEN statements END 
    | IF expression THEN statements ELSE statements END 
    ; 

whileStatement: DO statements WHILE expression END 
    ; 
... 

我想能夠打印信息,如「失蹤分號」或「缺少那麼關鍵字」等。我應該修改語法來啓用錯誤處理嗎?還是有一些野牛功能可以做到這一點?

+0

感謝您的建議-_- – salvo 2013-03-23 14:12:35

回答

3

如果啓用%error-verbose,野牛不是生成自定義錯誤消息的正確工具,但其標準錯誤消息也不算太差。看看文檔:http://www.gnu.org/software/bison/manual/bison.html#Error-Reporting

如果您確實想要提供自定義錯誤消息,請閱讀有關YYERROR的文檔,併爲您想要捕獲的模式生成規則,並自行提出錯誤。例如,這裏除以0被視爲語法錯誤(這是可疑的,但提供了自定義語法錯誤消息的示例)。

exp: 
    NUM   { $$ = $1; } 
| exp '+' exp { $$ = $1 + $3; } 
| exp '-' exp { $$ = $1 - $3; } 
| exp '*' exp { $$ = $1 * $3; } 
| exp '/' exp 
    { 
     if ($3) 
     $$ = $1/$3; 
     else 
     { 
      $$ = 1; 
      fprintf (stderr, "%d.%d-%d.%d: division by zero", 
        @3.first_line, @3.first_column, 
        @3.last_line, @3.last_column); 
     } 
    } 

還要注意對令牌提供字符串產生更好的錯誤信息:

%token NUM 

會產生unexpected NUM,而

%token NUM "number" 

會產生unexpected number

+1

您說「野牛不是生成錯誤消息的正確工具...」。這是否意味着還有另一種更好的工具?謝謝。 – salvo 2013-03-24 14:12:06

+0

我不知道解析器生成器可以讓你包裝自己的錯誤消息。我正在考慮手動編寫解析器。 – akim 2013-03-25 06:14:17