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

时间:2019-07-01 14:15:25

标签: bison yacc

我正在编译一个非常旧的程序(大约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语法?

1 个答案:

答案 0 :(得分:5)

是的,很旧的yacc版本允许用=发出语义动作信号。他们还允许由单个语句组成的操作而没有用大括号括起来。

Stephen Johnson's original Yacc paper中,该语法已过时,该历史可追溯到1970年代。请参阅附录D:受支持但不鼓励使用的旧功能

  
      
  1. 动作也可以采用以下形式

    =     { . . . } 
    
         

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

  2.   

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