Bison非终结词在语法上是无用的

Bison非终结词在语法上是无用的,bison,Bison,当我使用bison test.y编译下面的语法时,它警告非终结符“header\u stms”和“forward”是无用的。为什么?它们在“程序”规则中使用。非终结符“stm”不会报告为无用 %% program: /* empty */ | stm | header_stms ; header_stms: header_stms forward ; /* forward proc declaration */ forward: "forward" TK_I

当我使用
bison test.y
编译下面的语法时,它警告非终结符“header\u 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
    ;

%%

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

这是因为stm不知道如何简化为程序规则,请尝试以下操作:

%%

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

header_stms: header_stms forward
    ;

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

stm: TK_ID "+" TK_ID
    ;

%%
%%

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
   ;

%%

此外,我还通过左递归解决了标题中的reduce问题。

谢谢!我所需要做的就是添加额外的规则
header\u stms:forward
来结束递归。