Bison Yacc的某些版本是否使用'=';在规则和行动之间?

Bison Yacc的某些版本是否使用'=';在规则和行动之间?,bison,yacc,Bison,Yacc,我正在编译一个非常旧的程序(大约2000年的wu ftpd 2.6.1),它在以下代码上失败: cmd_list: /* empty */ | cmd_list cmd = { fromname = (char *) NULL; restart_point = 0; } | cmd_list rcmd ; Bison说问题出在出乎意料的“=”上,这是有道理的,因为我见过的所有其他Yacc程序(当然不是很多)都没有使

我正在编译一个非常旧的程序(大约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版本允许语义操作用
=
来表示。它们还允许由单个语句组成的操作,而不使用大括号

该语法在中被认为是过时的,可追溯到20世纪70年代。请参见附录D:支持但不鼓励的旧功能:

  • 行动也可以有以下形式:

     =     { . . . } 
    
    如果操作是单个C语句,则可以删除大括号


  • 我快速检查了一下我的硬盘,发现bison 1.2.5(1996)接受了
    ={…}
    语法,但它似乎没有出现在v1.875(2003)中。在这两个版本之间的某个地方,bison最初手工构建的lexer被(f)lex生成的lexer取代(手工构建的解析器被一个自举解析器所取代);我想过时的语法从来没有进入到新的解析器中。

    有趣的是,今天下午早些时候,我在那个网站上看了这篇论文(出于一系列与这个问题无关的原因).我想这说明了旧资源总是很有价值的,即使只是作为历史参考。但现在,我不认为我会将该文档用于任何与计算机历史无关的东西。我经常希望它不会在互联网搜索中如此频繁地出现,因为人们真的应该使用它。我大部分时间都很开心。它并没有真正对应当我看到作者的时候,我没有料到这是我想要的。我只是检查它是否是我所认为的——我从中了解到的Yacc的原始规范。