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

标签 bison yacc

我正在编译一个非常旧的程序(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:支持但不鼓励的旧功能:

  1. 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/

相关文章:

makefile - Yacc 和 Lex 包含混淆

bison - 如何获取启动规则的返回值

javascript - 使用 Jison/Bison 解析字符串

c - Flex 和 Bison 如何找到命令的深度级别

c++ - 将 C bison 解析器移植到 C++

parsing - 我可以使用什么前端与 RPython 来实现语言?

c - 弹性给予 "fatal scanner internal error--end of buffer missed"

c++ - 如何解决 YACC 中的 Shift/Reduce 冲突

bison - "$$ = 1"在 Bison/Yacc 中是什么意思?

c - 解决 yacc 冲突 - 由于冲突规则在解析器中无用