Yacc的某些版本在规则和操作之间是否使用'='?

sne*_*ase 2 yacc bison

我正在编译一个非常旧的程序(大约2000年的wu-ftpd 2.6.1),并且在此代码上失败:

cmd_list:   /* empty */
    | cmd_list cmd
    =   {
        fromname = (char *) NULL;
        restart_point = 0;
    }
    | cmd_list rcmd
    ;
Run Code Online (Sandbox Code Playgroud)

野牛说,问题是出乎意料的'=',这是有道理的,因为我见过的其他所有Yacc程序(公认的不是很多)都没有在其中使用'='符号。我已经用=\t{模式替换了,\t{并且构建了软件(当然有很多警告),但是我想知道它过去是如何构建的。是否更改了Yacc语法?

ric*_*ici 5

是的,非常老的yacc版本允许用来表示语义动作=。他们还允许动作由单个语句组成,而不用大括号括起来。

斯蒂芬·约翰逊(Stephen Johnson)的原始Yacc论文可追溯到1970年代,但该语法已过时。请参阅附录D:受支持但不鼓励使用的旧功能

  1. 动作也可以具有以下形式

    =     { . . . } 
    
    Run Code Online (Sandbox Code Playgroud)

    如果操作是单个C语句,则可以删除花括号。

我对硬盘进行了快速检查,发现该={...}语法已被野牛1.2.5(1996)接受,但似乎在v1.875(2003)中不存在。在这两个版本之间的某个地方,由(f)lex生成的lexer替换了bison最初的手工lexer(并且手工生成的解析器替换为自举解析器);我想过时的语法永远不会使它成为新的解析器。