在Bison语义动作中使用C宏

时间:2016-01-22 08:46:57

标签: bison

我想创建一些用于输入save的宏,它们看起来像:

#define SET_LOCATION(n) \
    { @$ = @n; \
      ...}

但它没有,错误消息是'$' is not declared in this scope。为什么呢?

2 个答案:

答案 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宏。之后他们会被海湾合作委员会扩大,这肯定会导致一个未申报的' $'错误。