在 Bison 语义操作中使用 C 宏

  • 本文关键字:Bison 语义 操作 bison
  • 更新时间 :
  • 英文 :


我想创建一些用于键入保存的宏,如下所示:

#define SET_LOCATION(n) 
    { @$ = @n; 
      ...}

但它没有,错误消息是'$' is not declared in this scope.为什么?

Bison宏($@)只是在行动中直接扩展 - 这种扩展发生在bison生成C代码时。 C 宏在稍后扩展,当您的 C 编译器在 bison 的输出上运行时。 因此,如果要在 C 宏中使用 bison 宏,则需要确保它们直接出现在动作中,通常作为宏的参数:

#define SET_LOCATION(DEST, SRC) 
       { DEST = SRC; 
         .... }

用作

SET_LOCATION(@$, @n)

我只是在检查野牛的输出后找到了答案。当您直接在语义操作中编写@$时,它会替换为 Bison 的(yyloc)。但在使用 C 宏的情况下不会替换它。Bison不扩展C宏。之后它们被 GCC 扩展,这肯定会导致未声明的"$"错误。

最新更新