在 Bison 语义动作中使用 C 宏

use C macro in Bison semantic actions

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

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

但是还是不行,报错信息是'$' is not declared in this scope。为什么?

我是在查看了Bison的输出后才找到答案的。当你直接在语义动作中写 @$ 时,它会被 Bison 替换为 (yyloc)。但是在使用C宏的情况下被替换。 Bison 不展开 C 宏。它们随后被 GCC 扩展,这肯定会导致未声明的“$”错误。

Bison 宏($@)仅在操作中直接 扩展——并且这种扩展发生在 bison 生成 C 代码时。当您的 C 编译器在 bison 的输出上运行时,C 宏将在稍后展开。所以如果要在C宏中使用bison宏,需要保证它们直接出现在action中,一般作为宏的参数:

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

用作

SET_LOCATION(@$, @n)