我正在编译一个非常旧的程序(wu-ftpd 2.6.1 大约 2000 年),但在这段代码上失败了:
cmd_list: /* empty */
| cmd_list cmd
= {
fromname = (char *) NULL;
restart_point = 0;
}
| cmd_list rcmd
;
Bison 说问题是意外的“=”,这是有道理的,因为我见过的所有其他 Yacc 程序(诚然不是很多)都没有使用“=”符号。我已将 =\t{
模式替换为 \t{
并构建了软件(当然有很多警告),但我想知道它是如何在过去的。 Yacc 语法改变了吗?
最佳答案
是的,非常旧的 yacc 版本允许使用 =
来表示语义操作。它们还允许由不带大括号的单个语句组成的操作。
此语法在 Stephen Johnson's original Yacc paper 中被标记为已过时。 ,可以追溯到 20 世纪 70 年代。请参阅附录 D:支持但不鼓励的旧功能:
Actions may also have the form
= { . . . }
and the curly braces can be dropped if the action is a single C statement.
我快速检查了我的硬盘,发现 ={...}
语法被 bison 1.2.5 (1996) 接受,但它似乎不存在在 v1.875 (2003) 中。在这两个版本之间的某个地方,bison 最初的手工构建的词法分析器被 (f)lex 生成的词法分析器替换(并且手工构建的解析器被替换为引导解析器);我想过时的语法从未进入新的解析器。
关于bison - Yacc 的某些版本是否在规则和操作之间使用 '='?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56837265/