1

バイソンパーサーで抽象構文木を使おうとしていたので、%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

私は gcc の代わりに g++ を使用していますが、動作するはずです (Web 上で同様の例を見つけました) が、次のエラーが発生するためast_node、定義時に不明のようです:YYSTYPE

/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 をクラスとして定義し、構造体へのポインターの代わりにそれへのポインターを使用することは可能ですか?

前もって感謝します、ジャック

4

0 に答える 0