我想创建一些用于键入保存的宏,如下所示:
#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 扩展,这肯定会导致未声明的"$"错误。