| ... | ... | @@ -266,8 +266,7 @@ pub const Parser = struct { |
| 266 | 266 | |
| 267 | 267 | // look for line comments |
| 268 | 268 | while (true) { |
| 269 | | const token = self.getNextToken(); |
| 270 | | if (token.id == Token.Id.LineComment) { |
| 269 | if (self.eatToken(Token.Id.LineComment)) |line_comment| { |
| 271 | 270 | const node = blk: { |
| 272 | 271 | if (self.pending_line_comment_node) |comment_node| { |
| 273 | 272 | break :blk comment_node; |
| ... | ... | @@ -284,10 +283,9 @@ pub const Parser = struct { |
| 284 | 283 | break :blk comment_node; |
| 285 | 284 | } |
| 286 | 285 | }; |
| 287 | | try node.lines.append(token); |
| 286 | try node.lines.append(line_comment); |
| 288 | 287 | continue; |
| 289 | 288 | } |
| 290 | | self.putBackToken(token); |
| 291 | 289 | break; |
| 292 | 290 | } |
| 293 | 291 | |
| ... | ... | @@ -301,8 +299,8 @@ pub const Parser = struct { |
| 301 | 299 | Token.Id.Keyword_test => { |
| 302 | 300 | stack.append(State.TopLevel) catch unreachable; |
| 303 | 301 | |
| 304 | | const name_token = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 305 | | const lbrace = (try self.eatToken(&stack, Token.Id.LBrace)) ?? continue; |
| 302 | const name_token = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 303 | const lbrace = (try self.expectToken(&stack, Token.Id.LBrace)) ?? continue; |
| 306 | 304 | |
| 307 | 305 | const block = try self.createNode(arena, ast.NodeBlock, |
| 308 | 306 | ast.NodeBlock { |
| ... | ... | @@ -580,25 +578,27 @@ pub const Parser = struct { |
| 580 | 578 | }, |
| 581 | 579 | State.VarDeclEq => |var_decl| { |
| 582 | 580 | const token = self.getNextToken(); |
| 583 | | if (token.id == Token.Id.Equal) { |
| 584 | | var_decl.eq_token = token; |
| 585 | | stack.append(State { |
| 586 | | .ExpectTokenSave = ExpectTokenSave { |
| 587 | | .id = Token.Id.Semicolon, |
| 588 | | .ptr = &var_decl.semicolon_token, |
| 589 | | }, |
| 590 | | }) catch unreachable; |
| 591 | | try stack.append(State { |
| 592 | | .Expression = DestPtr {.NullableField = &var_decl.init_node}, |
| 593 | | }); |
| 594 | | continue; |
| 595 | | } |
| 596 | | if (token.id == Token.Id.Semicolon) { |
| 597 | | var_decl.semicolon_token = token; |
| 598 | | continue; |
| 581 | switch (token.id) { |
| 582 | Token.Id.Equal => { |
| 583 | var_decl.eq_token = token; |
| 584 | stack.append(State { |
| 585 | .ExpectTokenSave = ExpectTokenSave { |
| 586 | .id = Token.Id.Semicolon, |
| 587 | .ptr = &var_decl.semicolon_token, |
| 588 | }, |
| 589 | }) catch unreachable; |
| 590 | try stack.append(State { .Expression = DestPtr {.NullableField = &var_decl.init_node} }); |
| 591 | continue; |
| 592 | }, |
| 593 | Token.Id.Semicolon => { |
| 594 | var_decl.semicolon_token = token; |
| 595 | continue; |
| 596 | }, |
| 597 | else => { |
| 598 | try self.parseError(&stack, token, "expected '=' or ';', found {}", @tagName(token.id)); |
| 599 | continue; |
| 600 | } |
| 599 | 601 | } |
| 600 | | try self.parseError(&stack, token, "expected '=' or ';', found {}", @tagName(token.id)); |
| 601 | | continue; |
| 602 | 602 | }, |
| 603 | 603 | |
| 604 | 604 | State.ContainerExtern => |ctx| { |
| ... | ... | @@ -752,12 +752,12 @@ pub const Parser = struct { |
| 752 | 752 | }, |
| 753 | 753 | |
| 754 | 754 | State.ExpectToken => |token_id| { |
| 755 | | _ = (try self.eatToken(&stack, token_id)) ?? continue; |
| 755 | _ = (try self.expectToken(&stack, token_id)) ?? continue; |
| 756 | 756 | continue; |
| 757 | 757 | }, |
| 758 | 758 | |
| 759 | 759 | State.ExpectTokenSave => |expect_token_save| { |
| 760 | | *expect_token_save.ptr = (try self.eatToken(&stack, expect_token_save.id)) ?? continue; |
| 760 | *expect_token_save.ptr = (try self.expectToken(&stack, expect_token_save.id)) ?? continue; |
| 761 | 761 | continue; |
| 762 | 762 | }, |
| 763 | 763 | |
| ... | ... | @@ -817,7 +817,7 @@ pub const Parser = struct { |
| 817 | 817 | break :blk null; |
| 818 | 818 | } |
| 819 | 819 | |
| 820 | | break :blk (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 820 | break :blk (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 821 | 821 | }; |
| 822 | 822 | |
| 823 | 823 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeControlFlowExpression, |
| ... | ... | @@ -979,23 +979,20 @@ pub const Parser = struct { |
| 979 | 979 | }, |
| 980 | 980 | |
| 981 | 981 | State.RangeExpressionEnd => |dest_ptr| { |
| 982 | | const token = self.getNextToken(); |
| 983 | | if (token.id == Token.Id.Ellipsis3) { |
| 982 | if (self.eatToken(Token.Id.Ellipsis3)) |ellipsis3| { |
| 984 | 983 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp, |
| 985 | 984 | ast.NodeInfixOp { |
| 986 | 985 | .base = undefined, |
| 987 | 986 | .lhs = dest_ptr.get(), |
| 988 | | .op_token = token, |
| 987 | .op_token = ellipsis3, |
| 989 | 988 | .op = ast.NodeInfixOp.InfixOp.Range, |
| 990 | 989 | .rhs = undefined, |
| 991 | 990 | } |
| 992 | 991 | ); |
| 993 | 992 | stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable; |
| 994 | | continue; |
| 995 | | } else { |
| 996 | | self.putBackToken(token); |
| 997 | | continue; |
| 998 | 993 | } |
| 994 | |
| 995 | continue; |
| 999 | 996 | }, |
| 1000 | 997 | |
| 1001 | 998 | State.AssignmentExpressionBegin => |dest_ptr| { |
| ... | ... | @@ -1329,57 +1326,49 @@ pub const Parser = struct { |
| 1329 | 1326 | }, |
| 1330 | 1327 | |
| 1331 | 1328 | State.CurlySuffixExpressionEnd => |dest_ptr| { |
| 1332 | | const token = self.getNextToken(); |
| 1333 | | if (token.id != Token.Id.LBrace) { |
| 1334 | | self.putBackToken(token); |
| 1329 | if (self.eatToken(Token.Id.LBrace) == null) { |
| 1335 | 1330 | continue; |
| 1336 | 1331 | } |
| 1337 | 1332 | |
| 1338 | | const next = self.getNextToken(); |
| 1339 | | switch (next.id) { |
| 1340 | | Token.Id.Period => { |
| 1341 | | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp, |
| 1342 | | ast.NodeSuffixOp { |
| 1343 | | .base = undefined, |
| 1344 | | .lhs = dest_ptr.get(), |
| 1345 | | .op = ast.NodeSuffixOp.SuffixOp { |
| 1346 | | .StructInitializer = ArrayList(&ast.NodeFieldInitializer).init(arena), |
| 1347 | | }, |
| 1348 | | .rtoken = undefined, |
| 1349 | | } |
| 1350 | | ); |
| 1351 | | stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable; |
| 1352 | | try stack.append(State { |
| 1353 | | .FieldInitListItemOrEnd = ListSave(&ast.NodeFieldInitializer) { |
| 1354 | | .list = &node.op.StructInitializer, |
| 1355 | | .ptr = &node.rtoken, |
| 1356 | | } |
| 1357 | | }); |
| 1358 | | self.putBackToken(next); |
| 1359 | | continue; |
| 1360 | | }, |
| 1361 | | else => { |
| 1362 | | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp, |
| 1363 | | ast.NodeSuffixOp { |
| 1364 | | .base = undefined, |
| 1365 | | .lhs = dest_ptr.get(), |
| 1366 | | .op = ast.NodeSuffixOp.SuffixOp { |
| 1367 | | .ArrayInitializer = ArrayList(&ast.Node).init(arena), |
| 1368 | | }, |
| 1369 | | .rtoken = undefined, |
| 1370 | | } |
| 1371 | | ); |
| 1372 | | stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable; |
| 1373 | | try stack.append(State { |
| 1374 | | .ExprListItemOrEnd = ExprListCtx { |
| 1375 | | .list = &node.op.ArrayInitializer, |
| 1376 | | .end = Token.Id.RBrace, |
| 1377 | | .ptr = &node.rtoken, |
| 1378 | | } |
| 1379 | | }); |
| 1380 | | self.putBackToken(next); |
| 1381 | | continue; |
| 1382 | | }, |
| 1333 | if (self.isPeekToken(Token.Id.Period)) { |
| 1334 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp, |
| 1335 | ast.NodeSuffixOp { |
| 1336 | .base = undefined, |
| 1337 | .lhs = dest_ptr.get(), |
| 1338 | .op = ast.NodeSuffixOp.SuffixOp { |
| 1339 | .StructInitializer = ArrayList(&ast.NodeFieldInitializer).init(arena), |
| 1340 | }, |
| 1341 | .rtoken = undefined, |
| 1342 | } |
| 1343 | ); |
| 1344 | stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable; |
| 1345 | try stack.append(State { |
| 1346 | .FieldInitListItemOrEnd = ListSave(&ast.NodeFieldInitializer) { |
| 1347 | .list = &node.op.StructInitializer, |
| 1348 | .ptr = &node.rtoken, |
| 1349 | } |
| 1350 | }); |
| 1351 | continue; |
| 1352 | } else { |
| 1353 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp, |
| 1354 | ast.NodeSuffixOp { |
| 1355 | .base = undefined, |
| 1356 | .lhs = dest_ptr.get(), |
| 1357 | .op = ast.NodeSuffixOp.SuffixOp { |
| 1358 | .ArrayInitializer = ArrayList(&ast.Node).init(arena), |
| 1359 | }, |
| 1360 | .rtoken = undefined, |
| 1361 | } |
| 1362 | ); |
| 1363 | stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable; |
| 1364 | try stack.append(State { |
| 1365 | .ExprListItemOrEnd = ExprListCtx { |
| 1366 | .list = &node.op.ArrayInitializer, |
| 1367 | .end = Token.Id.RBrace, |
| 1368 | .ptr = &node.rtoken, |
| 1369 | } |
| 1370 | }); |
| 1371 | continue; |
| 1383 | 1372 | } |
| 1384 | 1373 | }, |
| 1385 | 1374 | |
| ... | ... | @@ -1836,7 +1825,7 @@ pub const Parser = struct { |
| 1836 | 1825 | continue; |
| 1837 | 1826 | }, |
| 1838 | 1827 | Token.Id.Keyword_nakedcc, Token.Id.Keyword_stdcallcc => { |
| 1839 | | const fn_token = (try self.eatToken(&stack, Token.Id.Keyword_fn)) ?? continue; |
| 1828 | const fn_token = (try self.expectToken(&stack, Token.Id.Keyword_fn)) ?? continue; |
| 1840 | 1829 | const fn_proto = try self.createToDestNode(arena, dest_ptr, ast.NodeFnProto, |
| 1841 | 1830 | ast.NodeFnProto { |
| 1842 | 1831 | .base = undefined, |
| ... | ... | @@ -1867,8 +1856,8 @@ pub const Parser = struct { |
| 1867 | 1856 | } |
| 1868 | 1857 | break :blk true; |
| 1869 | 1858 | }; |
| 1870 | | _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue; |
| 1871 | | const template = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1859 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 1860 | const template = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1872 | 1861 | // TODO parse template |
| 1873 | 1862 | |
| 1874 | 1863 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeAsm, |
| ... | ... | @@ -1964,11 +1953,11 @@ pub const Parser = struct { |
| 1964 | 1953 | stack.append(State { .AsmOutputItems = items }) catch unreachable; |
| 1965 | 1954 | try stack.append(State { .IfToken = Token.Id.Comma }); |
| 1966 | 1955 | |
| 1967 | | const symbolic_name = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 1968 | | _ = (try self.eatToken(&stack, Token.Id.RBracket)) ?? continue; |
| 1969 | | const constraint = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1956 | const symbolic_name = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 1957 | _ = (try self.expectToken(&stack, Token.Id.RBracket)) ?? continue; |
| 1958 | const constraint = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1970 | 1959 | |
| 1971 | | _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue; |
| 1960 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 1972 | 1961 | try stack.append(State { .ExpectToken = Token.Id.RParen }); |
| 1973 | 1962 | |
| 1974 | 1963 | const node = try self.createNode(arena, ast.NodeAsmOutput, |
| ... | ... | @@ -2009,11 +1998,11 @@ pub const Parser = struct { |
| 2009 | 1998 | stack.append(State { .AsmInputItems = items }) catch unreachable; |
| 2010 | 1999 | try stack.append(State { .IfToken = Token.Id.Comma }); |
| 2011 | 2000 | |
| 2012 | | const symbolic_name = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2013 | | _ = (try self.eatToken(&stack, Token.Id.RBracket)) ?? continue; |
| 2014 | | const constraint = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 2001 | const symbolic_name = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2002 | _ = (try self.expectToken(&stack, Token.Id.RBracket)) ?? continue; |
| 2003 | const constraint = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 2015 | 2004 | |
| 2016 | | _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue; |
| 2005 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 2017 | 2006 | try stack.append(State { .ExpectToken = Token.Id.RParen }); |
| 2018 | 2007 | |
| 2019 | 2008 | const node = try self.createNode(arena, ast.NodeAsmInput, |
| ... | ... | @@ -2055,12 +2044,10 @@ pub const Parser = struct { |
| 2055 | 2044 | }, |
| 2056 | 2045 | |
| 2057 | 2046 | State.FieldInitListItemOrEnd => |list_state| { |
| 2058 | | var token = self.getNextToken(); |
| 2059 | | if (token.id == Token.Id.RBrace){ |
| 2060 | | *list_state.ptr = token; |
| 2047 | if (self.eatToken(Token.Id.RBrace)) |rbrace| { |
| 2048 | *list_state.ptr = rbrace; |
| 2061 | 2049 | continue; |
| 2062 | 2050 | } |
| 2063 | | self.putBackToken(token); |
| 2064 | 2051 | |
| 2065 | 2052 | const node = try self.createNode(arena, ast.NodeFieldInitializer, |
| 2066 | 2053 | ast.NodeFieldInitializer { |
| ... | ... | @@ -2090,12 +2077,10 @@ pub const Parser = struct { |
| 2090 | 2077 | }, |
| 2091 | 2078 | |
| 2092 | 2079 | State.SwitchCaseOrEnd => |list_state| { |
| 2093 | | var token = self.getNextToken(); |
| 2094 | | if (token.id == Token.Id.RBrace){ |
| 2095 | | *list_state.ptr = token; |
| 2080 | if (self.eatToken(Token.Id.RBrace)) |rbrace| { |
| 2081 | *list_state.ptr = rbrace; |
| 2096 | 2082 | continue; |
| 2097 | 2083 | } |
| 2098 | | self.putBackToken(token); |
| 2099 | 2084 | |
| 2100 | 2085 | const node = try self.createNode(arena, ast.NodeSwitchCase, |
| 2101 | 2086 | ast.NodeSwitchCase { |
| ... | ... | @@ -2112,12 +2097,12 @@ pub const Parser = struct { |
| 2112 | 2097 | |
| 2113 | 2098 | const maybe_else = self.getNextToken(); |
| 2114 | 2099 | if (maybe_else.id == Token.Id.Keyword_else) { |
| 2115 | | const else_node = try arena.create(ast.NodeSwitchElse); |
| 2116 | | *else_node = ast.NodeSwitchElse { |
| 2117 | | .base = self.initNode(ast.Node.Id.SwitchElse), |
| 2100 | const else_node = try self.createAttachNode(arena, &node.items, ast.NodeSwitchElse, |
| 2101 | ast.NodeSwitchElse { |
| 2102 | .base = undefined, |
| 2118 | 2103 | .token = maybe_else, |
| 2119 | | }; |
| 2120 | | try node.items.append(&else_node.base); |
| 2104 | } |
| 2105 | ); |
| 2121 | 2106 | try stack.append(State { .ExpectToken = Token.Id.EqualAngleBracketRight }); |
| 2122 | 2107 | continue; |
| 2123 | 2108 | } else { |
| ... | ... | @@ -2186,7 +2171,7 @@ pub const Parser = struct { |
| 2186 | 2171 | continue; |
| 2187 | 2172 | } |
| 2188 | 2173 | |
| 2189 | | _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue; |
| 2174 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 2190 | 2175 | stack.append(State { .ExpectToken = Token.Id.RParen }) catch unreachable; |
| 2191 | 2176 | try stack.append(State { .AssignmentExpressionBegin = DestPtr { .NullableField = dest } }); |
| 2192 | 2177 | }, |
| ... | ... | @@ -2232,8 +2217,8 @@ pub const Parser = struct { |
| 2232 | 2217 | continue; |
| 2233 | 2218 | } |
| 2234 | 2219 | |
| 2235 | | const error_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2236 | | const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue; |
| 2220 | const error_symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2221 | const rpipe = (try self.expectToken(&stack, Token.Id.Pipe)) ?? continue; |
| 2237 | 2222 | *dest = try self.createNode(arena, ast.NodePayload, |
| 2238 | 2223 | ast.NodePayload { |
| 2239 | 2224 | .base = undefined, |
| ... | ... | @@ -2261,8 +2246,8 @@ pub const Parser = struct { |
| 2261 | 2246 | } |
| 2262 | 2247 | }; |
| 2263 | 2248 | |
| 2264 | | const value_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2265 | | const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue; |
| 2249 | const value_symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2250 | const rpipe = (try self.expectToken(&stack, Token.Id.Pipe)) ?? continue; |
| 2266 | 2251 | *dest = try self.createNode(arena, ast.NodePointerPayload, |
| 2267 | 2252 | ast.NodePointerPayload { |
| 2268 | 2253 | .base = undefined, |
| ... | ... | @@ -2291,7 +2276,7 @@ pub const Parser = struct { |
| 2291 | 2276 | } |
| 2292 | 2277 | }; |
| 2293 | 2278 | |
| 2294 | | const value_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2279 | const value_symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2295 | 2280 | const index_symbol = blk: { |
| 2296 | 2281 | const comma = self.getNextToken(); |
| 2297 | 2282 | if (comma.id != Token.Id.Comma) { |
| ... | ... | @@ -2299,11 +2284,11 @@ pub const Parser = struct { |
| 2299 | 2284 | break :blk null; |
| 2300 | 2285 | } |
| 2301 | 2286 | |
| 2302 | | const symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2287 | const symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 2303 | 2288 | break :blk try self.createLiteral(arena, ast.NodeIdentifier, symbol); |
| 2304 | 2289 | }; |
| 2305 | 2290 | |
| 2306 | | const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue; |
| 2291 | const rpipe = (try self.expectToken(&stack, Token.Id.Pipe)) ?? continue; |
| 2307 | 2292 | *dest = try self.createNode(arena, ast.NodePointerIndexPayload, |
| 2308 | 2293 | ast.NodePointerIndexPayload { |
| 2309 | 2294 | .base = undefined, |
| ... | ... | @@ -2370,11 +2355,9 @@ pub const Parser = struct { |
| 2370 | 2355 | }, |
| 2371 | 2356 | |
| 2372 | 2357 | State.FnProtoAlign => |fn_proto| { |
| 2373 | | const token = self.getNextToken(); |
| 2374 | | if (token.id == Token.Id.Keyword_align) { |
| 2358 | if (self.eatToken(Token.Id.Keyword_align)) |align_token| { |
| 2375 | 2359 | @panic("TODO fn proto align"); |
| 2376 | 2360 | } |
| 2377 | | self.putBackToken(token); |
| 2378 | 2361 | stack.append(State { |
| 2379 | 2362 | .FnProtoReturnType = fn_proto, |
| 2380 | 2363 | }) catch unreachable; |
| ... | ... | @@ -2389,6 +2372,11 @@ pub const Parser = struct { |
| 2389 | 2372 | stack.append(State { |
| 2390 | 2373 | .TypeExprBegin = DestPtr {.Field = &fn_proto.return_type.InferErrorSet}, |
| 2391 | 2374 | }) catch unreachable; |
| 2375 | continue; |
| 2376 | }, |
| 2377 | Token.Id.Keyword_align => { |
| 2378 | @panic("TODO fn proto align"); |
| 2379 | continue; |
| 2392 | 2380 | }, |
| 2393 | 2381 | else => { |
| 2394 | 2382 | self.putBackToken(token); |
| ... | ... | @@ -2396,17 +2384,13 @@ pub const Parser = struct { |
| 2396 | 2384 | stack.append(State { |
| 2397 | 2385 | .TypeExprBegin = DestPtr {.Field = &fn_proto.return_type.Explicit}, |
| 2398 | 2386 | }) catch unreachable; |
| 2387 | continue; |
| 2399 | 2388 | }, |
| 2400 | 2389 | } |
| 2401 | | if (token.id == Token.Id.Keyword_align) { |
| 2402 | | @panic("TODO fn proto align"); |
| 2403 | | } |
| 2404 | | continue; |
| 2405 | 2390 | }, |
| 2406 | 2391 | |
| 2407 | 2392 | State.ParamDecl => |fn_proto| { |
| 2408 | | var token = self.getNextToken(); |
| 2409 | | if (token.id == Token.Id.RParen) { |
| 2393 | if (self.eatToken(Token.Id.RParen)) |_| { |
| 2410 | 2394 | continue; |
| 2411 | 2395 | } |
| 2412 | 2396 | const param_decl = try self.createAttachNode(arena, &fn_proto.params, ast.NodeParamDecl, |
| ... | ... | @@ -2419,28 +2403,22 @@ pub const Parser = struct { |
| 2419 | 2403 | .var_args_token = null, |
| 2420 | 2404 | }, |
| 2421 | 2405 | ); |
| 2422 | | if (token.id == Token.Id.Keyword_comptime) { |
| 2423 | | param_decl.comptime_token = token; |
| 2424 | | token = self.getNextToken(); |
| 2425 | | } else if (token.id == Token.Id.Keyword_noalias) { |
| 2426 | | param_decl.noalias_token = token; |
| 2427 | | token = self.getNextToken(); |
| 2406 | if (self.eatToken(Token.Id.Keyword_comptime)) |comptime_token| { |
| 2407 | param_decl.comptime_token = comptime_token; |
| 2408 | } else if (self.eatToken(Token.Id.Keyword_noalias)) |noalias_token| { |
| 2409 | param_decl.noalias_token = noalias_token; |
| 2428 | 2410 | } |
| 2429 | | if (token.id == Token.Id.Identifier) { |
| 2430 | | const next_token = self.getNextToken(); |
| 2431 | | if (next_token.id == Token.Id.Colon) { |
| 2432 | | param_decl.name_token = token; |
| 2433 | | token = self.getNextToken(); |
| 2411 | if (self.eatToken(Token.Id.Identifier)) |identifier| { |
| 2412 | if (self.eatToken(Token.Id.Colon)) |_| { |
| 2413 | param_decl.name_token = identifier; |
| 2434 | 2414 | } else { |
| 2435 | | self.putBackToken(next_token); |
| 2415 | self.putBackToken(identifier); |
| 2436 | 2416 | } |
| 2437 | 2417 | } |
| 2438 | | if (token.id == Token.Id.Ellipsis3) { |
| 2439 | | param_decl.var_args_token = token; |
| 2418 | if (self.eatToken(Token.Id.Ellipsis3)) |ellipsis3| { |
| 2419 | param_decl.var_args_token = ellipsis3; |
| 2440 | 2420 | stack.append(State { .ExpectToken = Token.Id.RParen }) catch unreachable; |
| 2441 | 2421 | continue; |
| 2442 | | } else { |
| 2443 | | self.putBackToken(token); |
| 2444 | 2422 | } |
| 2445 | 2423 | |
| 2446 | 2424 | stack.append(State { .ParamDecl = fn_proto }) catch unreachable; |
| ... | ... | @@ -2736,7 +2714,7 @@ pub const Parser = struct { |
| 2736 | 2714 | State.Semicolon => |node_ptr| { |
| 2737 | 2715 | const node = *node_ptr; |
| 2738 | 2716 | if (requireSemiColon(node)) { |
| 2739 | | _ = (try self.eatToken(&stack, Token.Id.Semicolon)) ?? continue; |
| 2717 | _ = (try self.expectToken(&stack, Token.Id.Semicolon)) ?? continue; |
| 2740 | 2718 | } |
| 2741 | 2719 | } |
| 2742 | 2720 | } |
| ... | ... | @@ -2923,18 +2901,17 @@ pub const Parser = struct { |
| 2923 | 2901 | }; |
| 2924 | 2902 | } |
| 2925 | 2903 | |
| 2926 | | fn initNode(self: &Parser, id: ast.Node.Id) ast.Node { |
| 2927 | | if (self.pending_line_comment_node) |comment_node| { |
| 2928 | | self.pending_line_comment_node = null; |
| 2929 | | return ast.Node {.id = id, .comment = comment_node}; |
| 2930 | | } |
| 2931 | | return ast.Node {.id = id, .comment = null }; |
| 2932 | | } |
| 2933 | | |
| 2934 | 2904 | fn createNode(self: &Parser, arena: &mem.Allocator, comptime T: type, init_to: &const T) !&T { |
| 2935 | 2905 | const node = try arena.create(T); |
| 2936 | 2906 | *node = *init_to; |
| 2937 | | node.base = self.initNode(ast.Node.typeToId(T)); |
| 2907 | node.base = blk: { |
| 2908 | const id = ast.Node.typeToId(T); |
| 2909 | if (self.pending_line_comment_node) |comment_node| { |
| 2910 | self.pending_line_comment_node = null; |
| 2911 | break :blk ast.Node {.id = id, .comment = comment_node}; |
| 2912 | } |
| 2913 | break :blk ast.Node {.id = id, .comment = null }; |
| 2914 | }; |
| 2938 | 2915 | |
| 2939 | 2916 | return node; |
| 2940 | 2917 | } |
| ... | ... | @@ -2986,15 +2963,6 @@ pub const Parser = struct { |
| 2986 | 2963 | }; |
| 2987 | 2964 | } |
| 2988 | 2965 | |
| 2989 | | fn eatToken(self: &Parser, stack: &ArrayList(State), id: @TagType(Token.Id)) !?Token { |
| 2990 | | const token = self.getNextToken(); |
| 2991 | | if (token.id != id) { |
| 2992 | | try self.parseError(stack, token, "expected {}, found {}", @tagName(id), @tagName(token.id)); |
| 2993 | | return null; |
| 2994 | | } |
| 2995 | | return token; |
| 2996 | | } |
| 2997 | | |
| 2998 | 2966 | fn revertIfOptional(self: &Parser, stack: &ArrayList(State)) !void { |
| 2999 | 2967 | while (stack.popOrNull()) |state| { |
| 3000 | 2968 | switch (state) { |
| ... | ... | @@ -3011,6 +2979,22 @@ pub const Parser = struct { |
| 3011 | 2979 | return error.NoOptionalStateFound; |
| 3012 | 2980 | } |
| 3013 | 2981 | |
| 2982 | fn expectToken(self: &Parser, stack: &ArrayList(State), id: @TagType(Token.Id)) !?Token { |
| 2983 | const token = self.getNextToken(); |
| 2984 | if (token.id != id) { |
| 2985 | try self.parseError(stack, token, "expected {}, found {}", @tagName(id), @tagName(token.id)); |
| 2986 | return null; |
| 2987 | } |
| 2988 | return token; |
| 2989 | } |
| 2990 | |
| 2991 | fn eatToken(self: &Parser, id: @TagType(Token.Id)) ?Token { |
| 2992 | if (self.isPeekToken(id)) { |
| 2993 | return self.getNextToken(); |
| 2994 | } |
| 2995 | return null; |
| 2996 | } |
| 2997 | |
| 3014 | 2998 | fn putBackToken(self: &Parser, token: &const Token) void { |
| 3015 | 2999 | self.put_back_tokens[self.put_back_count] = *token; |
| 3016 | 3000 | self.put_back_count += 1; |
| ... | ... | @@ -3027,6 +3011,12 @@ pub const Parser = struct { |
| 3027 | 3011 | } |
| 3028 | 3012 | } |
| 3029 | 3013 | |
| 3014 | fn isPeekToken(self: &Parser, id: @TagType(Token.Id)) bool { |
| 3015 | const token = self.getNextToken(); |
| 3016 | defer self.putBackToken(token); |
| 3017 | return id == token.id; |
| 3018 | } |
| 3019 | |
| 3030 | 3020 | const RenderAstFrame = struct { |
| 3031 | 3021 | node: &ast.Node, |
| 3032 | 3022 | indent: usize, |