#ifndef syntax_h #define syntax_h #include "lexer.h" #include "intern.h" #include "scope.h" #include "bitset.h" #include "builtins.h" #include typedef struct expr expr_t; typedef struct { expr_t *expr; size_t bound_vars; } pattern_t; struct expr { enum { EXPR_CALL, EXPR_VAR, EXPR_PAT_IDENT, EXPR_CONSTRUCTOR, EXPR_INT_LIT, EXPR_FLOAT_LIT, EXPR_LET_BINDING, EXPR_STRING_LIT, EXPR_TUPLE, EXPR_LAMBDA, EXPR_LAMBDA_COMPILED, EXPR_GROUP, EXPR_ALT, EXPR_SEQ, EXPR_BUILTIN, } tag; source_t *source; pos_t pos; union { struct { expr_t *callee; expr_t **arguments; size_t nargs; } call; struct { expr_t *try; expr_t *orelse; } alt; struct { expr_t *first; expr_t *then; } seq; struct { pattern_t pattern; expr_t *expr; expr_t *in; } let_binding; de_bruijn_t var; builtin_func_t *builtin; intern_t ident; intern_t constructor; long int_lit; double float_lit; char *string_lit; struct { size_t args; expr_t *body; bitset_t *mask; size_t num_lets; } lambda; struct { expr_t** clauses; size_t nclauses; } group; struct { expr_t** elements; size_t nelements; } tuple; struct { expr_t** patterns; size_t npatterns; expr_t *body; } lambda_raw; } as; }; expr_t *syntax_parse_expr(lexer_t *lexer, builtins_t *builtins, intern_table_t *table); /* returns the amount of local binding slots required to evaluate this expression */ size_t syntax_expr_required_locals(expr_t *it); void syntax_expr_free(expr_t *it); void syntax_dump_expr(expr_t *it); #endif