From 3534e7a3887998d880eab6d8d68d6f10139516db Mon Sep 17 00:00:00 2001 From: Blendi Date: Fri, 17 Apr 2026 19:22:02 +0200 Subject: [PATCH] parser: support break and fix local decl --- src/main.c | 2 +- src/parser.c | 29 +++++++++++++++++++++++++---- src/parser.h | 2 ++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index ff856f5..92fd55f 100644 --- a/src/main.c +++ b/src/main.c @@ -33,7 +33,7 @@ void print_node(noomP_Node* node, noom_uint_t depth) { int main(int argc, char** argv) { // uhh uhhh uhhhhh - const char* code = "while true do end"; + const char* code = "local a, b"; noom_uint_t pos = 0; printf("LEX OUTPUT:\n"); diff --git a/src/parser.c b/src/parser.c index 43722f3..95e4aef 100644 --- a/src/parser.c +++ b/src/parser.c @@ -349,18 +349,27 @@ noomP_Node* noomP_parseRawStatement(noomP_Parser* parser) { if (token.type == NOOML_TOKEN_SYMBOL) { if (noom_streql(parser->code + token.offset, token.length, "=", 1)) { - noomP_skip(parser, &token); + // noomP_skip(parser, &token); break; } else if (noom_streql(parser->code + token.offset, token.length, ",", 1)) { noomP_skip(parser, &token); } else { - return 0; // unexpected token + break; } } else { - return 0; // unexpected token + break; } } + noomP_peek(parser, &token); + + // local with no equals initializes to nil + if (token.type != NOOML_TOKEN_SYMBOL) return localNode; + if (!noom_streql(parser->code + token.offset, token.length, "=", 1)) { + return localNode; + } + noomP_skip(parser, &token); + // equals has already been eaten by loop (thank you loop) while (1) { @@ -490,7 +499,19 @@ noomP_Node* noomP_parseRawStatement(noomP_Parser* parser) { noomP_skip(parser, &token); // skip `end` return node; - } + } else if (noom_streql(parser->code + token.offset, token.length, "break", 5)) { + noomP_skip(parser, &token); // skip `break` + + // uhh yeah that's it i guess? idk. maybe parsers should figure out what loop? + // sounds like a thing for the compiler to bytecode though + noomP_Node* node = noomP_allocNode(parser); + if (node == 0) return 0; + + node->type = NOOMP_NODE_BREAK; + node->source_offset = token.offset; + + return node; + } else if (noom_streql(parser->code + token.offset, token.length, "break", 5)) {} } while (1) { diff --git a/src/parser.h b/src/parser.h index 2b34981..2b87ad9 100644 --- a/src/parser.h +++ b/src/parser.h @@ -10,6 +10,8 @@ typedef enum noomP_NodeType { NOOMP_NODE_IFSTATEMENT, NOOMP_NODE_WHILELOOP, NOOMP_NODE_BLOCK, + + NOOMP_NODE_BREAK, NOOMP_NODE_VARIABLE, NOOMP_NODE_NUMBERLITERAL,