我想创建一些用于输入save的宏,它们看起来像:
#define SET_LOCATION(n) \
{ @$ = @n; \
...}
但它没有,错误消息是'$' is not declared in this scope
。为什么呢?
答案 0 :(得分:2)
Bison宏(@
和#define SET_LOCATION(DEST, SRC) \
{ DEST = SRC; \
.... }
)只是在行动中直接扩展 - 而这种扩展是在bison生成C代码时发生的。当您的C编译器在bison的输出上运行时,C宏将在以后扩展。因此,如果要在C宏中使用bison宏,则需要确保它们直接出现在操作中,通常作为宏的参数:
SET_LOCATION(@$, @n)
用作
20.06.2009 05:00:00 2.6
20.06.2009 06:00:00 21.5
答案 1 :(得分:1)
我检查了Bison的输出后才找到答案。当您在语义操作中直接编写@$
时,它会被Bison替换为(yyloc)
。但是在使用C宏的情况下,不被替换。 Bison没有扩展C宏。之后他们会被海湾合作委员会扩大,这肯定会导致一个未申报的' $'错误。