Yacc 的某些版本是否在规则和操作之间使用“=”?
Do some versions of Yacc use '=' between rules and actions?
我正在编译一个非常古老的程序(大约 2000 年的 wu-ftpd 2.6.1)并且在这段代码上失败了:
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 中已过时,可追溯到 1970 年代。请参阅附录 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 的原始 hand-built 词法分析器被 (f)lex 生成的词法分析器所取代(并且 hand-built 解析器被引导的解析器所取代);我想过时的语法从未进入新的解析器。
我正在编译一个非常古老的程序(大约 2000 年的 wu-ftpd 2.6.1)并且在这段代码上失败了:
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 中已过时,可追溯到 1970 年代。请参阅附录 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 的原始 hand-built 词法分析器被 (f)lex 生成的词法分析器所取代(并且 hand-built 解析器被引导的解析器所取代);我想过时的语法从未进入新的解析器。