diff --git a/build.zig b/build.zig index 52d843655e45cb80f3d591e0639825a05d0fec86..1e59d84658b370ad64a9b6db381ce4f137ea0155 100644 --- a/build.zig +++ b/build.zig @@ -719,6 +719,21 @@ pub fn build(b: *std.Build) !void { check_mingw_run.addDirectoryArg(b.path("lib/libc/mingw")); check_mingw_step.dependOn(&check_mingw_run.step); + { + const gpo_step = b.step("gen-parser-oracle", "Regenerate lib/std/zig/parser_generated_oracle.zig from doc/langref/grammar.peg"); + const gpo_exe = b.addExecutable(.{ + .name = "gen_parser_oracle", + .root_module = b.createModule(.{ + .root_source_file = b.path("tools/gen_parser_oracle.zig"), + .target = b.graph.host, + }), + }); + const gpo_run = b.addRunArtifact(gpo_exe); + gpo_run.addFileArg(b.path("doc/langref/grammar.peg")); + gpo_run.addFileArg(b.path("lib/std/zig/parser_generated_oracle.zig")); + gpo_step.dependOn(&gpo_run.step); + } + const test_incremental_step = b.step("test-incremental", "Run the incremental compilation test cases"); try tests.addIncrementalTests(b, test_incremental_step, test_filters); if (!skip_test_incremental) test_step.dependOn(test_incremental_step); diff --git a/lib/std/zig/parser_generated_oracle.zig b/lib/std/zig/parser_generated_oracle.zig index 0579dd91adcf7d3f66fa20e528e20aca6c6a62cb..2b24677c96cc33db44ea3871c7255e79fd9b5b82 100644 --- a/lib/std/zig/parser_generated_oracle.zig +++ b/lib/std/zig/parser_generated_oracle.zig @@ -1,5 +1,5 @@ //! This file is generated, do not edit manually! To generate, run: -//! zig run ./tools/gen_parser_oracle.zig -- ./doc/langref/grammar.peg > ./lib/std/zig/parser_generated_oracle.zig +//! zig build gen-parser-oracle const std = @import("std"); diff --git a/tools/gen_parser_oracle.zig b/tools/gen_parser_oracle.zig index 26e550fef1adcde2e8eb01356dd5fdef63b84c2e..a5bad1238ec74748d654e92b962ef7fa360da609 100644 --- a/tools/gen_parser_oracle.zig +++ b/tools/gen_parser_oracle.zig @@ -1,5 +1,5 @@ //! Example usage: -//! zig run ./tools/gen_parser_oracle.zig -- ./doc/langref/grammar.peg > ./lib/std/zig/parser_generated_oracle.zig +//! zig build gen-parser-oracle // This program implements a subset of the PEG grammar definition // in the peg(1) man page. @@ -21,6 +21,7 @@ pub fn main(init: std.process.Init) !void { const args = try init.minimal.args.toSlice(arena); const grammar_path = args[1]; + const out_path = args[2]; const grammar = try Io.Dir.cwd().readFileAlloc(io, grammar_path, gpa, .unlimited); defer gpa.free(grammar); @@ -52,12 +53,13 @@ pub fn main(init: std.process.Init) !void { return error.ParseError; } - var stdout_buffer: [4096]u8 = undefined; - var stdout_writer = Io.File.stdout().writerStreaming(io, &stdout_buffer); - const stdout = &stdout_writer.interface; + var out_file = try Io.Dir.cwd().createFile(io, out_path, .{}); + var out_buffer: [4096]u8 = undefined; + var out_writer = out_file.writer(io, &out_buffer); + const out = &out_writer.interface; - try tree.render(gpa, stdout, .{}); - try stdout.flush(); + try tree.render(gpa, out, .{}); + try out.flush(); } const Generator = struct { @@ -78,7 +80,7 @@ const Generator = struct { fn genRoot(g: *Generator, node: Node.Index) Error!void { try g.w.writeAll( \\//! This file is generated, do not edit manually! To generate, run: - \\//! zig run ./tools/gen_parser_oracle.zig -- ./doc/langref/grammar.peg > ./lib/std/zig/parser_generated_oracle.zig + \\//! zig build gen-parser-oracle \\ \\const std = @import("std"); \\