const std = @import("std"); const parse = @import("./parse.zig"); const peek = @import("./peek.zig"); const compile = @import("./compile.zig"); pub const peekable = peek.peekable; pub const Peekable = peek.Peekable; pub const Expr = parse.Expr; pub const Lexer = @import("./lexer.zig"); pub fn main() !void { var arena: std.heap.ArenaAllocator = .init(std.heap.smp_allocator); defer arena.deinit(); const allocator = arena.allocator(); var bw = std.io.bufferedWriter(std.io.getStdOut().writer()); const stdout = bw.writer(); // var br = std.io.bufferedReader(std.io.getStdIn().reader()); // const stdin = br.reader(); // // var line: std.ArrayList(u8) = .init(alloc); // defer line.deinit(); // while (true) { // try stdin.streamUntilDelimiter(line.writer(), '\n', null); // // const lexer = Lexer{.source = line}; // // try stdout.print("{s}\n", .{line.items}); // } const source = "1 + 2 + 3"; // var lexer = Lexer{ .source = source }; // while (true) { // const token = lexer.next().?; // try stdout.print("{}\n", .{token}); // if (token.type == .Eof) break; // } // try stdout.print("\n", .{}); var lexer = peekable(Lexer{ .source = source }); const expr = try parse.expression(allocator, &lexer); try stdout.print("{}\n", .{expr}); if (lexer.next()) |token| if (token.type != .eof) { try stdout.print("Unexpected token {}, expected end of file\n", .{token}); }; const block = try compile.compile(allocator, expr); for (block.instrs) |instr| { try stdout.print("{}\n", .{instr}); } try bw.flush(); // Don't forget to flush! } test { _ = peek; }