用Bison解析错误

时间:2013-03-23 13:58:56

标签: c parsing grammar bison

我正在使用flex和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
    ;
...

我希望能够打印诸如“Missing semicolon”或“Missing then then keyword”等消息。我应该修改我的语法以启用错误处理吗?或者是否有一些Bison功能可以做到这一点?

1 个答案:

答案 0 :(得分:3)

Bison不是生成自定义错误消息的正确工具,但如果您启用%error-verbose,其标准错误消息也不会太糟糕。请查看文档:{​​{3}}。

如果您确实想提供自定义错误消息,请阅读有关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