typedef struct Decl_Enum_Child Decl_Enum_Child; typedef struct Typespec Typespec; typedef struct Decl Decl; typedef struct Note Note; //----------------------------------------------------------------------------- // Type specifier //----------------------------------------------------------------------------- typedef enum Typespec_Kind{ TS_None, TS_Name, TS_Pointer, TS_Array, TS_Function, TS_Struct, }Typespec_Kind; struct Typespec{ Typespec_Kind kind; Typespec *next; Token *pos; union{ Intern_String name; Decl *struct_spec; struct{ Typespec *first; Typespec *last; Typespec *ret; }function_spec; struct{ Typespec *base; Expr *size; }array_spec; Typespec *base; }; }; //----------------------------------------------------------------------------- // Notes //----------------------------------------------------------------------------- struct Note{ Token *pos; Intern_String name; Expr *expr; Note *next; Note *first; Note *last; }; //----------------------------------------------------------------------------- // Declarations //----------------------------------------------------------------------------- typedef enum Decl_Kind{ DECL_None, DECL_Struct, DECL_Union, DECL_Enum, DECL_Variable, DECL_Typedef, DECL_List, }Decl_Kind; struct Decl_Enum_Child{ Decl_Enum_Child *next; Intern_String name; Token *pos; Expr *expr; Note *first_note; Note *last_note; }; struct Decl{ Decl_Kind kind; Intern_String name; Token *pos; Decl *next; Note *first_note; Note *last_note; union{ struct{ Decl_Enum_Child *first; Decl_Enum_Child *last; Typespec *typespec; }enum_decl; struct{ Decl *first; Decl *last; } struct_decl; struct{ Typespec *type; Expr *expr; }variable_decl; struct{ Typespec *type; }typedef_decl; struct{ Decl *first; Decl *last; }list; }; };