From 9d2293baa6ecf61dce2c3ac57b03fb2095d29e0e Mon Sep 17 00:00:00 2001 From: Blendi Date: Thu, 16 Apr 2026 12:08:01 +0200 Subject: [PATCH] while loop parsing --- src/main.c | 2 +- src/parser.c | 31 +++++++++++++++++++++++++++++++ src/parser.h | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 1cffbb6..ff856f5 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 = "if false or true then elseif true or false then else end"; + const char* code = "while true do end"; noom_uint_t pos = 0; printf("LEX OUTPUT:\n"); diff --git a/src/parser.c b/src/parser.c index 39c447f..43722f3 100644 --- a/src/parser.c +++ b/src/parser.c @@ -459,6 +459,37 @@ noomP_Node* noomP_parseRawStatement(noomP_Parser* parser) { noomP_skip(parser, &token); return ifStatement; + } else if (noom_streql(parser->code + token.offset, token.length, "while", 5)) { + noomP_skip(parser, &token); // skip `while` + + noomP_Node* node = noomP_allocNode(parser); + if (node == 0) return 0; + + node->type = NOOMP_NODE_WHILELOOP; + node->source_offset = token.offset; + + noomP_Node* cond = noomP_parseExpression(parser); + if (cond == 0) return 0; + + noomP_addSubnode(node, cond); + + noomP_peek(parser, &token); + + if (token.type != NOOML_TOKEN_KEYWORD) return 0; // unexpected + if (!noom_streql(parser->code + token.offset, token.length, "do", 2)) return 0; // unexpected + noomP_skip(parser, &token); // skip `do` + + noomP_Node* block = noomP_parseBlock(parser); + if (block == 0) return 0; + + noomP_addSubnode(node, block); + + noomP_peek(parser, &token); + if (token.type != NOOML_TOKEN_KEYWORD) return 0; // unexpected + if (!noom_streql(parser->code + token.offset, token.length, "end", 3)) return 0; // unexpected + noomP_skip(parser, &token); // skip `end` + + return node; } } diff --git a/src/parser.h b/src/parser.h index 16cb4eb..2b34981 100644 --- a/src/parser.h +++ b/src/parser.h @@ -8,6 +8,7 @@ typedef enum noomP_NodeType { NOOMP_NODE_LOCALDECLARATION, NOOMP_NODE_IFSTATEMENT, + NOOMP_NODE_WHILELOOP, NOOMP_NODE_BLOCK, NOOMP_NODE_VARIABLE,