From 76821f9d76282419823f3c85b042ad72863d4077 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 24 Oct 2021 14:14:31 +0200 Subject: Add set! keyword and OP --- src/bytecode/compiler.h | 13 +++++++------ src/bytecode/debug.h | 3 ++- src/bytecode/lexer.c | 2 ++ src/bytecode/lexer.h | 1 + src/bytecode/ops.h | 3 ++- src/bytecode/vm.h | 12 +++++++++++- 6 files changed, 25 insertions(+), 9 deletions(-) (limited to 'src/bytecode') 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) { } parse_tree(chunk, vs); if (tok.type == TOKEN_SYMBOL) { - add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); + add_code(chunk, OP_GET, tok.line, tok.column); } n++; } @@ -127,7 +127,7 @@ compile_list_unary_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { } parse_tree(chunk, vs); if (tok.type == TOKEN_SYMBOL) { - add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); + add_code(chunk, OP_GET, tok.line, tok.column); } add_code(chunk, op, start.line, start.column); n++; @@ -183,7 +183,7 @@ compile_list_simple_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { } void -compile_define_op(Chunk *chunk, Visitor *vs, Token start) { +compile_declare_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { Token name = peek_token(vs); if (name.type != TOKEN_SYMBOL) { error_push((Error){ @@ -216,7 +216,7 @@ compile_define_op(Chunk *chunk, Visitor *vs, Token start) { } parse_tree(chunk, vs); if (expr.type == TOKEN_SYMBOL) { - add_code(chunk, OP_GET_GLOBAL, expr.line, expr.column); + add_code(chunk, OP_GET, expr.line, expr.column); } if (peek_token(vs).type != TOKEN_RPAREN) { error_push((Error){ @@ -228,7 +228,7 @@ compile_define_op(Chunk *chunk, Visitor *vs, Token start) { return; } next_token(vs); - add_code(chunk, OP_DEF, start.line, start.column); + add_code(chunk, op, start.line, start.column); } void @@ -260,7 +260,8 @@ parse_list(Chunk *chunk, Visitor *vs, Token start) { case TOKEN_PRINT: { compile_list_unary_op(chunk, vs, start, OP_PRINT); } break; case TOKEN_DISPLAY: { compile_list_unary_op(chunk, vs, start, OP_DISPLAY); } break; case TOKEN_NEWLINE: { compile_list_simple_op(chunk, vs, start, OP_NEWLINE); } break; - case TOKEN_DEF: { compile_define_op(chunk, vs, start); } break; + case TOKEN_DEF: { compile_declare_op(chunk, vs, start, OP_DEF); } break; + case TOKEN_SET: { compile_declare_op(chunk, vs, start, OP_SET); } break; default: { error_push((Error){ .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[] = { // Load/store ops. [OP_CONSTANT] = "OP_CONSTANT", [OP_DEF] = "OP_DEF", - [OP_GET_GLOBAL] = "OP_GET_GLOBAL", + [OP_SET] = "OP_SET", + [OP_GET] = "OP_GET", // Arithmetic ops. [OP_SUM] = "OP_SUM", [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[] = { [TOKEN_IF] = "TOKEN_IF", [TOKEN_ELSE] = "TOKEN_ELSE", [TOKEN_DEF] = "TOKEN_DEF", + [TOKEN_SET] = "TOKEN_SET", [TOKEN_FUN] = "TOKEN_FUN", [TOKEN_LAMBDA] = "TOKEN_LAMBDA", [TOKEN_DISPLAY] = "TOKEN_DISPLAY", @@ -147,6 +148,7 @@ find_primitive_type(const StringView value) { if (TOKEN_IS_KEYWORD(value, "if")) { return TOKEN_IF; } if (TOKEN_IS_KEYWORD(value, "else")) { return TOKEN_ELSE; } if (TOKEN_IS_KEYWORD(value, "def")) { return TOKEN_DEF; } + if (TOKEN_IS_KEYWORD(value, "set!")) { return TOKEN_SET; } if (TOKEN_IS_KEYWORD(value, "fun")) { return TOKEN_FUN; } if (TOKEN_IS_KEYWORD(value, "lambda")) { return TOKEN_LAMBDA; } 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 { TOKEN_IF, TOKEN_ELSE, TOKEN_DEF, + TOKEN_SET, TOKEN_FUN, TOKEN_LAMBDA, 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 { // Load/store ops. OP_CONSTANT, OP_DEF, - OP_GET_GLOBAL, + OP_SET, + OP_GET, // Arithmetic ops. OP_SUM, 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) { Object name = array_pop(vm->stack); ht_insert(vm->globals, name, value); } break; - case OP_GET_GLOBAL: { + case OP_SET: { + Object value = array_pop(vm->stack); + Object name = array_pop(vm->stack); + Object *prev = ht_lookup(vm->globals, name); + if (prev == NULL) { + SYMBOL_NOT_FOUND_ERR(); + return; + } + ht_insert(vm->globals, name, value); + } break; + case OP_GET: { Object name = array_pop(vm->stack); Object *value = ht_lookup(vm->globals, name); if (value == NULL) { -- cgit v1.2.1