authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-11 13:05:42+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-11 13:05:42+02:00
log6fb5ab1b523c58350321fdcbe7ba921300bef8af
tree7c85734a205cedd2b956fd63946d50acd3741e26
parent5f3ec023cd697007ff868938e3b5fe387add6af5

std.zig.parser: Redid parsing of error set delc

related: #909

1 files changed, 31 insertions(+), 40 deletions(-)

std/zig/parser.zig+31-40
......@@ -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;