在Bison语义动作中使用C宏
我想创建一些宏,用于键入save,如下所示:在Bison语义动作中使用C宏,bison,Bison,我想创建一些宏,用于键入save,如下所示: #define SET_LOCATION(n) \ { @$ = @n; \ ...} 但这并不意味着,错误消息是“$”未在此范围内声明。为什么?我检查了野牛的产量后才找到答案。当您直接在语义动作中编写@$时,Bison会将其替换为(yyloc)。但在使用C宏的情况下,它不会被替换。Bison不展开C宏。它们随后由GCC进行扩展,这肯定会导致未声明的“$”错误。Bison宏($和@)仅在操作中直接扩展——这种扩展发生在Bison
#define SET_LOCATION(n) \
{ @$ = @n; \
...}
但这并不意味着,错误消息是“$”未在此范围内声明。为什么?我检查了野牛的产量后才找到答案。当您直接在语义动作中编写
@$
时,Bison会将其替换为(yyloc)
。但在使用C宏的情况下,它不会被替换。Bison不展开C宏。它们随后由GCC进行扩展,这肯定会导致未声明的“$”错误。Bison宏($
和@
)仅在操作中直接扩展——这种扩展发生在Bison生成C代码时。当C编译器在bison的输出上运行时,C宏将在中展开。因此,如果要在C宏中使用bison宏,则需要确保它们直接出现在操作中,通常作为宏的参数:
#define SET_LOCATION(DEST, SRC) \
{ DEST = SRC; \
.... }
用作
SET_LOCATION(@$, @n)