the hito embeddable programming language
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