From 6fd4cd0ecd32e0d8246f3678ff21bdb8a1a80016 Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 9 Aug 2019 11:28:40 -0300 Subject: [PATCH] add better error messages for no cmd and unknown cmd --- src/lang.zig | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/lang.zig b/src/lang.zig index 92f651e..dc29439 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -135,6 +135,9 @@ pub const Lang = struct { allocator: *std.mem.Allocator, keywords: KeywordMap, + has_error: bool = false, + line: usize = 0, + pub fn init(allocator: *std.mem.Allocator) Lang { return Lang{ .allocator = allocator, @@ -287,14 +290,20 @@ pub const Lang = struct { } } + fn doError(self: *Lang, comptime fmt: []const u8, args: ...) void { + std.debug.warn("error at line {}: ", self.line); + std.debug.warn(fmt, args); + std.debug.warn("\n"); + self.has_error = true; + } + pub fn parse(self: *Lang, data: []const u8) !CommandList { var splitted_it = std.mem.separate(data, ";"); try self.fillKeywords(); var cmds = CommandList.init(self.allocator); - var idx: usize = 0; - var has_error = false; while (splitted_it.next()) |stmt_orig| { + self.line += 1; var stmt = std.mem.trimRight(u8, stmt_orig, "\n"); stmt = std.mem.trimLeft(u8, stmt, "\n"); @@ -305,7 +314,10 @@ pub const Lang = struct { var tok_it = std.mem.tokenize(stmt, " "); var cmd_opt = tok_it.next(); - if (cmd_opt == null) return ParseError.NoCommandGiven; + if (cmd_opt == null) { + self.doError("No command given"); + continue; + } var command = cmd_opt.?; var ctype_opt = self.getCommand(command); @@ -313,8 +325,8 @@ pub const Lang = struct { if (ctype_opt) |ctype_val| { ctype = ctype_val; } else { - std.debug.warn("Unknown command: '{}' ({})\n", command, command.len); - return ParseError.UnknownCommand; + self.doError("Unknown command '{}' ({})", command, command.len); + continue; } var args = ArgList.init(self.allocator); @@ -328,15 +340,14 @@ pub const Lang = struct { cmd_ptr.* = Command{ .command = ctype, .args = args }; self.validateCommand(cmd_ptr) catch |err| { - std.debug.warn("error at line {}: {}\n", idx, err); - has_error = true; + self.doError("Unknown command '{}' (length {})", command, command.len); + continue; }; try cmds.append(cmd_ptr); - idx += 1; } - if (has_error) return ParseError.ParseFail; + if (self.has_error) return ParseError.ParseFail; return cmds; }