如何解决使用野牛时yacc嵌入动作存在问题
我正在尝试从Brian Kernighan和Rob Pike于1984年撰写的“ Unix编程环境”一书中实现编译器。该书假定使用yacc,但是我使用的Mac OS的版本为bison 2.3。本书的第276页描述了代码问题。
我从使用嵌入式动作(yacc lingo)的语法/动作中得到警告,我认为这与野牛中的规则动作相同。
下面是生成警告的语法(行号来自清单):
158: defn: FUNC procname { $2->type=FUNCTION; indef=1; }
159: '(' ')' stmt { code(procret); define($2); indef=0; }
160: | PROC procname { $2->type=PROCEDURE; indef=1; }
161: '(' ')' stmt { code(procret); define($2); indef=0; }
162: ;
163:
164:
165: procname: VAR
166: | FUNCTION
167: | PROCEDURE
168: ;
以下是野牛发出的警告:
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接受而不是野牛?如果是这样,野牛是否有“ yacc模式”?如果不是,应该如何将语法/动作重写为野牛可以接受的?谢谢
解决方法
这些中规矩的行为在野牛中是完全可以接受的。那不是你的问题。
如注释中所示,此错误消息的最可能原因是您的语法缺少包含defn
的生成式,而该生成式是list
的第三生成式:
list: /* nothing */
| list '\n'
| list defn '\n'
| list asgn '\n' { code2(xpop,STOP); return 1; }
| list stmt '\n' { code(STOP); return 1; }
| list expr '\n' { code2(printtop,STOP); return 1; }
| list error '\n' { yyerrok; }
;
您可以使用Wayback Machine aka web.archive.org从UPE书中下载包含所有代码的tarball。我从Wikipedia entry for hoc获得了该链接,该链接还包含其他临时实现的链接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。