在 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)
我想创建一些用于键入保存的宏,如下所示:
#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)