const std = @import("std"); const scanners = @import("scanner.zig"); const parsers = @import("parser.zig"); const main = @import("main.zig"); const ast = @import("ast.zig"); const Allocator = std.mem.Allocator; const Result = main.Result; const Parser = parsers.Parser; pub const Runner = struct { allocator: *Allocator, stdout: main.StdOut, pub fn init(allocator: *Allocator, stdout: main.StdOut) Runner { return Runner{ .allocator = allocator, .stdout = stdout }; } fn testScanner(self: *Runner, scanner: *scanners.Scanner) !void { while (true) { var tok_opt = scanner.nextToken() catch |err| { try self.stdout.print( "error at '{}': {}\n", scanner.currentLexeme(), err, ); return Result.CompileError; }; if (tok_opt) |tok| { if (tok.ttype == .EOF) break; try self.stdout.print("{x}\n", tok); } } } pub fn execute(self: *Runner, code: []u8) !void { var scanner = scanners.Scanner.init(self.allocator, code); try self.testScanner(&scanner); scanner = scanners.Scanner.init(self.allocator, code); //var parser = Parser.init(self.allocator, &scanner); //var tree = try parser.parse(); try ast.printNode(self.stdout, ast.AstNode{ .Program = &[]ast.AstNode{ast.AstNode{ .BinOp = ast.AstBinOp{ .optype = ast.BinOpType.Equality, .left = ast.AstNumber{ .Integer32 = 30 }, .right = ast.AstNumber{ .Integer32 = 30 }, }, }}, }); try self.stdout.print("\n"); return Result.Ok; } };