aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2026-04-18 19:21:47 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2026-04-18 19:21:47 +0200
commitfec006aaa5ee3683457ebfc2ba1755b077e14c79 (patch)
tree3f52b89c2d4a617acbda5cda58d19a1c33da73e9 /src
parente8e9d31559e38173093f11d99721392e32e21d60 (diff)
fix(lexer): invalid acc for titles
Diffstat (limited to 'src')
-rw-r--r--src/lexer/Lexer.zig31
-rw-r--r--src/parser.zig (renamed from src/ast.zig)0
-rw-r--r--src/root.zig2
3 files changed, 24 insertions, 9 deletions
diff --git a/src/lexer/Lexer.zig b/src/lexer/Lexer.zig
index 7524479..318e422 100644
--- a/src/lexer/Lexer.zig
+++ b/src/lexer/Lexer.zig
@@ -45,7 +45,8 @@ pub fn next(self: *Self, alloc: Allocator) Error!?Lexed {
}
// conds here to avoid creating complex condition in while
const next_rune = self.iter.peek(1);
- if (requiresSpace(current_kind.?)) {
+ const next_kind = self.getCurrentKind(current_kind, next_rune, acc.items).kind;
+ if (requiresSpace(current_kind.?) and next_kind != current_kind.?) {
if (eql(u8, next_rune, " ")) {
// consume next space
_ = self.iter.nextCodepoint();
@@ -57,7 +58,7 @@ pub fn next(self: *Self, alloc: Allocator) Error!?Lexed {
};
}
if (next_rune.len > 0 and
- self.getCurrentKind(current_kind, next_rune, acc.items).kind != current_kind.? and
+ next_kind != current_kind.? and
(override_if == null or !eql(u8, override_if.?, next_rune)))
break;
}
@@ -82,7 +83,7 @@ const kindRes = struct {
};
fn requiresDelimiter(before: ?Lexed.Kind, knd: Lexed.Kind) Lexed.Kind {
- return if (before == null or before.?.isDelimiter()) knd else .literal;
+ return if (before == null or before.?.isDelimiter() or before.? == knd) knd else .literal;
}
fn getCurrentKind(self: *Self, before: ?Lexed.Kind, rune: []const u8, acc: []const u8) kindRes {
@@ -154,9 +155,7 @@ fn isOneOrThree(op: []const u8, rune: []const u8, p: []const u8, one: Lexed.Kind
fn requiresSpace(k: Lexed.Kind) bool {
return switch (k) {
- .title => true,
- .list_ordored => true,
- .list_unordored => true,
+ .title, .list_ordored, .list_unordored => true,
else => false,
};
}
@@ -185,6 +184,22 @@ test "one or three" {
try expect(isOneOrThree(":", "a", ":", .ref, .callout) == null);
}
+test "is" {
+ const expect = std.testing.expect;
+
+ // valid
+ try expect(is('#', 6, "#", ""));
+ try expect(is('#', 6, "#", "#"));
+ try expect(is('#', 6, "#", "##"));
+ try expect(is('#', 6, "#", "###"));
+ try expect(is('#', 6, "#", "####"));
+ try expect(is('#', 6, "#", "#####"));
+
+ // invalid
+ try expect(!is('#', 6, "#", "######"));
+ try expect(!is('#', 6, "u", "##"));
+}
+
test "lexer common" {
const expect = std.testing.expect;
@@ -192,9 +207,9 @@ test "lexer common" {
defer if (arena.deinit() == .leak) std.debug.print("leaking!\n", .{});
const alloc = arena.allocator();
- var l = try init("# hello world :)");
+ var l = try init("## hello world :)");
- try doTest(alloc, &l, .title, "#");
+ try doTest(alloc, &l, .title, "##");
try doTest(alloc, &l, .literal, "hello world ");
try doTest(alloc, &l, .ref, ":");
try doTest(alloc, &l, .link, ")");
diff --git a/src/ast.zig b/src/parser.zig
index e5a9ea2..e5a9ea2 100644
--- a/src/ast.zig
+++ b/src/parser.zig
diff --git a/src/root.zig b/src/root.zig
index 98b0274..2bc3125 100644
--- a/src/root.zig
+++ b/src/root.zig
@@ -1,5 +1,5 @@
const std = @import("std");
-pub const ast = @import("ast.zig");
+pub const parser = @import("parser.zig");
pub fn bufferedPrint() !void {
// Stdout is for the actual output of your application, for example if you