在Bison语义动作中使用C宏

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

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

#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)