summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2025-03-30 12:53:28 +0200
committerTaylan Kammer <taylan.kammer@gmail.com>2025-03-30 12:53:28 +0200
commit9340f3c44ca0d9d4fdee905fc6e8b428824b9185 (patch)
tree027a811fc078b9062d940063a6002e40bae3140d
parent49736f6748344e191077c38a49385aa3a2efb600 (diff)
back to enums
-rw-r--r--src/libzisp/io/Parser.zig86
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 {