野牛非终结符在语法中没用

Mik*_*ike 5 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
    ;

%%
Run Code Online (Sandbox Code Playgroud)

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

Joã*_*nho 4

那是因为 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
   ;

%%
Run Code Online (Sandbox Code Playgroud)

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