commit a17a0b6d592da72750dc2a8b4adfd96bb2db32bc
parent 030761391983961fe6f7218a5d7df909a29869fd
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date: Wed, 21 May 2025 02:47:54 +0800
Improve CLI so you can run and print different versions of the parser
Diffstat:
2 files changed, 64 insertions(+), 47 deletions(-)
diff --git a/src/IndentationScanner.zig b/src/IndentationScanner.zig
@@ -287,6 +287,7 @@ pub fn indent(
/// current indentation level is less than expected.
pub fn dedent(it: *IndentationScanner) void {
assert(it.peek() == null);
+ assert(it._expected_indents.len > 1);
_ = it._expected_indents.pop();
}
diff --git a/src/main.zig b/src/main.zig
@@ -2,6 +2,7 @@ const std = @import("std");
const tracy = @import("tracy");
const mymarkdown = @import("mymarkdown");
+const Ast = mymarkdown.Ast;
const ArenaAllocator = std.heap.ArenaAllocator;
@@ -39,25 +40,44 @@ pub fn main() !void {
const arena = arena_instance.allocator();
const args = try std.process.argsAlloc(arena);
- const run1, const run2, const run3 = blk: {
- var run1, var run2, var run3 = .{ false, false, false };
- for (args) |arg| {
- if (std.mem.eql(u8, arg, "--run1"))
- run1 = true;
- if (std.mem.eql(u8, arg, "--run2"))
- run2 = true;
- if (std.mem.eql(u8, arg, "--run3"))
- run3 = true;
- }
- break :blk .{ run1, run2, run3 };
- };
+ const bench1, const bench2, const bench3, //
+ const run1, const run2, const run3, //
+ const print1, const print2, const print3 =
+ blk: {
+ var bench1, var bench2, var bench3 = .{ false, false, false };
+ var run1, var run2, var run3 = .{ false, false, false };
+ var print1, var print2, var print3 = .{ false, false, false };
+ for (args) |arg| {
+ if (std.mem.eql(u8, arg, "--bench1"))
+ bench1 = true;
+ if (std.mem.eql(u8, arg, "--bench2"))
+ bench2 = true;
+ if (std.mem.eql(u8, arg, "--bench3"))
+ bench3 = true;
+ if (std.mem.eql(u8, arg, "--run1"))
+ run1 = true;
+ if (std.mem.eql(u8, arg, "--run2"))
+ run2 = true;
+ if (std.mem.eql(u8, arg, "--run3"))
+ run3 = true;
+ if (std.mem.eql(u8, arg, "--print1"))
+ print1, run1 = .{ true, true };
+ if (std.mem.eql(u8, arg, "--print2"))
+ print2, run2 = .{ true, true };
+ if (std.mem.eql(u8, arg, "--print3"))
+ print3, run3 = .{ true, true };
+ if (std.mem.eql(u8, arg, "--wait"))
+ std.Thread.sleep(2e9);
+ }
+ break :blk .{ bench1, bench2, bench3, run1, run2, run3, print1, print2, print3 };
+ };
var input_arraylist = try readInput(gpa, arena);
defer input_arraylist.deinit();
const input = input_arraylist.items;
for (0..10) |_| {
- if (run1)
+ if (bench1)
std.mem.doNotOptimizeAway(blk: {
const tracy_frame = tracy.namedFrame("parse 1");
defer tracy_frame.end();
@@ -67,7 +87,7 @@ pub fn main() !void {
input,
);
});
- if (run2)
+ if (bench2)
std.mem.doNotOptimizeAway(blk: {
const tracy_frame = tracy.namedFrame("parse 2");
defer tracy_frame.end();
@@ -77,7 +97,7 @@ pub fn main() !void {
input,
);
});
- if (run3)
+ if (bench3)
std.mem.doNotOptimizeAway(blk: {
const tracy_frame = tracy.namedFrame("parse 3");
defer tracy_frame.end();
@@ -89,8 +109,8 @@ pub fn main() !void {
});
}
- if (!run1 and !run2 and !run3) {
- const ast = blk: {
+ if (!bench1 and !bench2 and !bench3) {
+ const ast: Ast = if (run1) blk: {
const tracy_frame = tracy.namedFrame("parse 1");
defer tracy_frame.end();
break :blk try mymarkdown.parse(
@@ -98,8 +118,8 @@ pub fn main() !void {
arena,
input,
);
- };
- const ast2 = blk: {
+ } else .empty;
+ const ast2: Ast = if (run2) blk: {
const tracy_frame = tracy.namedFrame("parse 2");
defer tracy_frame.end();
break :blk try mymarkdown.parse2(
@@ -107,8 +127,8 @@ pub fn main() !void {
arena,
input,
);
- };
- const ast3 = blk: {
+ } else .empty;
+ const ast3: Ast = if (run3) blk: {
const tracy_frame = tracy.namedFrame("parse 3");
defer tracy_frame.end();
break :blk try mymarkdown.parse3(
@@ -116,11 +136,11 @@ pub fn main() !void {
arena,
input,
);
- };
+ } else .empty;
var render_arraylist1: std.ArrayList(u8) = .init(gpa);
defer render_arraylist1.deinit();
- {
+ if (run1) {
std.debug.print("Rendering 1\n", .{});
const tracy_frame = tracy.namedFrame("check render 1");
defer tracy_frame.end();
@@ -128,7 +148,7 @@ pub fn main() !void {
}
var render_arraylist2: std.ArrayList(u8) = .init(gpa);
defer render_arraylist2.deinit();
- {
+ if (run2) {
std.debug.print("Rendering 2\n", .{});
const tracy_frame = tracy.namedFrame("check render 2");
defer tracy_frame.end();
@@ -136,35 +156,31 @@ pub fn main() !void {
}
var render_arraylist3: std.ArrayList(u8) = .init(gpa);
defer render_arraylist3.deinit();
- {
+ if (run3) {
std.debug.print("Rendering 3\n", .{});
const tracy_frame = tracy.namedFrame("check render 3");
defer tracy_frame.end();
_ = try ast3.renderAst(render_arraylist3.writer(), input);
}
- std.debug.print("Testing 1 vs 3\n", .{});
- try std.testing.expectEqualStrings(render_arraylist1.items, render_arraylist3.items);
- std.debug.print("Testing 2 vs 3\n", .{});
- try std.testing.expectEqualStrings(render_arraylist2.items, render_arraylist3.items);
+ if (run1 and run3) {
+ std.debug.print("Testing 1 vs 3\n", .{});
+ try std.testing.expectEqualStrings(render_arraylist1.items, render_arraylist3.items);
+ }
+ if (run2 and run3) {
+ std.debug.print("Testing 2 vs 3\n", .{});
+ try std.testing.expectEqualStrings(render_arraylist2.items, render_arraylist3.items);
+ }
+ if (run1 and run2 and !run3) {
+ std.debug.print("Testing 1 vs 2\n", .{});
+ try std.testing.expectEqualStrings(render_arraylist1.items, render_arraylist2.items);
+ }
- // var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
- // const stdout = bw.writer();
- // {
- // const tracy_frame = tracy.namedFrame("render 1");
- // defer tracy_frame.end();
- // _ = try ast.renderAst(stdout, input);
- // }
- // {
- // const tracy_frame = tracy.namedFrame("render 2");
- // defer tracy_frame.end();
- // _ = try ast2.renderAst(stdout, input);
- // }
- // {
- // const tracy_frame = tracy.namedFrame("render 3");
- // defer tracy_frame.end();
- // _ = try ast3.renderAst(stdout, input);
- // }
- // try bw.flush();
+ if (print1)
+ try std.io.getStdOut().writeAll(render_arraylist1.items);
+ if (print2)
+ try std.io.getStdOut().writeAll(render_arraylist2.items);
+ if (print3)
+ try std.io.getStdOut().writeAll(render_arraylist3.items);
}
if (tracy.enable) {