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
|
|
|
|
|
|
|
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,
|
|
|
|
stdout: main.StdOut,
|
|
|
|
|
2019-06-05 01:11:11 +00:00
|
|
|
pub fn init(allocator: *Allocator, stdout: main.StdOut) Runner {
|
2019-06-05 00:27:05 +00:00
|
|
|
return Runner{ .allocator = allocator, .stdout = stdout };
|
|
|
|
}
|
|
|
|
|
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| {
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2019-06-05 01:11:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn execute(self: *Runner, code: []u8) !void {
|
|
|
|
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-05 02:44:27 +00:00
|
|
|
//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,
|
2019-06-05 02:53:55 +00:00
|
|
|
.left = &ast.AstNode{
|
|
|
|
.Number = ast.AstNumber{
|
|
|
|
.Integer32 = 30,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
.right = &ast.AstNode{
|
|
|
|
.Number = ast.AstNumber{
|
|
|
|
.Integer32 = 30,
|
|
|
|
},
|
|
|
|
},
|
2019-06-05 02:44:27 +00:00
|
|
|
},
|
|
|
|
}},
|
|
|
|
});
|
|
|
|
try self.stdout.print("\n");
|
2019-06-05 02:53:55 +00:00
|
|
|
|
2019-06-05 00:27:05 +00:00
|
|
|
return Result.Ok;
|
|
|
|
}
|
|
|
|
};
|