From faf69726d4fc619bc55a2c1105bd542673cce342 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 18 Jun 2024 22:19:24 +0200 Subject: Add basic while loop --- src/main.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index 1c0d2e1..666a664 100644 --- a/src/main.c +++ b/src/main.c @@ -82,6 +82,7 @@ typedef enum NodeKind { NODE_ENUM, NODE_BREAK, NODE_CONTINUE, + NODE_WHILE, // Helpers. NODE_SYMBOL_IDX, NODE_TYPE, @@ -135,6 +136,7 @@ Str node_str[] = { [NODE_ENUM] = cstr("ENUM"), [NODE_BREAK] = cstr("BREAK"), [NODE_CONTINUE] = cstr("CONTINUE"), + [NODE_WHILE] = cstr("WHILE"), // Helpers. [NODE_TYPE] = cstr("TYPE"), [NODE_ARR_TYPE] = cstr("TYPE (ARR)"), @@ -171,6 +173,10 @@ typedef struct Node { struct Node *var_type; struct Node *var_val; }; + struct { + struct Node *while_cond; + struct Node *while_expr; + }; struct { struct Node *cond_if; struct Node *cond_expr; @@ -209,6 +215,7 @@ typedef struct Parser { // Error handling. bool err; bool panic; + Str file_name; // Storage. Node **nodes; @@ -328,7 +335,8 @@ parse_emit_err(Parser *parser, Token token, Str msg) { if (parser->panic) return; parser->panic = true; parser->err = true; - eprint("%d:%d: error: %s", token.line, token.col, msg); + eprint("%s:%d:%d: error: %s", parser->file_name, token.line, token.col, + msg); if (token.kind == TOK_EOF) { eprintln(" at end of the file"); @@ -675,6 +683,16 @@ parse_keyword(Parser *parser) { node = node_alloc(parser, NODE_CONTINUE, prev); if (!node) return; } break; + case TOK_WHILE: { + node = node_alloc(parser, NODE_WHILE, prev); + if (!node) return; + parse_expr(parser, PREC_LOW); + node->while_cond = array_pop(parser->nodes); + parse_consume(parser, TOK_ASSIGN, + cstr("malformed while expression")); + parse_expr(parser, PREC_LOW); + node->while_expr = array_pop(parser->nodes); + } break; default: return; // Unreachable. } array_push(parser->nodes, node, parser->storage); @@ -1009,6 +1027,7 @@ process_file(Str path) { Parser parser = { .tokens = tokens, .storage = &lexer_arena, + .file_name = path, }; array_init(parser.nodes, 256, parser.storage); parse_advance(&parser); -- cgit v1.2.1