#ifndef AST_H #define AST_H #define EXP_POSTFIX 1024 #define POSTFIX_ARR 1025 #define POSTFIX_CALL 1026 #define POSTFIX_DOT 1027 #define POSTFIX_PTR 1028 #define EXP_CAST 1029 #define INITR_NORM 1030 #define INITR_ARR 1031 #define DECLR_FUNC 1032 #define DECLR_ARR 1033 #define STMT_EXP 1034 #define STMT_COMP 1035 #define STMT_IF 1036 #define STMT_WHILE 1037 #define STMT_FOR 1038 #define STMT_CONT 1039 #define STMT_BREAK 1040 #define STMT_RET 1041 typedef struct CNode { enum { /* Top Level */ PROG, FUNC_DEF, DECL, /* declaration */ DECLR, /* declarator */ INIT_DECLR, INITR, /* initializer */ TYPE_SPEC, FIELD, /* struct-or-union field */ PLAIN_DECL, /* Statments */ STMT, /* Expressions */ EXP, TYPE_NAME, ID, /* identifier */ INT, /* INT_CONST */ CHAR, STR, NOP, COMP_STMTS, COMP_DECLS, ARGS, PARAMS } type; union { int intval; int subtype; char *strval; } rec; struct CNode *chd, *next; /* For error reporting */ struct Location { int row, col; } loc; } CNode; void cnode_init(); CNode *cnode_create_nop(); CNode *cnode_create_general(int type, int subtype, int pnum, va_list ap); CNode *cnode_append(CNode *node, CNode *tail); CNode *cnode_create_exp(int exp_type, int pnum, ...); CNode *cnode_create_type_spec(int spec_type, int pnum, ...); CNode *cnode_create_declr(int declr_type, int pnum, ...); CNode *cnode_create_stmt(int stmt_type, int pnum, ...); CNode *cnode_create_initr(int initr_type, CNode *body); CNode *cnode_create_decl(CNode *type, CNode *init_declrs); CNode *cnode_create_func(CNode *type, CNode *plain_decl, CNode *params, CNode *stmt); CNode *cnode_create_init_declr(CNode *declr, CNode *initr); CNode *cnode_create_struct_field(CNode *type_spec, CNode *declrs); CNode *cnode_create_plain_decl(CNode *type_spec, CNode *declr); CNode *cnode_create_comp_decls(CNode *decls); CNode *cnode_create_comp_stmts(CNode *stmts); CNode *cnode_create_args(CNode *arg_list); CNode *cnode_create_params(CNode *plist); CNode *cnode_create_identifier(char *val); CNode *cnode_create_int_const(int val); CNode *cnode_create_char_const(int val); CNode *cnode_create_str_const(char *val); void cnode_debug_print(CNode *ast); extern CNode *ast_root; extern CNode *null; #endif