From aa94396e5121d1afa465e0030ec1e62b6579de96 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 2 Jun 2019 18:11:23 -0300 Subject: [PATCH] compiler: add nicer error handling - vm: fix pop opcode handler --- src/compiler.zig | 16 ++++++++++++++++ src/vm.zig | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/compiler.zig b/src/compiler.zig index c6bdd5b..71750da 100644 --- a/src/compiler.zig +++ b/src/compiler.zig @@ -337,8 +337,24 @@ pub const Compiler = struct { try self.emitByte(OpCode.Pop); } + fn synchronize(self: *Compiler) !void { + self.parser.panicMode = false; + + while (self.parser.current.ttype != .EOF) { + if (self.parser.previous.ttype == .SEMICOLON) return; + + switch (self.parser.current.ttype) { + .CLASS, .FUN, .VAR, .FOR, .IF, .WHILE, .PRINT, .RETURN => return, + else => {}, + } + + try self.advance(); + } + } + fn declaration(self: *Compiler) !void { try self.statement(); + if (self.parser.panicMode) try self.synchronize(); } fn statement(self: *Compiler) !void { diff --git a/src/vm.zig b/src/vm.zig index 6ffc733..98211c6 100644 --- a/src/vm.zig +++ b/src/vm.zig @@ -255,7 +255,10 @@ pub const VM = struct { chunk.OpCode.True => try self.push(values.BoolVal(true)), chunk.OpCode.False => try self.push(values.BoolVal(false)), - chunk.OpCode.Pop => self.pop(), + chunk.OpCode.Pop => blk: { + _ = self.pop(); + break :blk; + }, chunk.OpCode.Equal => blk: { var a = self.pop();