yacc处理*.y出现“yacc: 1 rule never reduced”等错误,是什么原因?如何处理?
yacc处理*.y文件时出现
1,“yacc: 1 rule never reduced”
我的这条规则: st : STL i ; ( 期中STL是token),就是出现上述错误
2, "yacc: 10 shift/reduce conficts"
在y.output文件中出现:
9: shift/reduce conflict (shift 1, reduce 4) on LD
9: shift/reduce conflict (shift 2, reduce 4) on LDI
state 9
stc : stc2 . (4)
stc2 : stc2 . stc1 ( 8 )
LD shift 1
LDI shift 2
$end reduce 4
OUT reduce 4
SPC reduce 4
STL reduce 4
stc1 goto 18
i goto 11
3,还有这样的:
state 12
stc2 : st . stc1 (7)
LD shift 1
LDI shift 2
. error
stc1 goto 33
i goto 11
中间有个. error是什么意思?
等错误,应如何处理?谢谢
[ 本帖最后由 liuzq71 于 2009-2-11 14:59 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
说明你的语法分析的过程中,这条规则永远不会遇到
打个最简单的比方
起始符号为S
规则为
S->e(空串)
S->Sa
A->b
第三条规则就永远不会被规约
我的程序是这样的啊:
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token ANB ORB LD ID LDI OR ORI AND ANI OUT SPC MPS MRD MPP STL
%%
program : stc
| stc program ;
stc : stc1
| stc2
| output ;
stc1 : i o ;
stc2 : st stc1
| stc2 stc1;
st : STL i ;
i : i i ANB
| i i ORB
| i vi
| LD ID
| LDI ID ;
vi : OR ID
| ORI ID
| vo ;
vo : AND ID
| ANI ID ;
o : o1
| o2 ;
o1 : ox2
| ox2 ok output ;
ox2 : output
| output ox2 ;
ok : ok i ANB
| ok vo
| i ANB
| vo ;
output : OUT ID
| SPC ;
o2 : omps ox ompp;
ox : /*epsilon*/
| omrd ox ;
omps : MPS oin
| output MPS oin ;
omrd : MRD oin ;
ompp : MPP oin ;
oin : o
| ok o1 ;
%%
int main()
{
return yyparse();
}
/*yylex()手工写出*/
int yylex (void)
{
return 0;
}
/*错误处理,简单地打印出来*/
void yyerror (char const *s)
{
fprintf (stderr, "%s\n", s);
}
结果在y.output文件中看到:
Rules never reduced:
st : STL i (9) ==================>这条规则怎会是没用的规则呢?想不通
State 9 contains 2 shift/reduce conflicts.
State 16 contains 2 shift/reduce conflicts.
State 24 contains 2 shift/reduce conflicts.
State 31 contains 2 shift/reduce conflicts.
State 44 contains 2 shift/reduce conflicts.
网上搜不到解决 方法
请 cjaizss 版主 邦忙解决一下,给你作揖了!
[ 本帖最后由 liuzq71 于 2009-2-11 21:17 编辑 ]
没时间帮你研究,sorry,这种问题只能自己去搞定
不过我觉得你先不管那么多,先测试看看是否能够正确识别语法.