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 {...@@ -177,6 +177,8 @@ pub const Parser = struct {
177 FieldInitListItemOrEnd: ListSave(&ast.NodeFieldInitializer),177 FieldInitListItemOrEnd: ListSave(&ast.NodeFieldInitializer),
178 FieldInitListCommaOrEnd: ListSave(&ast.NodeFieldInitializer),178 FieldInitListCommaOrEnd: ListSave(&ast.NodeFieldInitializer),
179 FieldListCommaOrEnd: &ast.NodeContainerDecl,179 FieldListCommaOrEnd: &ast.NodeContainerDecl,
180 IdentifierListItemOrEnd: ListSave(&ast.NodeIdentifier),
181 IdentifierListCommaOrEnd: ListSave(&ast.NodeIdentifier),
180 SwitchCaseOrEnd: ListSave(&ast.NodeSwitchCase),182 SwitchCaseOrEnd: ListSave(&ast.NodeSwitchCase),
181 SuspendBody: &ast.NodeSuspend,183 SuspendBody: &ast.NodeSuspend,
182 AsyncEnd: AsyncEndCtx,184 AsyncEnd: AsyncEndCtx,
...@@ -1683,11 +1685,8 @@ pub const Parser = struct {...@@ -1683,11 +1685,8 @@ pub const Parser = struct {
16831685
1684 },1686 },
1685 Token.Id.Keyword_error => {1687 Token.Id.Keyword_error => {
1686 const next = self.getNextToken();1688 if (self.eatToken(Token.Id.LBrace) == null) {
1687
1688 if (next.id != Token.Id.LBrace) {
1689 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeErrorType, token)).base);1689 dest_ptr.store(&(try self.createLiteral(arena, ast.NodeErrorType, token)).base);
1690 self.putBackToken(next);
1691 continue;1690 continue;
1692 }1691 }
16931692
...@@ -1700,43 +1699,12 @@ pub const Parser = struct {...@@ -1700,43 +1699,12 @@ pub const Parser = struct {
1700 }1699 }
1701 );1700 );
17021701
1703 while (true) {1702 stack.append(State {
1704 const t = self.getNextToken();1703 .IdentifierListItemOrEnd = ListSave(&ast.NodeIdentifier) {
1705 switch (t.id) {1704 .list = &node.decls,
1706 Token.Id.RBrace => {1705 .ptr = &node.rbrace_token,
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 }
1738 }1706 }
1739 }1707 }) catch unreachable;
1740 continue;1708 continue;
1741 },1709 },
1742 Token.Id.Keyword_packed => {1710 Token.Id.Keyword_packed => {
...@@ -2082,6 +2050,24 @@ pub const Parser = struct {...@@ -2082,6 +2050,24 @@ pub const Parser = struct {
2082 });2050 });
2083 },2051 },
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
2085 State.SwitchCaseOrEnd => |list_state| {2071 State.SwitchCaseOrEnd => |list_state| {
2086 if (self.eatToken(Token.Id.RBrace)) |rbrace| {2072 if (self.eatToken(Token.Id.RBrace)) |rbrace| {
2087 *list_state.ptr = rbrace;2073 *list_state.ptr = rbrace;
...@@ -2139,6 +2125,11 @@ pub const Parser = struct {...@@ -2139,6 +2125,11 @@ pub const Parser = struct {
2139 continue;2125 continue;
2140 },2126 },
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
2142 State.SwitchCaseCommaOrEnd => |list_state| {2133 State.SwitchCaseCommaOrEnd => |list_state| {
2143 try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .SwitchCaseOrEnd = list_state });2134 try self.commaOrEnd(&stack, Token.Id.RBrace, list_state.ptr, State { .SwitchCaseOrEnd = list_state });
2144 continue;2135 continue;