From 4f0c43865f427558cd036923048dc43fe202cfa4 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 25 Aug 2019 17:14:25 -0300 Subject: [PATCH] add loop parsing --- examples/hello.v | 10 ++++++++++ src/ast.zig | 14 ++++++++++++++ src/parser.zig | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/examples/hello.v b/examples/hello.v index fa6b3ba..6bd25d9 100644 --- a/examples/hello.v +++ b/examples/hello.v @@ -20,4 +20,14 @@ fn main(a int) int { a && b a || b + + loop {} + loop { + println('Ballse') + } + + loop a > 2 {} + loop a > 2 { + println('skirts') + } } diff --git a/src/ast.zig b/src/ast.zig index 609cf48..05f0b25 100644 --- a/src/ast.zig +++ b/src/ast.zig @@ -327,6 +327,20 @@ pub fn printStmt(ident: usize, stmt: *Stmt) void { std.debug.warn(")\n"); }, + + .Loop => |loop| { + std.debug.warn("(loop "); + if (loop.condition) |cond| { + printExpr(cond); + } else { + std.debug.warn("true"); + } + std.debug.warn(" "); + + printBlock(ident + 1, loop.then_branch, false); + std.debug.warn(")\n"); + }, + else => std.debug.warn("UnknownStmt-{}", @tagName(stmt.*)), } } diff --git a/src/parser.zig b/src/parser.zig index 73d61f3..e171ea1 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -449,6 +449,7 @@ pub const Parser = struct { fn parseStmt(self: *@This()) anyerror!*Stmt { return switch (self.peek().ttype) { .If => try self.parseIfStmt(), + .Loop => try self.parseLoop(), .Println => try self.parsePrintln(), // TODO make newlines tokens and consume newline? @@ -495,6 +496,22 @@ pub const Parser = struct { ); } + fn parseLoop(self: *@This()) !*Stmt { + _ = try self.consumeSingle(.Loop); + var expr: ?*Expr = null; + var body: ast.Block = undefined; + + // infinite loop + if (self.check(.LeftBrace)) { + body = try self.parseStmtBlock(); + } else { + expr = (try self.parseExpr()).Expr; + body = try self.parseStmtBlock(); + } + + return try Stmt.mkLoop(self.allocator, expr, body); + } + fn parsePrintln(self: *@This()) !*Stmt { _ = try self.consumeSingle(.Println);