summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/main.zig b/src/main.zig
index 4f1127c..55fecdf 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -2,26 +2,36 @@ const std = @import("std");
const zisp = @import("zisp");
-const gst_io = std.Io.Threaded.global_single_threaded.io();
+const alloc = std.heap.smp_allocator;
+const gstio = std.Io.Threaded.global_single_threaded.io();
-pub fn main() !void {
+pub fn main() !u8 {
var stdin_buffer: [4096]u8 = undefined;
- var stdin_reader = std.Io.File.stdin().reader(gst_io, &stdin_buffer);
+ var stdin_reader = std.Io.File.stdin().reader(gstio, &stdin_buffer);
const reader = &stdin_reader.interface;
var stdout_buffer: [4096]u8 = undefined;
- var stdout_writer = std.Io.File.stdout().writer(gst_io, &stdout_buffer);
+ var stdout_writer = std.Io.File.stdout().writer(gstio, &stdout_buffer);
const writer = &stdout_writer.interface;
+ var sfa = zisp.io.Parser.DefaultSfa.withFallback(alloc);
+ var p = try zisp.io.Parser.initWithSfa(&sfa, gstio);
while (true) {
- try writer.writeAll("> ");
- try writer.flush();
- const datum = zisp.io.parse.fromReader(reader);
+ const datum = p.run(reader) catch {
+ const format = "Parse error: {s}, pos: {d}, unread_char: {s}\n";
+ const err = p.err_msg;
+ const pos = stdin_reader.logicalPos();
+ const unread: [4]u8 =
+ if (p.unread_char) |c|
+ "0x".* ++ std.fmt.hex(c)
+ else
+ "none".*;
+ std.debug.print(format, .{ err, pos, unread });
+ return 1;
+ };
if (datum.eq(zisp.value.eof)) {
- try writer.writeAll("\n");
- return;
+ return 0;
}
- try writer.writeAll("= ");
try zisp.io.print.toWriter(writer, datum);
try writer.writeAll("\n");
try writer.flush();