#pragma once #include #include #include typedef enum ASTtype{ AST_BLOCK, AST_OP, AST_NUM, AST_STR, AST_VAR, AST_CALL, AST_IF, AST_WHILE, AST_FUNC, AST_PROGRAM, } ASTtype; typedef struct AST AST; typedef struct ASTblock{ int len; AST **exprs; } ASTblock; typedef struct ASTop{ const char *op; // Constant string, does not need to be freed AST *left,*right; } ASTop; typedef struct ASTnum{ bool isint; union { int64_t i; double d; }; } ASTnum; typedef struct ASTstr{ int len; // Excludes terminating null char char *str; // May contain null chars before terminating null char } ASTstr; typedef struct ASTvar{ char *name; } ASTvar; typedef struct ASTcall{ char *func; int nargs; AST **args; } ASTcall; typedef struct ASTif{ AST *cond; AST *thenb,*elseb; } ASTif; typedef struct ASTwhile{ AST *cond; AST *body; } ASTwhile; typedef struct ASTfunc{ char *name; int nargs; char **args; AST *body; } ASTfunc; typedef struct ASTprogram{ int nfuncs; AST **funcs; } ASTprogram; typedef struct AST{ ASTtype type; union { ASTblock b; ASTop o; ASTnum n; ASTstr s; ASTvar v; ASTcall c; ASTif i; ASTwhile w; ASTfunc f; ASTprogram p; }; } AST; typedef enum Associativity{ AS_PREFIX, AS_SUFFIX, AS_LEFT, AS_RIGHT, AS_NONASSOC } Associativity; AST* parse(const char *source,char **errmsg); void ast_debug(FILE *stream,const AST *ast); void ast_free(AST *ast);