diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/bytecode/compiler.h | 13 | ||||
-rwxr-xr-x | src/bytecode/debug.h | 3 | ||||
-rwxr-xr-x | src/bytecode/lexer.c | 2 | ||||
-rwxr-xr-x | src/bytecode/lexer.h | 1 | ||||
-rwxr-xr-x | src/bytecode/ops.h | 3 | ||||
-rwxr-xr-x | src/bytecode/vm.h | 12 |
6 files changed, 25 insertions, 9 deletions
diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index e2d5819..b1cdfb9 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h | |||
@@ -91,7 +91,7 @@ compile_list_binary_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { | |||
91 | } | 91 | } |
92 | parse_tree(chunk, vs); | 92 | parse_tree(chunk, vs); |
93 | if (tok.type == TOKEN_SYMBOL) { | 93 | if (tok.type == TOKEN_SYMBOL) { |
94 | add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); | 94 | add_code(chunk, OP_GET, tok.line, tok.column); |
95 | } | 95 | } |
96 | n++; | 96 | n++; |
97 | } | 97 | } |
@@ -127,7 +127,7 @@ compile_list_unary_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { | |||
127 | } | 127 | } |
128 | parse_tree(chunk, vs); | 128 | parse_tree(chunk, vs); |
129 | if (tok.type == TOKEN_SYMBOL) { | 129 | if (tok.type == TOKEN_SYMBOL) { |
130 | add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); | 130 | add_code(chunk, OP_GET, tok.line, tok.column); |
131 | } | 131 | } |
132 | add_code(chunk, op, start.line, start.column); | 132 | add_code(chunk, op, start.line, start.column); |
133 | n++; | 133 | n++; |
@@ -183,7 +183,7 @@ compile_list_simple_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { | |||
183 | } | 183 | } |
184 | 184 | ||
185 | void | 185 | void |
186 | compile_define_op(Chunk *chunk, Visitor *vs, Token start) { | 186 | compile_declare_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { |
187 | Token name = peek_token(vs); | 187 | Token name = peek_token(vs); |
188 | if (name.type != TOKEN_SYMBOL) { | 188 | if (name.type != TOKEN_SYMBOL) { |
189 | error_push((Error){ | 189 | error_push((Error){ |
@@ -216,7 +216,7 @@ compile_define_op(Chunk *chunk, Visitor *vs, Token start) { | |||
216 | } | 216 | } |
217 | parse_tree(chunk, vs); | 217 | parse_tree(chunk, vs); |
218 | if (expr.type == TOKEN_SYMBOL) { | 218 | if (expr.type == TOKEN_SYMBOL) { |
219 | add_code(chunk, OP_GET_GLOBAL, expr.line, expr.column); | 219 | add_code(chunk, OP_GET, expr.line, expr.column); |
220 | } | 220 | } |
221 | if (peek_token(vs).type != TOKEN_RPAREN) { | 221 | if (peek_token(vs).type != TOKEN_RPAREN) { |
222 | error_push((Error){ | 222 | error_push((Error){ |
@@ -228,7 +228,7 @@ compile_define_op(Chunk *chunk, Visitor *vs, Token start) { | |||
228 | return; | 228 | return; |
229 | } | 229 | } |
230 | next_token(vs); | 230 | next_token(vs); |
231 | add_code(chunk, OP_DEF, start.line, start.column); | 231 | add_code(chunk, op, start.line, start.column); |
232 | } | 232 | } |
233 | 233 | ||
234 | void | 234 | void |
@@ -260,7 +260,8 @@ parse_list(Chunk *chunk, Visitor *vs, Token start) { | |||
260 | case TOKEN_PRINT: { compile_list_unary_op(chunk, vs, start, OP_PRINT); } break; | 260 | case TOKEN_PRINT: { compile_list_unary_op(chunk, vs, start, OP_PRINT); } break; |
261 | case TOKEN_DISPLAY: { compile_list_unary_op(chunk, vs, start, OP_DISPLAY); } break; | 261 | case TOKEN_DISPLAY: { compile_list_unary_op(chunk, vs, start, OP_DISPLAY); } break; |
262 | case TOKEN_NEWLINE: { compile_list_simple_op(chunk, vs, start, OP_NEWLINE); } break; | 262 | case TOKEN_NEWLINE: { compile_list_simple_op(chunk, vs, start, OP_NEWLINE); } break; |
263 | case TOKEN_DEF: { compile_define_op(chunk, vs, start); } break; | 263 | case TOKEN_DEF: { compile_declare_op(chunk, vs, start, OP_DEF); } break; |
264 | case TOKEN_SET: { compile_declare_op(chunk, vs, start, OP_SET); } break; | ||
264 | default: { | 265 | default: { |
265 | error_push((Error){ | 266 | error_push((Error){ |
266 | .type = ERR_TYPE_COMPILER, | 267 | .type = ERR_TYPE_COMPILER, |
diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index dc0585b..889ae03 100755 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h | |||
@@ -10,7 +10,8 @@ static const char* ops_str[] = { | |||
10 | // Load/store ops. | 10 | // Load/store ops. |
11 | [OP_CONSTANT] = "OP_CONSTANT", | 11 | [OP_CONSTANT] = "OP_CONSTANT", |
12 | [OP_DEF] = "OP_DEF", | 12 | [OP_DEF] = "OP_DEF", |
13 | [OP_GET_GLOBAL] = "OP_GET_GLOBAL", | 13 | [OP_SET] = "OP_SET", |
14 | [OP_GET] = "OP_GET", | ||
14 | // Arithmetic ops. | 15 | // Arithmetic ops. |
15 | [OP_SUM] = "OP_SUM", | 16 | [OP_SUM] = "OP_SUM", |
16 | [OP_SUB] = "OP_SUB", | 17 | [OP_SUB] = "OP_SUB", |
diff --git a/src/bytecode/lexer.c b/src/bytecode/lexer.c index d157111..c16673b 100755 --- a/src/bytecode/lexer.c +++ b/src/bytecode/lexer.c | |||
@@ -14,6 +14,7 @@ static const char* token_str[] = { | |||
14 | [TOKEN_IF] = "TOKEN_IF", | 14 | [TOKEN_IF] = "TOKEN_IF", |
15 | [TOKEN_ELSE] = "TOKEN_ELSE", | 15 | [TOKEN_ELSE] = "TOKEN_ELSE", |
16 | [TOKEN_DEF] = "TOKEN_DEF", | 16 | [TOKEN_DEF] = "TOKEN_DEF", |
17 | [TOKEN_SET] = "TOKEN_SET", | ||
17 | [TOKEN_FUN] = "TOKEN_FUN", | 18 | [TOKEN_FUN] = "TOKEN_FUN", |
18 | [TOKEN_LAMBDA] = "TOKEN_LAMBDA", | 19 | [TOKEN_LAMBDA] = "TOKEN_LAMBDA", |
19 | [TOKEN_DISPLAY] = "TOKEN_DISPLAY", | 20 | [TOKEN_DISPLAY] = "TOKEN_DISPLAY", |
@@ -147,6 +148,7 @@ find_primitive_type(const StringView value) { | |||
147 | if (TOKEN_IS_KEYWORD(value, "if")) { return TOKEN_IF; } | 148 | if (TOKEN_IS_KEYWORD(value, "if")) { return TOKEN_IF; } |
148 | if (TOKEN_IS_KEYWORD(value, "else")) { return TOKEN_ELSE; } | 149 | if (TOKEN_IS_KEYWORD(value, "else")) { return TOKEN_ELSE; } |
149 | if (TOKEN_IS_KEYWORD(value, "def")) { return TOKEN_DEF; } | 150 | if (TOKEN_IS_KEYWORD(value, "def")) { return TOKEN_DEF; } |
151 | if (TOKEN_IS_KEYWORD(value, "set!")) { return TOKEN_SET; } | ||
150 | if (TOKEN_IS_KEYWORD(value, "fun")) { return TOKEN_FUN; } | 152 | if (TOKEN_IS_KEYWORD(value, "fun")) { return TOKEN_FUN; } |
151 | if (TOKEN_IS_KEYWORD(value, "lambda")) { return TOKEN_LAMBDA; } | 153 | if (TOKEN_IS_KEYWORD(value, "lambda")) { return TOKEN_LAMBDA; } |
152 | if (TOKEN_IS_KEYWORD(value, "display")) { return TOKEN_DISPLAY; } | 154 | if (TOKEN_IS_KEYWORD(value, "display")) { return TOKEN_DISPLAY; } |
diff --git a/src/bytecode/lexer.h b/src/bytecode/lexer.h index 7f9eb24..3cadf30 100755 --- a/src/bytecode/lexer.h +++ b/src/bytecode/lexer.h | |||
@@ -23,6 +23,7 @@ typedef enum TokenType { | |||
23 | TOKEN_IF, | 23 | TOKEN_IF, |
24 | TOKEN_ELSE, | 24 | TOKEN_ELSE, |
25 | TOKEN_DEF, | 25 | TOKEN_DEF, |
26 | TOKEN_SET, | ||
26 | TOKEN_FUN, | 27 | TOKEN_FUN, |
27 | TOKEN_LAMBDA, | 28 | TOKEN_LAMBDA, |
28 | TOKEN_DISPLAY, | 29 | TOKEN_DISPLAY, |
diff --git a/src/bytecode/ops.h b/src/bytecode/ops.h index 783d3cf..50d12fe 100755 --- a/src/bytecode/ops.h +++ b/src/bytecode/ops.h | |||
@@ -5,7 +5,8 @@ typedef enum Ops { | |||
5 | // Load/store ops. | 5 | // Load/store ops. |
6 | OP_CONSTANT, | 6 | OP_CONSTANT, |
7 | OP_DEF, | 7 | OP_DEF, |
8 | OP_GET_GLOBAL, | 8 | OP_SET, |
9 | OP_GET, | ||
9 | // Arithmetic ops. | 10 | // Arithmetic ops. |
10 | OP_SUM, | 11 | OP_SUM, |
11 | OP_SUB, | 12 | OP_SUB, |
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index de025c1..51a6f44 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -160,7 +160,17 @@ vm_interpret(VM *vm, Chunk *chunk) { | |||
160 | Object name = array_pop(vm->stack); | 160 | Object name = array_pop(vm->stack); |
161 | ht_insert(vm->globals, name, value); | 161 | ht_insert(vm->globals, name, value); |
162 | } break; | 162 | } break; |
163 | case OP_GET_GLOBAL: { | 163 | case OP_SET: { |
164 | Object value = array_pop(vm->stack); | ||
165 | Object name = array_pop(vm->stack); | ||
166 | Object *prev = ht_lookup(vm->globals, name); | ||
167 | if (prev == NULL) { | ||
168 | SYMBOL_NOT_FOUND_ERR(); | ||
169 | return; | ||
170 | } | ||
171 | ht_insert(vm->globals, name, value); | ||
172 | } break; | ||
173 | case OP_GET: { | ||
164 | Object name = array_pop(vm->stack); | 174 | Object name = array_pop(vm->stack); |
165 | Object *value = ht_lookup(vm->globals, name); | 175 | Object *value = ht_lookup(vm->globals, name); |
166 | if (value == NULL) { | 176 | if (value == NULL) { |