diff options
| author | Taylan Kammer <taylan.kammer@gmail.com> | 2025-03-30 12:53:28 +0200 |
|---|---|---|
| committer | Taylan Kammer <taylan.kammer@gmail.com> | 2025-03-30 12:53:28 +0200 |
| commit | 9340f3c44ca0d9d4fdee905fc6e8b428824b9185 (patch) | |
| tree | 027a811fc078b9062d940063a6002e40bae3140d | |
| parent | 49736f6748344e191077c38a49385aa3a2efb600 (diff) | |
back to enums
| -rw-r--r-- | src/libzisp/io/Parser.zig | 86 |
1 files changed, 62 insertions, 24 deletions
diff --git a/src/libzisp/io/Parser.zig b/src/libzisp/io/Parser.zig index 7264eaa..6684104 100644 --- a/src/libzisp/io/Parser.zig +++ b/src/libzisp/io/Parser.zig @@ -108,8 +108,6 @@ pub const ParseError = enum { ReadError, }; -const Fn = *const fn (*Parser) anyerror!void; - pub const Context = struct { // What to do next. next: ?Fn = undefined, @@ -219,12 +217,52 @@ fn getRune(p: *Parser) Value { // Stack management & control flow // +const Fn = enum { + parseUnit, + parseDatum, + endUnit, + returnContext, + endFirstDatum, + endJoinDatum, + parseJoin, + parseHashDatum, + endHashDatum, + parseRuneDatum, + endRuneDatum, + endLabelDatum, + continueList, + endImproperList, + closeImproperList, + endQuoteExpr, +}; + +fn call(p: *Parser, f: Fn) !void { + try switch (f) { + .parseUnit => parseUnit(p), + .parseDatum => parseDatum(p), + .endUnit => endUnit(p), + .returnContext => returnContext(p), + .endFirstDatum => endFirstDatum(p), + .endJoinDatum => endJoinDatum(p), + .parseJoin => parseJoin(p), + .parseHashDatum => parseHashDatum(p), + .endHashDatum => endHashDatum(p), + .parseRuneDatum => parseRuneDatum(p), + .endRuneDatum => endRuneDatum(p), + .endLabelDatum => endLabelDatum(p), + .continueList => continueList(p), + .endImproperList => endImproperList(p), + .closeImproperList => closeImproperList(p), + .endQuoteExpr => endQuoteExpr(p), + }; +} + pub fn run(p: *Parser, input: std.io.AnyReader) !Value { p.input = input; - p.context.next = &parseUnit; + p.context.next = .parseUnit; while (p.context.next) |next| { if (detailed_debug) printStack(p); - try next(p); + try p.call(next); } if (p.unread_char) |_| { return p.err(.InvalidCharacter, "top-level"); @@ -312,10 +350,10 @@ fn parseUnit(p: *Parser) !void { while (c1) |c| : (c1 = try p.read()) { switch (try checkBlanks(p, c)) { .yes => {}, - .skip_unit => try p.push(&parseUnit), + .skip_unit => try p.push(.parseUnit), .no => { p.unread(c); - return p.subr(&parseDatum, &endUnit); + return p.subr(.parseDatum, .endUnit); }, } } @@ -334,7 +372,7 @@ fn endUnit(p: *Parser) !void { fn skipUnitAndReturn(p: *Parser) !void { p.context.val = p.result; - return p.subr(&parseUnit, &returnContext); + return p.subr(.parseUnit, .returnContext); } fn returnContext(p: *Parser) !void { @@ -342,7 +380,7 @@ fn returnContext(p: *Parser) !void { } fn parseDatum(p: *Parser) !void { - return parseOneDatum(p, p.getUnread().?, &endFirstDatum); + return parseOneDatum(p, p.getUnread().?, .endFirstDatum); } fn endFirstDatum(p: *Parser) !void { @@ -365,7 +403,7 @@ fn parseJoin(p: *Parser) !void { }, } p.context.val = p.result; - return p.subr(&parseDatum, &endJoinDatum); + return p.subr(.parseDatum, .endJoinDatum); } fn endJoinDatum(p: *Parser) !void { @@ -385,7 +423,7 @@ fn endJoinDatum(p: *Parser) !void { else => unreachable, }; const joined = p.cons(rune, p.cons(prev, p.result)); - return p.jump(&parseJoin, joined); + return p.jump(.parseJoin, joined); } fn parseOneDatum(p: *Parser, c: u8, next: Fn) !void { @@ -544,11 +582,11 @@ fn parseHashExpression(p: *Parser, next: Fn) !void { return p.jump(next, p.cons(HASH, try parseQuotedString(p, '|'))); } p.unread(c); - return p.subr(&parseHashDatum, next); + return p.subr(.parseHashDatum, next); } fn parseHashDatum(p: *Parser) !void { - return parseCladDatum(p, p.getUnread().?, &endHashDatum); + return parseCladDatum(p, p.getUnread().?, .endHashDatum); } fn endHashDatum(p: *Parser) !void { @@ -588,14 +626,14 @@ fn parseRuneEnd(p: *Parser, r: Value, next: Fn) !void { try p.push(next); p.context.val = r; // Use jump to prevent recursion. - return p.jump(&parseRuneDatum, null); + return p.jump(.parseRuneDatum, null); }, else => return p.jump(next, r), } } fn parseRuneDatum(p: *Parser) !void { - return parseCladDatum(p, p.getUnread().?, &endRuneDatum); + return parseCladDatum(p, p.getUnread().?, .endRuneDatum); } fn endRuneDatum(p: *Parser) !void { @@ -618,7 +656,7 @@ fn parseLabelEnd(p: *Parser, l: Value, next: Fn) !void { if (c == '=') { try p.push(next); p.context.val = l; - return p.subr(&parseDatum, &endLabelDatum); + return p.subr(.parseDatum, .endLabelDatum); } return p.err(.InvalidCharacter, "datum label"); } @@ -651,12 +689,12 @@ fn parseList(p: *Parser, open: u8, next: Fn) !void { .yes => {}, .skip_unit => { try listParserSetup(p, head, close, next); - return p.subr(&parseUnit, &parseUnit); + return p.subr(.parseUnit, .parseUnit); }, .no => { try listParserSetup(p, head, close, next); p.unread(c); - return p.jump(&parseDatum, null); + return p.jump(.parseDatum, null); }, } } @@ -667,7 +705,7 @@ fn listParserSetup(p: *Parser, head: Value, close: u8, next: Fn) !void { try p.push(next); p.context.val = head; p.context.char = close; - try p.pushContext(&continueList); + try p.pushContext(.continueList); } fn continueList(p: *Parser) !void { @@ -682,7 +720,7 @@ fn continueList(p: *Parser) !void { } if (p.result.eq(LSTAIL)) { - return p.subr(&parseUnit, &endImproperList); + return p.subr(.parseUnit, .endImproperList); } p.context.val = p.cons(p.result, p.context.val); @@ -695,12 +733,12 @@ fn continueList(p: *Parser) !void { switch (try checkBlanks(p, c)) { .yes => {}, .skip_unit => { - try p.pushContext(&continueList); - return p.subr(&parseUnit, &parseUnit); + try p.pushContext(.continueList); + return p.subr(.parseUnit, .parseUnit); }, .no => { p.unread(c); - return p.subr(&parseDatum, &continueList); + return p.subr(.parseDatum, .continueList); }, } } @@ -729,7 +767,7 @@ fn closeImproperList(p: *Parser) !void { } switch (try checkBlanks(p, c)) { .yes => {}, - .skip_unit => return p.subr(&parseUnit, &closeImproperList), + .skip_unit => return p.subr(.parseUnit, .closeImproperList), .no => return p.err(.InvalidCharacter, "after list tail"), } } @@ -753,7 +791,7 @@ fn parseQuoteExpr(p: *Parser, c1: u8, next: Fn) !void { try p.push(next); p.context.val = q; p.unread(c); - return p.subr(&parseDatum, &endQuoteExpr); + return p.subr(.parseDatum, .endQuoteExpr); } fn endQuoteExpr(p: *Parser) !void { |
