#ifndef AST_H #define AST_H struct stmt_node; struct expr_node; struct type_node { bool _unsigned; bool _short; bool _long; unsigned char ptr_level; char* name; }; struct int_lit_node { long long val; }; struct float_lit_node { double val; }; struct char_lit_node { char val; }; struct str_lit_node { char* val; }; struct var_ref_node { char* ident; }; struct var_decl_node { struct type_node type; char* ident; struct var_decl_node* next; }; struct lval_node { enum { LVAL_VAR_DECL, LVAL_VAR_REF, } type; union { struct var_ref_node _var_ref; struct var_decl_node _var_decl; } as; }; /* TODO: add to expression, parse */ struct assign_node { struct lval_node lval; struct expr_node* rval; }; struct expr_node { enum { EXPR_INT_LIT, EXPR_FLOAT_LIT, EXPR_CHAR_LIT, EXPR_STR_LIT, EXPR_VAR_REF, EXPR_ASSIGN, } type; union { struct int_lit_node _int_lit; struct float_lit_node _float_lit; struct char_lit_node _char_lit; struct str_lit_node _str_lit; struct var_ref_node _var_ref; struct assign_node _assign; } as; }; struct group_node { struct stmt_node* body_head; }; struct fn_decl_node { struct type_node return_type; char* name; struct var_decl_node* args_head; struct group_node body; }; struct return_node { struct expr_node* ret_val; /* null to return void */ }; struct stmt_node { enum { STMT_EMPTY, STMT_EXPR, STMT_VAR_DECL, STMT_RETURN, STMT_GROUP, } type; union { struct expr_node _expr; struct var_decl_node _var_decl; struct return_node _return; struct group_node _group; } as; struct stmt_node* next; }; struct root_node { enum { ROOT_FN_DECL, } type; union { struct fn_decl_node _fn_decl; } as; struct root_node* next; }; void ast_destroy(struct root_node* head); #endif