我的语法运行良好,但它不能容忍语法错误。我正在尝试使用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。练习它只是很难失败。
答案 0 :(得分:1)
error
转换不会取消对yyerror()
的调用,因此,如果您的yyerror
实施与调用exit()
类似,则无法继续进行错误恢复。