yacc处理*.y出现“yacc: 1 rule never reduced”等错误,是什么原因?如何处理?

发布于 2022-09-23 15:11:13 字数 1612 浏览 14 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

暮光沉寂 2022-09-30 15:11:13

说明你的语法分析的过程中,这条规则永远不会遇到

我不会写诗 2022-09-30 15:11:13

打个最简单的比方
起始符号为S
规则为
S->e(空串)
S->Sa
A->b
第三条规则就永远不会被规约

绝不放开 2022-09-30 15:11:13

原帖由 cjaizss 于 2009-2-11 20:16 发表
说明你的语法分析的过程中,这条规则永远不会遇到

我的程序是这样的啊:

%{
#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 编辑 ]

哭了丶谁疼 2022-09-30 15:11:13

没时间帮你研究,sorry,这种问题只能自己去搞定

孤单情人 2022-09-30 15:11:13

不过我觉得你先不管那么多,先测试看看是否能够正确识别语法.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文