Skip to content

Commit 6fb5ab1

Browse files
committed
std.zig.parser: Redid parsing of error set delc
related: #909
1 parent 5f3ec02 commit 6fb5ab1

File tree

1 file changed

+31
-40
lines changed

1 file changed

+31
-40
lines changed

std/zig/parser.zig

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ pub const Parser = struct {
177177
FieldInitListItemOrEnd: ListSave(&ast.NodeFieldInitializer),
178178
FieldInitListCommaOrEnd: ListSave(&ast.NodeFieldInitializer),
179179
FieldListCommaOrEnd: &ast.NodeContainerDecl,
180+
IdentifierListItemOrEnd: ListSave(&ast.NodeIdentifier),
181+
IdentifierListCommaOrEnd: ListSave(&ast.NodeIdentifier),
180182
SwitchCaseOrEnd: ListSave(&ast.NodeSwitchCase),
181183
SuspendBody: &ast.NodeSuspend,
182184
AsyncEnd: AsyncEndCtx,
@@ -1683,11 +1685,8 @@ pub const Parser = struct {
16831685

16841686
},
16851687
Token.Id.Keyword_error => {
1686-
const next = self.getNextToken();
1687-
1688-
if (next.id != Token.Id.LBrace) {
1688+
if (self.eatToken(Token.Id.LBrace) == null) {
16891689
dest_ptr.store(&(try self.createLiteral(arena, ast.NodeErrorType, token)).base);
1690-
self.putBackToken(next);
16911690
continue;
16921691
}
16931692

@@ -1700,43 +1699,12 @@ pub const Parser = struct {
17001699
}
17011700
);
17021701

1703-
while (true) {
1704-
const t = self.getNextToken();
1705-
switch (t.id) {
1706-
Token.Id.RBrace => {
1707-
node.rbrace_token = t;
1708-
break;
1709-
},
1710-
Token.Id.Identifier => {
1711-
try node.decls.append(
1712-
try self.createLiteral(arena, ast.NodeIdentifier, t)
1713-
);
1714-
},
1715-
else => {
1716-
try self.parseError(&stack, token, "expected {} or {}, found {}",
1717-
@tagName(Token.Id.RBrace),
1718-
@tagName(Token.Id.Identifier),
1719-
@tagName(token.id));
1720-
continue;
1721-
}
1722-
}
1723-
1724-
const t2 = self.getNextToken();
1725-
switch (t2.id) {
1726-
Token.Id.RBrace => {
1727-
node.rbrace_token = t;
1728-
break;
1729-
},
1730-
Token.Id.Comma => continue,
1731-
else => {
1732-
try self.parseError(&stack, token, "expected {} or {}, found {}",
1733-
@tagName(Token.Id.RBrace),
1734-
@tagName(Token.Id.Comma),
1735-
@tagName(token.id));
1736-
continue;
1737-
}
1702+
stack.append(State {
1703+
.IdentifierListItemOrEnd = ListSave(&ast.NodeIdentifier) {
1704+
.list = &node.decls,
1705+
.ptr = &node.rbrace_token,
17381706
}
1739-
}
1707+
}) catch unreachable;
17401708
continue;
17411709
},
17421710
Token.Id.Keyword_packed => {
@@ -2082,6 +2050,24 @@ pub const Parser = struct {
20822050
});
20832051
},
20842052

2053+
State.IdentifierListItemOrEnd => |list_state| {
2054+
if (self.eatToken(Token.Id.RBrace)) |rbrace| {
2055+
*list_state.ptr = rbrace;
2056+
continue;
2057+
}
2058+
2059+
const node = try self.createLiteral(arena, ast.NodeIdentifier, Token(undefined));
2060+
try list_state.list.append(node);
2061+
2062+
stack.append(State { .IdentifierListCommaOrEnd = list_state }) catch unreachable;
2063+
try stack.append(State {
2064+
.ExpectTokenSave = ExpectTokenSave {
2065+
.id = Token.Id.Identifier,
2066+
.ptr = &node.token,
2067+
}
2068+
});
2069+
},
2070+
20852071
State.SwitchCaseOrEnd => |list_state| {
20862072
if (self.eatToken(Token.Id.RBrace)) |rbrace| {
20872073
*list_state.ptr = rbrace;
@@ -2139,6 +2125,11 @@ pub const Parser = struct {
21392125
continue;
21402126
},
21412127

2128+
State.IdentifierListCommaOrEnd => |list_state| {
2129+
try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .IdentifierListItemOrEnd = list_state });
2130+
continue;
2131+
},
2132+
21422133
State.SwitchCaseCommaOrEnd => |list_state| {
21432134
try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .SwitchCaseOrEnd = list_state });
21442135
continue;

0 commit comments

Comments
 (0)