野牛非终结者在语法上毫无用处

时间:2014-01-12 01:18:59

标签: bison

当我使用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
    ;

%%

使用这些非终结者的规则也被视为无用。

1 个答案:

答案 0 :(得分:2)

那是因为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问题。