Parsing 野牛终止而非移位错误

Parsing 野牛终止而非移位错误,parsing,grammar,bison,Parsing,Grammar,Bison,我的语法很好用,只是它不能容忍语法错误。我正在尝试使用错误标记,以便它能够正常恢复。我已经通读了关于错误恢复的内容,但有些内容不完整 下面是语法中的一个片段: %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 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,那么它应该将该令牌解释为错误,并应转到状态1。实际上,失败是很难的。

错误转换不会抑制对yyerror的调用,因此如果yyerror实现执行类似于调用退出的操作,则错误恢复将无法继续。

yyerror函数的作用是什么?错误转换不会抑制对yyerror.exit1的调用。好的。行了。我已经放弃了调试生成的解析器,因为变量名非常简洁。好的,我从中得出了一个答案。