From 84b0af8090196a06dceb676e926236d732692cc2 Mon Sep 17 00:00:00 2001 From: bog Date: Sun, 27 Aug 2023 00:14:02 +0200 Subject: [PATCH] ADD: continue keyword. --- src/block_info.h | 1 + src/compiler.c | 14 ++++++++++++-- src/parser.y | 9 ++++++++- tests/test_while.wuz | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/block_info.h b/src/block_info.h index 2b70000..efbdc85 100644 --- a/src/block_info.h +++ b/src/block_info.h @@ -5,6 +5,7 @@ enum BlockInfoHints { HINT_END, + HINT_START }; enum BlockInfoKind { diff --git a/src/compiler.c b/src/compiler.c index a0d4856..9fa5ac0 100644 --- a/src/compiler.c +++ b/src/compiler.c @@ -111,7 +111,6 @@ void compile_node(compiler* self, node* root, program* prog) for (size_t i=0; isize; i++) { size_t addr = info->data[i]->addr; - int hint = info->data[i]->hint; program_set_param(prog, addr, prog->instrs.size); } @@ -136,7 +135,12 @@ void compile_node(compiler* self, node* root, program* prog) for (size_t i=0; isize; i++) { - if (bi->data[i]->hint == HINT_END) + if (bi->data[i]->hint == HINT_START) + { + program_set_param(prog, bi->data[i]->addr, + start_addr); + } + else if (bi->data[i]->hint == HINT_END) { program_set_param(prog, bi->data[i]->addr, prog->instrs.size); @@ -151,6 +155,12 @@ void compile_node(compiler* self, node* root, program* prog) block_info_push(bi, prog->instrs.size, HINT_END); program_add_instr(prog, OP_BR, NO_PARAM); } + else if (root->type == NODE_CONTINUE) + { + block_info* bi = compiler_find_info(self, INFO_KIND_LOOP); + block_info_push(bi, prog->instrs.size, HINT_START); + program_add_instr(prog, OP_BR, NO_PARAM); + } else if (root->type == NODE_INDEX) { compile_children(self, root, prog); diff --git a/src/parser.y b/src/parser.y index 416a217..52e962a 100644 --- a/src/parser.y +++ b/src/parser.y @@ -85,7 +85,14 @@ exprs: expr: - BREAK { + CONTINUE { + node* n = malloc(sizeof(node)); + node_init(n, NODE_CONTINUE, "", line); + stack_push(n); + $$ = 1; + } + + | BREAK { node* n = malloc(sizeof(node)); node_init(n, NODE_BREAK, "", line); stack_push(n); diff --git a/tests/test_while.wuz b/tests/test_while.wuz index fe12c29..9a3c6ba 100644 --- a/tests/test_while.wuz +++ b/tests/test_while.wuz @@ -34,3 +34,22 @@ end assert 17 == e +let! f = 0 +let! g = 0 + +while f < 100 + f = f + 1 + + if f % 2 == 0 + continue + end + + if f >= 50 + break + end + + g = g + 1 +end + +assert 51 == f +assert 25 == g