#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
typedef struct CNode {
enum {
/* Top Level */
PROG, FUNC_DEF, PARAMS,
DECL, /* declaration */
DECLR, /* declarator */
DECLRS,
INIT_DECLRS, INIT_DECLR,
INITR, /* initializer */
TYPE_SPEC,
STRUCT, UNION,
PLAIN_DECL, PLAIN_DECLR,
/* Statments */
EXP_STMT, /* expression-statment */
COMP_STMT, IF_STMT, /* selection-statment */
WHILE_STMT, FOR_STMT,
CONT_STMT , BREAK_STMT, RET_STMT, /* 'continue', 'break', 'return' */
/* Expressions (expressions use their token ID to denote their types */
EXP,
TYPE_NAME,
ID, /* identifier */
INT, /* INT_CONST */
CHAR,
STR
} type;
union {
int intval;
int subtype;
char *strval;
} rec;
struct CNode *chd, *next;
/* For error reporting */
struct Location {
int row, col;
} loc;
} CNode;
CNode *cnode_create_exp(int exp_type, int pnum, ...);
CNode *cnode_create_type_spec(int spec_type, int pnum, ...);
CNode *cnode_append(CNode *node, CNode *tail);
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);
CNode *cnode_debug_print(CNode *ast);
extern CNode *ast_root;
#endif