aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-24 14:14:31 +0200
committerBad Diode <bd@badd10de.dev>2021-10-24 14:14:31 +0200
commit76821f9d76282419823f3c85b042ad72863d4077 (patch)
treef2edfd78fd706b85738f533ae895f62c94676056 /src/bytecode
parentb97e4450a7ce377a1d50cac5342b7b1dd1a19add (diff)
downloadbdl-76821f9d76282419823f3c85b042ad72863d4077.tar.gz
bdl-76821f9d76282419823f3c85b042ad72863d4077.zip
Add set! keyword and OP
Diffstat (limited to 'src/bytecode')
-rwxr-xr-xsrc/bytecode/compiler.h13
-rwxr-xr-xsrc/bytecode/debug.h3
-rwxr-xr-xsrc/bytecode/lexer.c2
-rwxr-xr-xsrc/bytecode/lexer.h1
-rwxr-xr-xsrc/bytecode/ops.h3
-rwxr-xr-xsrc/bytecode/vm.h12
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
185void 185void
186compile_define_op(Chunk *chunk, Visitor *vs, Token start) { 186compile_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
234void 234void
@@ -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) {