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的调用。好的。行了。我已经放弃了调试生成的解析器,因为变量名非常简洁。好的,我从中得出了一个答案。