X-Git-Url: https://git.ayoreis.com/zlox.git/blobdiff_plain/abb953787c9ce7a2eb0459ecbf7b1b9a7000b0c1..6d286699938880d7a1482be65e5e4771788c6b6f:/src/main.zig?ds=sidebyside diff --git a/src/main.zig b/src/main.zig index 5905114..0e41f10 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,6 +1,9 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const Scanner = @import("Scanner.zig"); +const Token = @import("Token.zig"); +const Parser = @import("Parser.zig"); +const ast_printer = @import("ast_printer.zig"); var hadError = false; @@ -56,11 +59,16 @@ fn run(allocator: Allocator, source: []const u8) !void { var scanner = Scanner.init(allocator, source); const tokens = try scanner.scanTokens(); defer allocator.free(tokens); + var parser = try Parser.init(allocator, tokens); + defer parser.deinit(); + const expression = try parser.parse(); - // For now, just print the tokens. - for (tokens) |token| { - std.debug.print("{f}\n", .{token}); - } + // Stop if there was a syntax error. + if (hadError) return; + + const printed = try ast_printer.print(allocator, expression.?); + defer allocator.free(printed); + std.debug.print("{s}\n", .{printed}); } pub fn @"error"(line: u32, message: []const u8) !void { @@ -76,3 +84,11 @@ fn report(line: u32, where: []const u8, message: []const u8) !void { try stderr.flush(); hadError = true; } + +pub fn parse_error(allocator: Allocator, token: Token, message: []const u8) !void { + if (token.type == .eof) { + try report(token.line, " at end", message); + } else { + try report(token.line, try std.fmt.allocPrint(allocator, " at '{s}'", .{token.lexeme}), message); + } +}