diff --git a/src/main.zig b/src/main.zig index 2adc149..09c5400 100644 --- a/src/main.zig +++ b/src/main.zig @@ -230,56 +230,76 @@ pub fn main() !u8 { const args = try std.process.argsAlloc(allocator); defer std.process.argsFree(allocator, args); + // Check for --sentence-parse-only option + var sentence_parse_only = false; + var sentence_arg: ?[]const u8 = null; + + for (args[1..]) |arg| { + if (std.mem.eql(u8, arg, "--sentence-parse-only")) { + sentence_parse_only = true; + } else if (sentence_arg == null) { + sentence_arg = arg; + } + } + var stdout_writer = std.fs.File.stdout().writer(&.{}); const stdout = &stdout_writer.interface; - _ = stdout; var stderr_writer = std.fs.File.stderr().writer(&.{}); const stderr = &stderr_writer.interface; - if (args.len < 2) { - stderr.print("Usage: {s} \n", .{args[0]}) catch {}; + if (sentence_arg == null) { + try stderr.print("Usage: {s} [--sentence-parse-only] \n", .{args[0]}); return 1; } - - std.log.debug("loading device config", .{}); - // Get binary directory - const bin_path = std.fs.selfExePathAlloc(allocator) catch |err| { + const bin_dir = std.fs.selfExeDirPathAlloc(allocator) catch |err| { stderr.print("Failed to get binary path: {}\n", .{err}) catch {}; return 1; }; - defer allocator.free(bin_path); - - const bin_dir = std.fs.path.dirname(bin_path) orelse "."; - - var devices = loadDeviceConfig(allocator, bin_dir) catch |err| { - stderr.print("Failed to load device configuration: {}\n", .{err}) catch {}; - return 1; - }; - defer { - var iterator = devices.iterator(); - while (iterator.next()) |entry| { - allocator.free(entry.key_ptr.*); - allocator.free(entry.value_ptr.*); - } - devices.deinit(); - } + defer allocator.free(bin_dir); std.log.debug("initializing parser", .{}); var parser = pos.Parser.initWithDataDir(allocator, bin_dir) catch |err| { - stderr.print("Failed to initialize parser: {}\n", .{err}) catch {}; + std.debug.print("Failed to initialize parser: {}\n", .{err}); return 1; }; defer parser.deinit(); + if (sentence_parse_only) { + const sentence_z = try allocator.dupeZ(u8, sentence_arg.?); + defer allocator.free(sentence_z); - processCommand(allocator, args[1], &parser, &devices) catch |err| { - switch (err) { - error.UnrecognizedSentence => { - try stderr.print("Unrecognized sentence: {s}\n", .{args[1]}); - return 1; - }, - else => return err, + var tree = parser.adaptiveParse(sentence_z, word_replacements) catch |err| { + std.debug.print("Failed to parse sentence: {}\n", .{err}); + return 1; + }; + defer tree.deinit(); + + try stdout.print("{f}", .{tree}); + } else { + std.log.debug("loading device config", .{}); + + var devices = loadDeviceConfig(allocator, bin_dir) catch |err| { + stderr.print("Failed to load device configuration: {}\n", .{err}) catch {}; + return 1; + }; + defer { + var iterator = devices.iterator(); + while (iterator.next()) |entry| { + allocator.free(entry.key_ptr.*); + allocator.free(entry.value_ptr.*); + } + devices.deinit(); } - }; + + processCommand(allocator, args[1], &parser, &devices) catch |err| { + switch (err) { + error.UnrecognizedSentence => { + try stderr.print("Unrecognized sentence: {s}\n", .{args[1]}); + return 1; + }, + else => return err, + } + }; + } return 0; }