The errors in the line buffer and tokenizer now have diagnostics. The line number is trivial to keep track of due to the line buffer, but the column index requires quite a bit of juggling, as we pass successively trimmed down buffers to the internals of the parser. There will probably be some column index counting problems in the future. Also, handling the diagnostics is a bit awkward, since it's a mandatory out-parameter of the parse functions now. The user must provide a valid diagnostics object that survives for the life of the parser.
37 lines
1.0 KiB
Zig
37 lines
1.0 KiB
Zig
const std = @import("std");
|
|
|
|
const nice = @import("nice");
|
|
|
|
pub fn main() !void {
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
defer _ = gpa.deinit();
|
|
const allocator = gpa.allocator();
|
|
|
|
const args = try std.process.argsAlloc(allocator);
|
|
defer std.process.argsFree(allocator, args);
|
|
if (args.len < 2) return;
|
|
|
|
const data = try std.fs.cwd().readFileAlloc(allocator, args[1], 4_294_967_295);
|
|
var needfree = true;
|
|
defer if (needfree) allocator.free(data);
|
|
|
|
var diagnostics = nice.Diagnostics{};
|
|
const document = nice.parseBuffer(allocator, data, &diagnostics, .{}) catch |err| {
|
|
std.debug.print("{s}:{d} col:{d}: {s}\n", .{
|
|
args[1],
|
|
diagnostics.row,
|
|
diagnostics.line_offset,
|
|
diagnostics.message,
|
|
});
|
|
return err;
|
|
};
|
|
defer document.deinit();
|
|
|
|
// free data memory to ensure that the parsed document is not holding
|
|
// references to it.
|
|
allocator.free(data);
|
|
needfree = false;
|
|
|
|
document.printDebug();
|
|
}
|