野牛终止而不是改变错误

时间:2017-06-12 03:03:28

标签: parsing grammar bison

我的语法运行良好,但它不能容忍语法错误。我正在尝试使用error令牌,以便它可以优雅地恢复。我已经通过the Bison manual阅读了有关错误恢复的内容,但有些内容并没有加起来。

以下是语法的片段:

%start start
%token WORD WORDB SP CRLF

%%

start : A B C
      | error CRLF start

A     : WORD SP WORD CRLF

...

这是bison生成的描述语法的输出文件的片段

State 0

    0 $accept: . start $end

    error  shift, and go to state 1
    WORD   shift, and go to state 2

    start      go to state 3
    A          go to state 4

State 1

    2 start: error . CRLF start

    CRLF  shift, and go to state 5

State 5

    2 start: error CRLF . start

    error  shift, and go to state 1
    WORD   shift, and go to state 2

    start     go to state 25
    A         go to state 4

给定输入标记WORDB CRLF WORD SP WORD CRLF .....我希望状态转换为0 -> 1 -> 5 -> 2 -> ...,但是当我运行解析器时,它实际上产生以下内容:

--(end of buffer or a NUL)
--accepting rule at line 49 ("WORDB")
Starting parse
Entering state 0
Reading a token: Next token is token WORDB ()
syntax error, unexpected WORDB, expecting WORD

我可以告诉,如果解析器处于状态0并且它看到WORD以外的令牌,它应该将令牌解释为error,并且应该转到状态1。练习它只是很难失败。

1 个答案:

答案 0 :(得分:1)

error转换不会取消对yyerror()的调用,因此,如果您的yyerror实施与调用exit()类似,则无法继续进行错误恢复。