diff options
author | Bad Diode <bd@badd10de.dev> | 2022-02-12 19:06:09 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-02-12 19:06:09 +0100 |
commit | fa32ad3224b3e362e5f79eee8785334f4bebdbc8 (patch) | |
tree | 4c5cb46baa8dc010921d755f157d6e23db9ce5d0 /src/parser.h | |
parent | c4765a539ee01625dd310a02f0be16ec9a64e2e4 (diff) | |
download | bdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.tar.gz bdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.zip |
Add boilerplate for parser
Diffstat (limited to 'src/parser.h')
-rw-r--r-- | src/parser.h | 188 |
1 files changed, 38 insertions, 150 deletions
diff --git a/src/parser.h b/src/parser.h index 2604be4..3e016d3 100644 --- a/src/parser.h +++ b/src/parser.h | |||
@@ -3,162 +3,50 @@ | |||
3 | 3 | ||
4 | #include "lexer.h" | 4 | #include "lexer.h" |
5 | 5 | ||
6 | typedef struct Environment { | ||
7 | struct Object **locals; | ||
8 | struct Object **local_values; | ||
9 | struct Object **params; | ||
10 | struct Object **captured; | ||
11 | struct Environment *parent; | ||
12 | } Environment; | ||
13 | |||
14 | typedef enum ObjectType { | ||
15 | OBJ_TYPE_NIL, | ||
16 | OBJ_TYPE_TRUE, | ||
17 | OBJ_TYPE_FALSE, | ||
18 | OBJ_TYPE_FIXNUM, | ||
19 | OBJ_TYPE_SYMBOL, | ||
20 | OBJ_TYPE_STRING, | ||
21 | OBJ_TYPE_PAIR, | ||
22 | OBJ_TYPE_LAMBDA, | ||
23 | OBJ_TYPE_IF, | ||
24 | OBJ_TYPE_DEF, | ||
25 | OBJ_TYPE_SET, | ||
26 | OBJ_TYPE_BUILTIN, | ||
27 | } ObjectType; | ||
28 | |||
29 | typedef enum Builtin { | ||
30 | BUILTIN_ADD, | ||
31 | BUILTIN_SUB, | ||
32 | BUILTIN_MUL, | ||
33 | BUILTIN_DIV, | ||
34 | BUILTIN_MOD, | ||
35 | BUILTIN_EQ, | ||
36 | BUILTIN_LT, | ||
37 | BUILTIN_GT, | ||
38 | BUILTIN_LE, | ||
39 | BUILTIN_GE, | ||
40 | BUILTIN_NOT, | ||
41 | BUILTIN_AND, | ||
42 | BUILTIN_OR, | ||
43 | BUILTIN_IS_NIL, | ||
44 | BUILTIN_IS_ZERO, | ||
45 | BUILTIN_IS_FIXNUM, | ||
46 | BUILTIN_IS_BOOL, | ||
47 | BUILTIN_PRINT, | ||
48 | BUILTIN_CONS, | ||
49 | BUILTIN_CAR, | ||
50 | BUILTIN_CDR, | ||
51 | } Builtin; | ||
52 | |||
53 | typedef struct Object { | ||
54 | ObjectType type; | ||
55 | union { | ||
56 | // OBJ_TYPE_FIXNUM | ||
57 | ssize_t fixnum; | ||
58 | |||
59 | // OBJ_TYPE_STRING | ||
60 | // OBJ_TYPE_SYMBOL | ||
61 | StringView text; | ||
62 | |||
63 | // OBJ_TYPE_PAIR | ||
64 | struct { | ||
65 | struct Object *head; | ||
66 | struct Object *tail; | ||
67 | size_t n_elems; | ||
68 | }; | ||
69 | |||
70 | // OBJ_TYPE_LAMBDA | ||
71 | struct { | ||
72 | struct Object **params; | ||
73 | struct Object **body; | ||
74 | Environment *env; | ||
75 | }; | ||
76 | |||
77 | // OBJ_TYPE_IF | ||
78 | struct { | ||
79 | struct Object *condition; | ||
80 | struct Object *expr_true; | ||
81 | struct Object *expr_false; | ||
82 | }; | ||
83 | |||
84 | // OBJ_TYPE_DEF | ||
85 | // OBJ_TYPE_SET | ||
86 | struct { | ||
87 | struct Object *var_name; | ||
88 | struct Object *var_expr; | ||
89 | }; | ||
90 | |||
91 | // OBJ_TYPE_BUILTIN | ||
92 | struct { | ||
93 | Builtin builtin; | ||
94 | StringView builtin_text; | ||
95 | }; | ||
96 | }; | ||
97 | |||
98 | bool visited; | ||
99 | size_t line; | ||
100 | size_t col; | ||
101 | } Object; | ||
102 | |||
103 | typedef struct Parser { | 6 | typedef struct Parser { |
104 | Token *tokens; | 7 | Token *tokens; |
105 | size_t current; | 8 | size_t current; |
106 | } Parser; | 9 | } Parser; |
107 | 10 | ||
108 | typedef Object* Root; | 11 | typedef enum NodeType { |
109 | 12 | NODE_ERR, | |
110 | typedef struct Program { | 13 | // NODE_FUNCALL, |
111 | Root *roots; | 14 | // NODE_U64, |
112 | Environment *env; | 15 | // NODE_U32, |
113 | } Program; | 16 | // NODE_U16, |
114 | 17 | // NODE_U8, | |
115 | // Token scanner. | 18 | // NODE_S64, |
116 | Token next_token(Parser *parser); | 19 | // NODE_S32, |
117 | Token previous_token(Parser *parser); | 20 | // NODE_S16, |
118 | Token rewind_token(Parser *parser); | 21 | // NODE_S8, |
119 | Token peek_token(const Parser *parser); | 22 | NODE_NUMBER, |
120 | bool has_next_token(const Parser *parser); | 23 | NODE_STRING, |
121 | 24 | } NodeType; | |
122 | // Parsing operations. | 25 | |
123 | Object * parse_tree(Parser *parser, Errors *errors); | 26 | typedef struct Node { |
124 | Object * parse_symbol(Token tok); | 27 | NodeType type; |
125 | Object * parse_string(Token tok); | ||
126 | Object * parse_bool(Token tok); | ||
127 | Object * parse_fixnum(Token tok); | ||
128 | Object * parse_list(Parser *parser, Errors *errors); | ||
129 | Object * parse_lambda(Parser *parser, Errors *errors); | ||
130 | Object * parse_if(Parser *parser, Errors *errors); | ||
131 | Object * parse_var(Parser *parser, Errors *errors); | ||
132 | Program parse(Token *tokens, Errors *errors); | ||
133 | 28 | ||
134 | // Object operations. | 29 | union { |
135 | void object_display(Object *obj); | 30 | // Integer numbers. |
136 | bool object_equal(Object *a, Object *b); | 31 | // u64 as_u64; |
137 | 32 | // u32 as_u32; | |
138 | // Manage resources. | 33 | // u16 as_u16; |
139 | Environment * env_alloc(Environment *parent); | 34 | // u8 as_u8; |
140 | Object * object_alloc(Token tok, ObjectType type); | 35 | // s64 as_s64; |
141 | void object_free(Object *node); | 36 | // s32 as_s32; |
142 | void free_objects(void); | 37 | // s16 as_s16; |
143 | 38 | // s8 as_s8; | |
144 | // | 39 | s64 number; |
145 | // Helper macros. | 40 | |
146 | // | 41 | // String. |
147 | 42 | StringView string; | |
148 | // Type checking. | 43 | // struct { |
149 | #define IS_NIL(VAL) ((VAL)->type == OBJ_TYPE_NIL) | 44 | // u8 *str; |
150 | #define IS_TRUE(VAL) ((VAL)->type != OBJ_TYPE_FALSE) | 45 | // u64 n; |
151 | #define IS_FALSE(VAL) ((VAL)->type == OBJ_TYPE_FALSE) | 46 | // } as_str; |
152 | #define IS_BOOL(VAL) \ | 47 | }; |
153 | (((VAL)->type == OBJ_TYPE_FALSE) || ((VAL)->type == OBJ_TYPE_TRUE)) | 48 | } Node; |
154 | #define IS_FIXNUM(VAL) ((VAL)->type == OBJ_TYPE_FIXNUM) | ||
155 | #define IS_STRING(VAL) ((VAL)->type == OBJ_TYPE_STRING) | ||
156 | #define IS_SYMBOL(VAL) ((VAL)->type == OBJ_TYPE_SYMBOL) | ||
157 | #define IS_PAIR(VAL) ((VAL)->type == OBJ_TYPE_PAIR) | ||
158 | #define IS_LAMBDA(VAL) ((VAL)->type == OBJ_TYPE_LAMBDA) | ||
159 | #define IS_BUILTIN(VAL) ((VAL)->type == OBJ_TYPE_BUILTIN) | ||
160 | 49 | ||
161 | // Debug. | 50 | void parse(Token *tokens); |
162 | #define OBJ_PRINT(OBJ) object_display(OBJ); printf("\n"); | ||
163 | 51 | ||
164 | #endif // BDL_PARSER_H | 52 | #endif // BDL_PARSER_H |