From 4ea2876e8243a86276917e691a335caed7a8fd74 Mon Sep 17 00:00:00 2001 From: Nic Gaffney Date: Wed, 19 Feb 2025 18:28:18 -0600 Subject: Added while loop --- src/parser.zig | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/parser.zig') diff --git a/src/parser.zig b/src/parser.zig index b1581bb..ebd4b33 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -109,6 +109,7 @@ pub const NodeStmt = struct { for (blockChildren) |child| try childrenArray.append(child); }, .ifstmt => |ifstmt| try childrenArray.append(ifstmt.body.*.asNode()), + .whileStmt => |whilestmt| try childrenArray.append(whilestmt.body.*.asNode()), .function => |fun| if (fun.block == null) {} else try childrenArray.append(fun.block.?.asNode()), .expr => |expr| try childrenArray.append(expr.asNode()), } @@ -254,7 +255,7 @@ pub const Parser = struct { const precTable: []const []const tok.TokenType = &.{ &.{ .plus, .minus }, &.{ .star, .slash }, - &.{.eqleql}, + &.{ .eqleql, .lessthan }, }; return try self.genBinOp(precTable[0], typ, lhsptr) //. @@ -293,6 +294,7 @@ pub const Parser = struct { fn parseStmt(self: *Parser) ParsingError!NodeStmt { return switch (self.tokens.peek().?) { .ifstmt => try self.parseIf(), + .whilestmt => try self.parseWhile(), .exit => try self.parseExit(), .constant => try self.parseConstant(), .variable => try self.parseVariable(), @@ -318,6 +320,29 @@ pub const Parser = struct { }; } + fn parseWhile(self: *Parser) ParsingError!NodeStmt { + _ = try self.tokens.consume(.whilestmt); // if + + _ = try self.tokens.consume(.openParen); // ( + const expr = try self.parseExpr(); // EXPR + _ = try self.tokens.consume(.closeParen); // ) + + const body = try self.allocator.create(NodeStmt); + body.* = try self.parseStmt(); + + const kind = StmtKind{ + .whileStmt = .{ + .expr = expr, + .body = body, + }, + }; + return NodeStmt{ + .id = self.reserveId(), + .kind = kind, + .symtable = self.top, + }; + } + fn parseIf(self: *Parser) ParsingError!NodeStmt { _ = try self.tokens.consume(.ifstmt); // if @@ -340,6 +365,7 @@ pub const Parser = struct { .symtable = self.top, }; } + fn parseFunc(self: *Parser, external: bool) ParsingError!NodeStmt { if (external) _ = try self.tokens.consume(.import); var typ: ?TypeIdent = null; @@ -582,6 +608,11 @@ pub const NodeIf = struct { body: *NodeStmt, }; +pub const NodeWhile = struct { + expr: NodeExpr, + body: *NodeStmt, +}; + pub const NodeExit = NodeExpr; pub const NodeIntlit = Token; pub const NodeStringlit = Token; @@ -596,6 +627,7 @@ pub const NodeCall = struct { pub const StmtKind = union(enum) { ifstmt: NodeIf, + whileStmt: NodeWhile, function: NodeFunction, exit: NodeExit, defValue: NodeValue, -- cgit v1.2.3