我正在编译一个非常旧的程序(大约2000年的wu-ftpd 2.6.1),并且在此代码上失败:
cmd_list: /* empty */
| cmd_list cmd
= {
fromname = (char *) NULL;
restart_point = 0;
}
| cmd_list rcmd
;
野牛说,问题是出乎意料的'=',这是有道理的,因为我见过的其他每个Yacc程序(公认的不是很多)都没有在其中使用'='符号。我已经用=\t{
替换了\t{
模式,并且该软件可以构建(当然会有很多警告),但是我想知道它过去是如何构建的。是否更改了Yacc语法?
答案 0 :(得分:5)
是的,很旧的yacc版本允许用=
发出语义动作信号。他们还允许由单个语句组成的操作而没有用大括号括起来。
在Stephen Johnson's original Yacc paper中,该语法已过时,该历史可追溯到1970年代。请参阅附录D:受支持但不鼓励使用的旧功能:
动作也可以采用以下形式
= { . . . }
,如果操作是单个C语句,则可以删除花括号。
我对硬盘进行了快速检查,发现={...}
语法已被野牛1.2.5(1996)接受,但似乎在v1.875(2003)中不存在。在这两个版本之间的某个地方,由(f)lex生成的lexer替换了bison原始的手工lexer(并且手工生成的解析器被bootstrapped解析器替换了);我想过时的语法永远不会使它成为新的解析器。