Bison中的%union指令

时间:2009-10-29 17:17:59

标签: parsing yacc bison lex

我试图在野牛解析器中使用抽象语法树,所以我尝试使用%union指令。语法文件如下所示:

%{


#include "compiler.h"
#include "ast.h"
#include "common.h"

static bool verbose = true;

extern "C"
{
        int cyylex(void);  
        void cyyerror(const char *s);
}       
%}

%union
{
    ast_node *node;
    unsigned char retn_type;    
}

在当前状态下,我试图使用结构,所以在文件ast.h中我有以下声明:

#ifndef AST_H_
#define AST_H_

#include <string>
#include "common.h"

enum RETN_TYPE { E_VOID, E_FLOAT, E_VECTOR, E_POINT, E_COLOR, E_COLORW, E_BOOL};
enum AST_TYPE { AST_FLOAT, AST_INT, AST_ID, AST_FUNC };

struct ast_node
{
    u8 node_type;

    union
    {   
        float f;
        int i;
        u8 *id;

        struct
        {
            u8 *name;
            u8 retn_type;
        } func;
    };
};

#endif

我正在使用g ++而不是gcc它应该可以工作(我在网上找到了类似的例子)但是在定义ast_node时似乎不知道YYSTYPE因为我得到了这个错误:< / p>

  

/shady_parser/shady.y:22:错误:ISO C ++禁止声明'ast_node'没有类型   ./shady_parser/shady.y:22:错误:预期';'在'*'之前   ./shady_parser/shady.l:在函数'int cyylex()'中:   ./shady_parser/shady.l:35:错误:'union YYSTYPE'没有名为'node'的成员   ./shady_parser/shady.l:37:错误:'union YYSTYPE'没有名为'node'的成员   ./shady_parser/shady.l:38:错误:'union YYSTYPE'没有名为'node'的成员

为什么会这样?

那么是否可以将ast_node定义为类并使用指向它的指针而不是指向结构的指针?

提前致谢, 千斤顶

0 个答案:

没有答案