#ifndef CERC_PARSE_H #define CERC_PARSE_H #include "expr.h" struct ast_expr { struct disjunction_e dis; }; struct ast_externfunc { const char *name; struct type ret; struct type *params; int paramsz, paramlen; }; struct ast_param { const char *name; struct type type; }; struct ast_block { struct ast_cmd *cmds; int cmdsz, cmdlen; }; struct ast_return { struct ast_expr value; }; struct ast_declaration { bool mut; const char *name; struct ast_expr value; }; enum subfield { SUB_INDEX, SUB_FIELD, }; struct loc_postfix { enum subfield sub; union { struct ast_expr index; const char *field; } id; }; struct ast_location { const char *name; struct loc_postfix *subs; int subsz, sublen; }; struct ast_assign { struct ast_location dst; struct ast_expr value; }; enum statement { STM_RETURN, STM_BREAK, STM_CONTINUE, STM_DECL, STM_ASSIGN, STM_CALL, STM_DEFER, }; struct ast_statement { enum statement action; union { struct ast_return ret; const char *brklabel; struct ast_declaration decl; struct ast_assign assign; struct call_e call; } stmt; }; struct ast_elseif { struct ast_expr cond; struct ast_block blk; }; struct ast_if { struct ast_expr cond; struct ast_block blk; struct ast_elseif *alts; struct ast_block *alt; int altsz, altlen; }; struct ast_for { const char *label; struct ast_assignment *init; struct ast_expr cond; struct ast_assignment *action; struct ast_block blk; }; enum control { CTL_IF, CTL_FOR, }; struct ast_control { enum control kind; union { struct ast_if branch; struct ast_for loop; } ctl; }; enum command { CMD_BLOCK, CMD_STATEMENT, CMD_CONTROL, }; struct ast_cmd { enum command kind; union { struct ast_block blk; struct ast_statement stmt; struct ast_control ctl; } cmd; }; struct ast_func { bool exported; const char *name; struct type ret; struct ast_param *params; int paramsz, paramlen; struct ast_block block; }; enum const_global { CST_TYPE, CST_BOOL, CST_NUMBER, CST_STRING, }; struct ast_const_global { const char *name; enum const_global kind; union { struct type type; bool b; struct number num; char *str; } value; }; struct ast_import { struct path path; const char *name; }; enum toplevel { TOP_EXTERNFUNC, TOP_FUNC, TOP_CONST, }; struct ast_toplevel { enum toplevel kind; union { struct ast_externfunc *extfn; struct ast_func *function; struct ast_const_global *constant; } decl; }; struct ast_unit { struct ast_import *imports; struct ast_toplevel *tops; int impsz, implen; int topsz, toplen; }; void parse(struct lexer *lexer, struct ast_unit *ast); #endif