rayoko/src/main.zig

102 lines
2.4 KiB
Zig
Raw Normal View History

2019-09-18 14:20:09 +00:00
const std = @import("std");
2019-09-18 17:30:23 +00:00
const scanners = @import("scanners.zig");
2019-09-18 18:59:11 +00:00
const parsers = @import("parsers.zig");
const printer = @import("ast_printer.zig");
2019-09-21 02:40:21 +00:00
const codegen = @import("codegen.zig");
2019-09-27 03:00:06 +00:00
const analysis = @import("analysis.zig");
2019-09-18 17:30:23 +00:00
2019-09-18 15:11:08 +00:00
pub const Result = enum {
Ok,
TokenizeError,
ParseError,
CompileError,
};
2019-09-18 18:59:11 +00:00
pub fn run(allocator: *std.mem.Allocator, slice: []const u8) !Result {
2019-09-18 17:30:23 +00:00
var scan = scanners.Scanner.init(allocator, slice);
// do a full scan pass, then reset, then do it again (with parser)
while (true) {
var tok_opt = scan.nextToken() catch |err| {
std.debug.warn(
"error at '{}': {}\n",
scan.currentLexeme(),
err,
);
return Result.TokenizeError;
};
if (tok_opt) |tok| {
if (tok.typ == .EOF) break;
// TODO remove
std.debug.warn("{x}\n", tok);
}
}
2019-09-18 19:54:57 +00:00
scan.reset();
2019-09-18 17:30:23 +00:00
2019-09-18 18:59:11 +00:00
var parser = parsers.Parser.init(allocator, &scan);
var root_opt = try parser.parse();
if (root_opt == null) {
2019-09-20 15:22:46 +00:00
return Result.ParseError;
}
2019-09-18 18:59:11 +00:00
var root = root_opt.?;
2019-09-18 18:59:11 +00:00
std.debug.warn("parse tree\n");
printer.printNode(root, 0);
2019-09-18 17:30:23 +00:00
var solver = try analysis.TypeSolver.init(allocator);
var ctx = try solver.pass(root);
std.debug.warn("symbol table\n");
printer.printContext(ctx);
var cgen = codegen.Codegen.init(allocator, &ctx);
try cgen.gen(root);
2019-09-21 02:40:21 +00:00
2019-09-29 16:16:49 +00:00
var child = try std.ChildProcess.init(
[_][]const u8{ "gcc", "src/entry.c", "outpath.o", "-o", "a.out" },
allocator,
);
try child.spawn();
_ = try child.wait();
2019-09-18 15:11:08 +00:00
return Result.Ok;
}
2019-09-18 14:20:09 +00:00
pub fn main() anyerror!void {
2019-09-18 14:37:08 +00:00
const allocator = std.heap.direct_allocator;
var args_it = std.process.args();
_ = args_it.skip();
const filepath = try (args_it.next(allocator) orelse @panic("expected file path"));
2019-09-18 15:11:08 +00:00
var file = try std.fs.File.openRead(filepath);
defer file.close();
const total_bytes = try file.getEndPos();
var slice = try allocator.alloc(u8, total_bytes);
defer allocator.free(slice);
_ = try file.read(slice);
2019-09-18 18:59:11 +00:00
const result = try run(allocator, slice);
2019-09-18 16:44:40 +00:00
switch (result) {
.Ok => std.os.exit(0),
2019-09-18 15:11:08 +00:00
.TokenizeError,
.ParseError,
.CompileError,
2019-09-18 16:44:40 +00:00
=> {
std.debug.warn("error: {}\n", result);
2019-09-18 15:11:08 +00:00
std.os.exit(1);
},
}
2019-09-18 14:20:09 +00:00
}