while loop parsing

This commit is contained in:
2026-04-16 12:08:01 +02:00
parent b260b49b62
commit 9d2293baa6
3 changed files with 33 additions and 1 deletions

View File

@@ -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");

View File

@@ -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;
}
}

View File

@@ -8,6 +8,7 @@ typedef enum noomP_NodeType {
NOOMP_NODE_LOCALDECLARATION,
NOOMP_NODE_IFSTATEMENT,
NOOMP_NODE_WHILELOOP,
NOOMP_NODE_BLOCK,
NOOMP_NODE_VARIABLE,