Cison中的Union用于Bison的上下文

时间:2014-01-22 22:38:48

标签: c++ bison

参考此blog post

有一个联盟定义如下:

%union {
    Node *node;
    NBlock *block;
    NExpression *expr;
    NStatement *stmt;
    NIdentifier *ident;
    NVariableDeclaration *var_decl;
    std::vector<NVariableDeclaration*> *varvec;
    std::vector<NExpression*> *exprvec;
    std::string *string;
    int token;
}

我的问题是:当匿名时,如何使用此联盟以及它是如何实际使用的?

1 个答案:

答案 0 :(得分:1)

不要将bison的%union指令与C / C ++语法混淆。

在bison生成的代码中,会有一个C / C ++ union,它的主体是从%union指令复制的,但它肯定不是匿名的:它的名字是{{1} }。但是,您几乎不需要知道,因为该类型的唯一公开变量是YYSTYPE。 (内部野牛堆栈也由yylval类型的元素组成,但不会暴露给用户代码。)

如野牛手册所述,还有其他各种可能的方法来定义YYSTYPE。例如,您可以创建自己的C / C ++ YYSTYPE(或union)类型,如here所述。但是,很少需要这些高级struct功能。