【问题标题】:Bison nonterminal useless in grammar野牛非终结符在语法中无用
【发布时间】:2014-01-12 01:18:58
【问题描述】:

当我用bison test.y 编译下面的语法时,它警告说非终结符“header_stms”和“forward”是无用的。为什么?它们用于“程序”规则。非终结符 "stm" 并没有被报告为无用。

%%

program: /* empty */
    | stm
    | header_stms
    ;

header_stms: header_stms forward
    ;

/* forward proc declaration */
forward: "forward" TK_ID ";"
    ;

stm: TK_ID "+" TK_ID
    ;

%%

使用这些非终结符的规则也被认为是无用的。

【问题讨论】:

    标签: bison


    【解决方案1】:

    那是因为stm没有如何归约到程序规则,试试这个:

    %%
    
    program: /* empty */
           | stm
           | header_stms
           ;
    
    header_stms: /* empty */ 
               | forward
               | header_stms forward
               ;
    
    /* forward proc declaration */
    forward: "forward" TK_ID ";"
           ;
    
    stm: /* empty */ 
       | TK_ID "+" TK_ID
       ;
    
    %%
    

    另外,我通过左递归解决了 header_stms 中的 reduce 问题。

    【讨论】:

    • 谢谢!我需要做的就是添加额外的规则header_stms: forward 来结束递归。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多