X-Git-Url: https://git.ayoreis.com/zlox.git/blobdiff_plain/abb953787c9ce7a2eb0459ecbf7b1b9a7000b0c1..af5a4d8d95bf091ac4139094ed27265fe04a2634:/src/main.zig diff --git a/src/main.zig b/src/main.zig index 5905114..a17dbd7 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,14 +59,19 @@ 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 { +pub fn scanError(line: u32, message: []const u8) !void { try report(line, "", message); } @@ -76,3 +84,11 @@ fn report(line: u32, where: []const u8, message: []const u8) !void { try stderr.flush(); hadError = true; } + +pub fn parseError(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); + } +}