vig/src/runner.zig

56 lines
1.6 KiB
Zig
Raw Permalink Normal View History

2019-06-05 00:27:05 +00:00
const std = @import("std");
const scanners = @import("scanner.zig");
2019-06-05 01:11:11 +00:00
const parsers = @import("parser.zig");
2019-06-05 00:27:05 +00:00
const main = @import("main.zig");
2019-06-05 01:11:11 +00:00
const ast = @import("ast.zig");
2019-06-05 00:27:05 +00:00
2019-06-05 23:29:03 +00:00
const tokens = @import("tokens.zig");
const printer = @import("ast_printer.zig");
2019-06-05 00:27:05 +00:00
const Allocator = std.mem.Allocator;
const Result = main.Result;
2019-06-05 01:11:11 +00:00
const Parser = parsers.Parser;
2019-06-05 00:27:05 +00:00
pub const Runner = struct {
allocator: *Allocator,
2020-04-10 19:48:10 +00:00
stdout: std.fs.File.OutStream,
2019-06-05 00:27:05 +00:00
2020-04-10 19:48:10 +00:00
pub fn init(allocator: *Allocator, stdout: var) Runner {
return .{ .allocator = allocator, .stdout = stdout };
2019-06-05 00:27:05 +00:00
}
2019-06-05 01:11:11 +00:00
fn testScanner(self: *Runner, scanner: *scanners.Scanner) !void {
2019-06-05 00:27:05 +00:00
while (true) {
var tok_opt = scanner.nextToken() catch |err| {
2020-04-10 19:48:10 +00:00
try self.stdout.print("error at '{}': {}\n", .{
2019-06-05 00:27:05 +00:00
scanner.currentLexeme(),
err,
2020-04-10 19:48:10 +00:00
});
2019-06-05 00:27:05 +00:00
2019-06-06 01:06:12 +00:00
return Result.ScannerError;
2019-06-05 00:27:05 +00:00
};
if (tok_opt) |tok| {
if (tok.ttype == .EOF) break;
2020-04-10 19:48:10 +00:00
try self.stdout.print("{x}\n", .{tok});
2019-06-05 00:27:05 +00:00
}
}
2019-06-05 01:11:11 +00:00
}
2020-04-10 19:48:10 +00:00
pub fn execute(self: *Runner, code: []const u8) !void {
2019-06-05 01:11:11 +00:00
var scanner = scanners.Scanner.init(self.allocator, code);
try self.testScanner(&scanner);
2019-06-05 00:27:05 +00:00
2019-06-05 01:11:11 +00:00
scanner = scanners.Scanner.init(self.allocator, code);
2019-06-06 01:06:12 +00:00
var parser = Parser.init(self.allocator, &scanner);
var root = try parser.parse();
2019-06-06 01:06:12 +00:00
2020-04-10 19:48:10 +00:00
// var it = root.Root.iterator();
2019-06-06 01:06:12 +00:00
2020-04-10 19:48:10 +00:00
std.debug.warn("parse tree\n", .{});
printer.printNode(root, 0);
2019-06-05 00:27:05 +00:00
return Result.Ok;
}
};