the hito embeddable programming language
at main 91 lines 1.8 kB view raw
1#ifndef syntax_h 2#define syntax_h 3#include "lexer.h" 4#include "intern.h" 5#include "scope.h" 6#include "bitset.h" 7#include "builtins.h" 8#include <stdbool.h> 9typedef struct expr expr_t; 10 11typedef struct { 12 expr_t *expr; 13 size_t bound_vars; 14} pattern_t; 15 16struct expr { 17 enum { 18 EXPR_CALL, 19 EXPR_VAR, 20 EXPR_PAT_IDENT, 21 EXPR_CONSTRUCTOR, 22 EXPR_INT_LIT, 23 EXPR_FLOAT_LIT, 24 EXPR_LET_BINDING, 25 EXPR_STRING_LIT, 26 EXPR_TUPLE, 27 EXPR_LAMBDA, 28 EXPR_LAMBDA_COMPILED, 29 EXPR_GROUP, 30 EXPR_ALT, 31 EXPR_SEQ, 32 EXPR_BUILTIN, 33 } tag; 34 source_t *source; 35 pos_t pos; 36 union { 37 struct { 38 expr_t *callee; 39 expr_t **arguments; 40 size_t nargs; 41 } call; 42 struct { 43 expr_t *try; 44 expr_t *orelse; 45 } alt; 46 struct { 47 expr_t *first; 48 expr_t *then; 49 } seq; 50 struct { 51 pattern_t pattern; 52 expr_t *expr; 53 expr_t *in; 54 } let_binding; 55 de_bruijn_t var; 56 builtin_func_t *builtin; 57 intern_t ident; 58 intern_t constructor; 59 long int_lit; 60 double float_lit; 61 char *string_lit; 62 struct { 63 size_t args; 64 expr_t *body; 65 bitset_t *mask; 66 size_t num_lets; 67 } lambda; 68 struct { 69 expr_t** clauses; 70 size_t nclauses; 71 } group; 72 struct { 73 expr_t** elements; 74 size_t nelements; 75 } tuple; 76 struct { 77 expr_t** patterns; 78 size_t npatterns; 79 expr_t *body; 80 } lambda_raw; 81 } as; 82}; 83 84 85expr_t *syntax_parse_expr(lexer_t *lexer, builtins_t *builtins, intern_table_t *table); 86 87/* returns the amount of local binding slots required to evaluate this expression */ 88size_t syntax_expr_required_locals(expr_t *it); 89void syntax_expr_free(expr_t *it); 90void syntax_dump_expr(expr_t *it); 91#endif