当我用 编译下面的语法时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)
使用这些非终结符的规则也被认为是无用的。
那是因为 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 中的减少问题。