使用bison时yacc嵌入操作存在问题

使用bison时yacc嵌入操作存在问题,bison,yacc,Bison,Yacc,我试图实现一个编译器,该编译器出自Brian Kernighan和Rob Pike的《Unix编程环境》一书,1984年。这本书假设yacc,但是我使用的是一个具有bison版本2.3的Mac。本书第276页描述了代码问题 我从一段使用嵌入动作(yacc行话)的语法/动作中得到警告,我认为这和bison中的中间规则动作是一样的 下面是生成警告的语法(行号来自列表): 以下是野牛发出的警告: 7 rules never reduced hoc.y: warning: 4 useless nonte

我试图实现一个编译器,该编译器出自Brian Kernighan和Rob Pike的《Unix编程环境》一书,1984年。这本书假设yacc,但是我使用的是一个具有bison版本2.3的Mac。本书第276页描述了代码问题

我从一段使用嵌入动作(yacc行话)的语法/动作中得到警告,我认为这和bison中的中间规则动作是一样的

下面是生成警告的语法(行号来自列表):

以下是野牛发出的警告:

7 rules never reduced
hoc.y: warning: 4 useless nonterminals and 7 useless rules
hoc.y:158.1-4: warning: useless nonterminal: defn
hoc.y:158.29-59: warning: useless nonterminal: @1
hoc.y:160.29-60: warning: useless nonterminal: @2
hoc.y:47.17-24: warning: useless nonterminal: procname
hoc.y:158.29-59: warning: useless rule: @1: /* empty */
hoc.y:158.7-159.67: warning: useless rule: defn: FUNC procname @1 '(' ')' stmt
hoc.y:160.29-60: warning: useless rule: @2: /* empty */
hoc.y:160.7-161.67: warning: useless rule: defn: PROC procname @2 '(' ')' stmt
hoc.y:165.11-13: warning: useless rule: procname: VAR
hoc.y:166.7-14: warning: useless rule: procname: FUNCTION
hoc.y:167.7-15: warning: useless rule: procname: PROCEDURE

语法/动作是否可能为yacc而非bison所接受?如果是,野牛是否有“yacc模式”?如果没有,应如何改写语法/动作以使bison接受?谢谢

这些中规中矩的行为在野牛中是完全可以接受的。那不是你的问题

如注释所示,此错误消息最可能的原因是语法缺少产品,其中包括
defn
,这是
列表的第三个产品:

list:/*无*/
|列表'\n'
|列表定义'\n'
|列出asgn'\n'{code2(xpop,STOP);返回1;}
|列表stmt'\n'{code(STOP);返回1;}
|list expr'\n'{code2(打印顶端,停止);返回1;}
|列表错误'\n'{yyerrok;}
;

您可以使用从UPE手册下载包含所有代码的tarball。我从中获得了该链接,其中还包含指向其他hoc实现的链接。

听起来似乎只是这些规则实际上都没有在其他地方使用。
defn
是否在其他地方实际使用?如果您确实使用它添加了与顶级符号相关的内容,是否还保留了任何警告?
procname
的备选方案选择很奇怪。我认为如果没有MCVE(-或MRE或现在使用的任何名称)或SSCCE(),我们就帮不了什么忙。这意味着删除从第1行到第157行的大部分行,但留下足够的行数,即使行号不同,问题仍然会发生。但是,考虑到
无用规则
的警告,很明显您在定义的RHS上没有使用
defn
一些非终端:…defn…
7 rules never reduced
hoc.y: warning: 4 useless nonterminals and 7 useless rules
hoc.y:158.1-4: warning: useless nonterminal: defn
hoc.y:158.29-59: warning: useless nonterminal: @1
hoc.y:160.29-60: warning: useless nonterminal: @2
hoc.y:47.17-24: warning: useless nonterminal: procname
hoc.y:158.29-59: warning: useless rule: @1: /* empty */
hoc.y:158.7-159.67: warning: useless rule: defn: FUNC procname @1 '(' ')' stmt
hoc.y:160.29-60: warning: useless rule: @2: /* empty */
hoc.y:160.7-161.67: warning: useless rule: defn: PROC procname @2 '(' ')' stmt
hoc.y:165.11-13: warning: useless rule: procname: VAR
hoc.y:166.7-14: warning: useless rule: procname: FUNCTION
hoc.y:167.7-15: warning: useless rule: procname: PROCEDURE