aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/main.zig b/src/main.zig
index 62877cb..7a0513e 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,8 +1,42 @@
const std = @import("std");
+pub const Grammar = @import("grammar.zig");
+pub const recognizer = @import("recognizer.zig");
-pub const grammar = @import("grammar.zig");
+fn help() !noreturn {
+ const stderr = std.io.getStdErr().writer();
+ try stderr.print("gll [grammar] [input]\n", .{});
+ std.process.exit(1);
+}
+
+fn read_whole_file(path: []const u8, allocator: std.mem.Allocator) ![]const u8 {
+ const file = try std.fs.cwd().openFile(path, .{});
+ defer file.close();
+ const stat = try file.stat();
+ return file.readToEndAlloc(allocator, stat.size);
+}
pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ const allocator = gpa.allocator();
+ defer {
+ if (gpa.deinit() == .leak) {
+ @panic("memory leak detected");
+ }
+ }
+
+ var args = std.process.args();
+ _ = args.next();
+
+ const grammar_path = args.next() orelse try help();
+ const input_path = args.next() orelse try help();
+
+ const grammar_text = try read_whole_file(grammar_path, allocator);
+ defer allocator.free(grammar_text);
+ const input = try read_whole_file(input_path, allocator);
+ defer allocator.free(input);
+
+ var grammar = try Grammar.parse(grammar_text, allocator);
+ defer grammar.deinit(allocator);
}
test {