From ae858894b980bdff89a43891db803e228b81c61a Mon Sep 17 00:00:00 2001 From: Maxwell Jeffress Date: Sun, 11 May 2025 13:55:52 +1000 Subject: [PATCH] Fix loops --- examples/loop.io | 4 ++-- src/Interpreter.cpp | 35 ++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/examples/loop.io b/examples/loop.io index 1a3b36b..b4d4036 100644 --- a/examples/loop.io +++ b/examples/loop.io @@ -1,8 +1,8 @@ let int myNum 1; -while myNum != 1001 { +while myNum != 1000 { println myNum; myNum = myNum + 1; } -println "The loop has ended"; +println "Finished"; diff --git a/src/Interpreter.cpp b/src/Interpreter.cpp index fb62784..e39703c 100644 --- a/src/Interpreter.cpp +++ b/src/Interpreter.cpp @@ -249,20 +249,17 @@ void Interpreter::executeCode(vector tokens) { if (skipScope > 0) { int braceCount = 0; while (i < tokens.size()) { - int braceCount = 0; - while (i < tokens.size()) { - if (tokens[i].keyword == keywords::OBRAC) { - braceCount ++; - } else if (tokens[i].keyword == keywords::CBRAC) { - if (braceCount == 0) { - skipScope --; - break; - } else { - braceCount --; - } + if (tokens[i].keyword == keywords::OBRAC) { + braceCount ++; + } else if (tokens[i].keyword == keywords::CBRAC) { + if (braceCount == 0) { + skipScope --; + break; + } else { + braceCount --; } - i++; } + i++; } } if (repeatScope > 0) { @@ -414,10 +411,18 @@ void Interpreter::executeCode(vector tokens) { loop = tokenIndex - 2 - lengthOfLine; repeatScope ++; log.debug("While loop condition is true, will skip back to " + to_string(loop)); + } else if (!get(tokens[i].value.value)) { + int braceLevel = 0; + while (++i < tokens.size()) { + if (tokens[i].keyword == keywords::OBRAC) braceLevel ++; + else if (tokens[i].keyword == keywords::CBRAC) { + if (braceLevel == 0) break; + braceLevel --; + } + break; + } } else { - log.debug("Condition is false, skipping scope"); - skipScope ++; - return; + syntaxError.generalError("Achievement get: How did we get here?"); } } else { if (tokens[i].keyword == keywords::VALUE && tokens[i].value.type == valtype::STR && variables.find(get(tokens[i].value.value)) != variables.end()) {