バイソンパーサーで抽象構文木を使おうとしていたので、%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 をクラスとして定義し、構造体へのポインターの代わりにそれへのポインターを使用することは可能ですか?
前もって感謝します、ジャック