vig/src/runner.zig

58 lines
1.8 KiB
Zig

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;
}
};