| ... | @@ -261,11 +261,6 @@ pub fn parseZon(p: *Parse) Allocator.Error!void { | ... | @@ -261,11 +261,6 @@ pub fn parseZon(p: *Parse) Allocator.Error!void { |
| 261 | p.nodes.items(.data)[0] = .{ .node = node_index }; | 261 | p.nodes.items(.data)[0] = .{ .node = node_index }; |
| 262 | } | 262 | } |
| 263 | | 263 | |
| 264 | /// ContainerMembers <- container_doc_comment? ContainerDeclaration* (ContainerField COMMA)* (ContainerField / ContainerDeclaration*) | | |
| 265 | /// | | |
| 266 | /// ContainerDeclaration <- TestDecl / ComptimeDecl / doc_comment? KEYWORD_pub? Decl | | |
| 267 | /// | | |
| 268 | /// ComptimeDecl <- KEYWORD_comptime Block | | |
| 269 | fn parseContainerMembers(p: *Parse) Error!Members { | 264 | fn parseContainerMembers(p: *Parse) Error!Members { |
| 270 | const scratch_top = p.scratch.items.len; | 265 | const scratch_top = p.scratch.items.len; |
| 271 | defer p.scratch.shrinkRetainingCapacity(scratch_top); | 266 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | @@ -613,7 +608,6 @@ fn findNextStmt(p: *Parse) void { | ... | @@ -613,7 +608,6 @@ fn findNextStmt(p: *Parse) void { |
| 613 | } | 608 | } |
| 614 | } | 609 | } |
| 615 | | 610 | |
| 616 | /// TestDecl <- KEYWORD_test (STRINGLITERALSINGLE / IDENTIFIER)? Block | | |
| 617 | fn expectTestDecl(p: *Parse) Error!Node.Index { | 611 | fn expectTestDecl(p: *Parse) Error!Node.Index { |
| 618 | const test_token = p.assertToken(.keyword_test); | 612 | const test_token = p.assertToken(.keyword_test); |
| 619 | const name_token: OptionalTokenIndex = switch (p.tokenTag(p.tok_i)) { | 613 | const name_token: OptionalTokenIndex = switch (p.tokenTag(p.tok_i)) { |
| ... | @@ -643,10 +637,6 @@ fn expectTestDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { | ... | @@ -643,10 +637,6 @@ fn expectTestDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { |
| 643 | } | 637 | } |
| 644 | } | 638 | } |
| 645 | | 639 | |
| 646 | /// Decl | | |
| 647 | /// <- (KEYWORD_export / KEYWORD_inline / KEYWORD_noinline)? FnProto (SEMICOLON / Block) | | |
| 648 | /// / KEYWORD_extern STRINGLITERALSINGLE? FnProto SEMICOLON | | |
| 649 | /// / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl | | |
| 650 | fn expectTopLevelDecl(p: *Parse) !?Node.Index { | 640 | fn expectTopLevelDecl(p: *Parse) !?Node.Index { |
| 651 | const extern_export_inline_token = p.nextToken(); | 641 | const extern_export_inline_token = p.nextToken(); |
| 652 | var is_extern: bool = false; | 642 | var is_extern: bool = false; |
| ... | @@ -722,7 +712,6 @@ fn expectTopLevelDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { | ... | @@ -722,7 +712,6 @@ fn expectTopLevelDeclRecoverable(p: *Parse) error{OutOfMemory}!?Node.Index { |
| 722 | }; | 712 | }; |
| 723 | } | 713 | } |
| 724 | | 714 | |
| 725 | /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? AddrSpace? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr !ExprSuffix | | |
| 726 | fn parseFnProto(p: *Parse) !?Node.Index { | 715 | fn parseFnProto(p: *Parse) !?Node.Index { |
| 727 | const fn_token = p.eatToken(.keyword_fn) orelse return null; | 716 | const fn_token = p.eatToken(.keyword_fn) orelse return null; |
| 728 | | 717 | |
| ... | @@ -815,7 +804,6 @@ fn setVarDeclInitExpr(p: *Parse, var_decl: Node.Index, init_expr: Node.OptionalI | ... | @@ -815,7 +804,6 @@ fn setVarDeclInitExpr(p: *Parse, var_decl: Node.Index, init_expr: Node.OptionalI |
| 815 | init_expr_result.* = init_expr; | 804 | init_expr_result.* = init_expr; |
| 816 | } | 805 | } |
| 817 | | 806 | |
| 818 | /// VarDeclProto <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? AddrSpace? LinkSection? | | |
| 819 | /// Returns a `*_var_decl` node with its rhs (init expression) initialized to .none. | 807 | /// Returns a `*_var_decl` node with its rhs (init expression) initialized to .none. |
| 820 | fn parseVarDeclProto(p: *Parse) !?Node.Index { | 808 | fn parseVarDeclProto(p: *Parse) !?Node.Index { |
| 821 | const mut_token = p.eatToken(.keyword_const) orelse | 809 | const mut_token = p.eatToken(.keyword_const) orelse |
| ... | @@ -887,7 +875,6 @@ fn parseVarDeclProto(p: *Parse) !?Node.Index { | ... | @@ -887,7 +875,6 @@ fn parseVarDeclProto(p: *Parse) !?Node.Index { |
| 887 | } | 875 | } |
| 888 | } | 876 | } |
| 889 | | 877 | |
| 890 | /// GlobalVarDecl <- VarDeclProto (EQUAL Expr?) SEMICOLON | | |
| 891 | fn parseGlobalVarDecl(p: *Parse) !?Node.Index { | 878 | fn parseGlobalVarDecl(p: *Parse) !?Node.Index { |
| 892 | const var_decl = try p.parseVarDeclProto() orelse return null; | 879 | const var_decl = try p.parseVarDeclProto() orelse return null; |
| 893 | | 880 | |
| ... | @@ -910,7 +897,6 @@ fn parseGlobalVarDecl(p: *Parse) !?Node.Index { | ... | @@ -910,7 +897,6 @@ fn parseGlobalVarDecl(p: *Parse) !?Node.Index { |
| 910 | return var_decl; | 897 | return var_decl; |
| 911 | } | 898 | } |
| 912 | | 899 | |
| 913 | // ContainerField <- doc_comment? KEYWORD_comptime? (IDENTIFIER COLON)? TypeExpr ByteAlign? (EQUAL Expr)? | | |
| 914 | fn expectContainerField(p: *Parse) !Node.Index { | 900 | fn expectContainerField(p: *Parse) !Node.Index { |
| 915 | _ = p.eatToken(.keyword_comptime); | 901 | _ = p.eatToken(.keyword_comptime); |
| 916 | const main_token = p.tok_i; | 902 | const main_token = p.tok_i; |
| ... | @@ -952,25 +938,6 @@ fn expectContainerField(p: *Parse) !Node.Index { | ... | @@ -952,25 +938,6 @@ fn expectContainerField(p: *Parse) !Node.Index { |
| 952 | } | 938 | } |
| 953 | } | 939 | } |
| 954 | | 940 | |
| 955 | /// BlockStatement | | |
| 956 | /// <- Statement | | |
| 957 | /// / KEYWORD_defer BlockExprStatement | | |
| 958 | /// / KEYWORD_errdefer BlockExprStatement | | |
| 959 | /// / !StatementPrefix KEYWORD_comptime? VarAssignStatement | | |
| 960 | /// | | |
| 961 | /// Statement | | |
| 962 | /// <- IfStatement | | |
| 963 | /// / LabeledStatement | | |
| 964 | /// / KEYWORD_nosuspend BlockExprStatement | | |
| 965 | /// / KEYWORD_comptime BlockExpr | | |
| 966 | /// / KEYWORD_suspend BlockExprStatement | | |
| 967 | /// / !StatementPrefix KEYWORD_comptime? AssignExpr SEMICOLON | | |
| 968 | /// | | |
| 969 | /// StatementPrefix | | |
| 970 | /// <- KEYWORD_if | | |
| 971 | /// / BlockLabel? (LBRACE / KEYWORD_inline? (KEYWORD_for / KEYWORD_while) / KEYWORD_switch) | | |
| 972 | /// / KEYWORD_nosuspend | | |
| 973 | /// / KEYWORD_comptime BlockExprPrefix | | |
| 974 | fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index { | 941 | fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index { |
| 975 | if (p.eatToken(.keyword_comptime)) |comptime_token| { | 942 | if (p.eatToken(.keyword_comptime)) |comptime_token| { |
| 976 | const opt_block_expr = try p.parseBlockExpr(); | 943 | const opt_block_expr = try p.parseBlockExpr(); |
| ... | @@ -1052,7 +1019,6 @@ fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index { | ... | @@ -1052,7 +1019,6 @@ fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index { |
| 1052 | } | 1019 | } |
| 1053 | } | 1020 | } |
| 1054 | | 1021 | |
| 1055 | /// VarAssignStatement <- (VarDeclProto / Expr) (COMMA (VarDeclProto / Expr))* EQUAL Expr SEMICOLON | | |
| 1056 | fn expectVarAssignStatement(p: *Parse, comptime_token: ?TokenIndex) !Node.Index { | 1022 | fn expectVarAssignStatement(p: *Parse, comptime_token: ?TokenIndex) !Node.Index { |
| 1057 | const scratch_top = p.scratch.items.len; | 1023 | const scratch_top = p.scratch.items.len; |
| 1058 | defer p.scratch.shrinkRetainingCapacity(scratch_top); | 1024 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | @@ -1182,11 +1148,6 @@ fn expectStatementRecoverable(p: *Parse) Error!?Node.Index { | ... | @@ -1182,11 +1148,6 @@ fn expectStatementRecoverable(p: *Parse) Error!?Node.Index { |
| 1182 | } | 1148 | } |
| 1183 | } | 1149 | } |
| 1184 | | 1150 | |
| 1185 | /// IfStatement | | |
| 1186 | /// <- IfPrefix BlockExpr (KEYWORD_else Payload? Statement / !KEYWORD_else) | | |
| 1187 | /// / IfPrefix !BlockExprPrefix AssignExpr (SEMICOLON / KEYWORD_else Payload? Statement) | | |
| 1188 | /// | | |
| 1189 | /// IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? | | |
| 1190 | fn expectIfStatement(p: *Parse) !Node.Index { | 1151 | fn expectIfStatement(p: *Parse) !Node.Index { |
| 1191 | const if_token = p.assertToken(.keyword_if); | 1152 | const if_token = p.assertToken(.keyword_if); |
| 1192 | _ = try p.expectToken(.l_paren); | 1153 | _ = try p.expectToken(.l_paren); |
| ... | @@ -1244,7 +1205,6 @@ fn expectIfStatement(p: *Parse) !Node.Index { | ... | @@ -1244,7 +1205,6 @@ fn expectIfStatement(p: *Parse) !Node.Index { |
| 1244 | }); | 1205 | }); |
| 1245 | } | 1206 | } |
| 1246 | | 1207 | |
| 1247 | /// LabeledStatement <- BlockLabel? (Block / LoopStatement / SwitchExpr) | | |
| 1248 | fn parseLabeledStatement(p: *Parse) !?Node.Index { | 1208 | fn parseLabeledStatement(p: *Parse) !?Node.Index { |
| 1249 | const opt_label_token = p.parseBlockLabel(); | 1209 | const opt_label_token = p.parseBlockLabel(); |
| 1250 | | 1210 | |
| ... | @@ -1271,7 +1231,6 @@ fn parseLabeledStatement(p: *Parse) !?Node.Index { | ... | @@ -1271,7 +1231,6 @@ fn parseLabeledStatement(p: *Parse) !?Node.Index { |
| 1271 | return p.failMsg(.{ .tag = .expected_labelable, .token = after_colon }); | 1231 | return p.failMsg(.{ .tag = .expected_labelable, .token = after_colon }); |
| 1272 | } | 1232 | } |
| 1273 | | 1233 | |
| 1274 | /// LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) | | |
| 1275 | fn parseLoopStatement(p: *Parse) !?Node.Index { | 1234 | fn parseLoopStatement(p: *Parse) !?Node.Index { |
| 1276 | const inline_token = p.eatToken(.keyword_inline); | 1235 | const inline_token = p.eatToken(.keyword_inline); |
| 1277 | | 1236 | |
| ... | @@ -1284,9 +1243,6 @@ fn parseLoopStatement(p: *Parse) !?Node.Index { | ... | @@ -1284,9 +1243,6 @@ fn parseLoopStatement(p: *Parse) !?Node.Index { |
| 1284 | return p.fail(.expected_inlinable); | 1243 | return p.fail(.expected_inlinable); |
| 1285 | } | 1244 | } |
| 1286 | | 1245 | |
| 1287 | /// ForStatement | | |
| 1288 | /// <- ForPrefix BlockExpr (KEYWORD_else Statement / !KEYWORD_else) | | |
| 1289 | /// / ForPrefix !BlockExprPrefix AssignExpr (SEMICOLON / KEYWORD_else Statement) | | |
| 1290 | fn parseForStatement(p: *Parse) !?Node.Index { | 1246 | fn parseForStatement(p: *Parse) !?Node.Index { |
| 1291 | const for_token = p.eatToken(.keyword_for) orelse return null; | 1247 | const for_token = p.eatToken(.keyword_for) orelse return null; |
| 1292 | | 1248 | |
| ... | @@ -1339,11 +1295,6 @@ fn parseForStatement(p: *Parse) !?Node.Index { | ... | @@ -1339,11 +1295,6 @@ fn parseForStatement(p: *Parse) !?Node.Index { |
| 1339 | }); | 1295 | }); |
| 1340 | } | 1296 | } |
| 1341 | | 1297 | |
| 1342 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? | | |
| 1343 | /// | | |
| 1344 | /// WhileStatement | | |
| 1345 | /// <- WhilePrefix BlockExpr (KEYWORD_else Payload? Statement / !KEYWORD_else) | | |
| 1346 | /// / WhilePrefix !BlockExprPrefix AssignExpr (SEMICOLON / KEYWORD_else Payload? Statement) | | |
| 1347 | fn parseWhileStatement(p: *Parse) !?Node.Index { | 1298 | fn parseWhileStatement(p: *Parse) !?Node.Index { |
| 1348 | const while_token = p.eatToken(.keyword_while) orelse return null; | 1299 | const while_token = p.eatToken(.keyword_while) orelse return null; |
| 1349 | _ = try p.expectToken(.l_paren); | 1300 | _ = try p.expectToken(.l_paren); |
| ... | @@ -1431,9 +1382,6 @@ fn parseWhileStatement(p: *Parse) !?Node.Index { | ... | @@ -1431,9 +1382,6 @@ fn parseWhileStatement(p: *Parse) !?Node.Index { |
| 1431 | }); | 1382 | }); |
| 1432 | } | 1383 | } |
| 1433 | | 1384 | |
| 1434 | /// BlockExprStatement | | |
| 1435 | /// <- BlockExpr | | |
| 1436 | /// / !BlockExprPrefix AssignExpr SEMICOLON | | |
| 1437 | fn parseBlockExprStatement(p: *Parse) !?Node.Index { | 1385 | fn parseBlockExprStatement(p: *Parse) !?Node.Index { |
| 1438 | const block_expr = try p.parseBlockExpr(); | 1386 | const block_expr = try p.parseBlockExpr(); |
| 1439 | if (block_expr) |expr| return expr; | 1387 | if (block_expr) |expr| return expr; |
| ... | @@ -1449,7 +1397,6 @@ fn expectBlockExprStatement(p: *Parse) !Node.Index { | ... | @@ -1449,7 +1397,6 @@ fn expectBlockExprStatement(p: *Parse) !Node.Index { |
| 1449 | return try p.parseBlockExprStatement() orelse return p.fail(.expected_block_or_expr); | 1397 | return try p.parseBlockExprStatement() orelse return p.fail(.expected_block_or_expr); |
| 1450 | } | 1398 | } |
| 1451 | | 1399 | |
| 1452 | /// BlockExpr <- BlockLabel? Block | | |
| 1453 | fn parseBlockExpr(p: *Parse) Error!?Node.Index { | 1400 | fn parseBlockExpr(p: *Parse) Error!?Node.Index { |
| 1454 | switch (p.tokenTag(p.tok_i)) { | 1401 | switch (p.tokenTag(p.tok_i)) { |
| 1455 | .identifier => { | 1402 | .identifier => { |
| ... | @@ -1467,33 +1414,11 @@ fn parseBlockExpr(p: *Parse) Error!?Node.Index { | ... | @@ -1467,33 +1414,11 @@ fn parseBlockExpr(p: *Parse) Error!?Node.Index { |
| 1467 | } | 1414 | } |
| 1468 | } | 1415 | } |
| 1469 | | 1416 | |
| 1470 | /// AssignExpr <- Expr (AssignOp Expr / (COMMA Expr)+ EQUAL Expr / !AssignOp !COMMA) | | |
| 1471 | /// | | |
| 1472 | /// AssignOp | | |
| 1473 | /// <- ASTERISKEQUAL | | |
| 1474 | /// / ASTERISKPIPEEQUAL | | |
| 1475 | /// / SLASHEQUAL | | |
| 1476 | /// / PERCENTEQUAL | | |
| 1477 | /// / PLUSEQUAL | | |
| 1478 | /// / PLUSPIPEEQUAL | | |
| 1479 | /// / MINUSEQUAL | | |
| 1480 | /// / MINUSPIPEEQUAL | | |
| 1481 | /// / LARROW2EQUAL | | |
| 1482 | /// / LARROW2PIPEEQUAL | | |
| 1483 | /// / RARROW2EQUAL | | |
| 1484 | /// / AMPERSANDEQUAL | | |
| 1485 | /// / CARETEQUAL | | |
| 1486 | /// / PIPEEQUAL | | |
| 1487 | /// / ASTERISKPERCENTEQUAL | | |
| 1488 | /// / PLUSPERCENTEQUAL | | |
| 1489 | /// / MINUSPERCENTEQUAL | | |
| 1490 | /// / EQUAL | | |
| 1491 | fn parseAssignExpr(p: *Parse) !?Node.Index { | 1417 | fn parseAssignExpr(p: *Parse) !?Node.Index { |
| 1492 | const expr = try p.parseExpr() orelse return null; | 1418 | const expr = try p.parseExpr() orelse return null; |
| 1493 | return try p.finishAssignExpr(expr); | 1419 | return try p.finishAssignExpr(expr); |
| 1494 | } | 1420 | } |
| 1495 | | 1421 | |
| 1496 | /// SingleAssignExpr <- Expr (AssignOp Expr / !AssignOp) | | |
| 1497 | fn parseSingleAssignExpr(p: *Parse) !?Node.Index { | 1422 | fn parseSingleAssignExpr(p: *Parse) !?Node.Index { |
| 1498 | const lhs = try p.parseExpr() orelse return null; | 1423 | const lhs = try p.parseExpr() orelse return null; |
| 1499 | const tag = assignOpNode(p.tokenTag(p.tok_i)) orelse return lhs; | 1424 | const tag = assignOpNode(p.tokenTag(p.tok_i)) orelse return lhs; |
| ... | @@ -1708,15 +1633,6 @@ fn parseExprPrecedence(p: *Parse, min_prec: i32) Error!?Node.Index { | ... | @@ -1708,15 +1633,6 @@ fn parseExprPrecedence(p: *Parse, min_prec: i32) Error!?Node.Index { |
| 1708 | return node; | 1633 | return node; |
| 1709 | } | 1634 | } |
| 1710 | | 1635 | |
| 1711 | /// PrefixExpr <- PrefixOp* PrimaryExpr / !PrefixOp | | |
| 1712 | /// | | |
| 1713 | /// PrefixOp | | |
| 1714 | /// <- EXCLAMATIONMARK | | |
| 1715 | /// / MINUS | | |
| 1716 | /// / TILDE | | |
| 1717 | /// / MINUSPERCENT | | |
| 1718 | /// / AMPERSAND | | |
| 1719 | /// / KEYWORD_try | | |
| 1720 | fn parsePrefixExpr(p: *Parse) Error!?Node.Index { | 1636 | fn parsePrefixExpr(p: *Parse) Error!?Node.Index { |
| 1721 | const tag: Node.Tag = switch (p.tokenTag(p.tok_i)) { | 1637 | const tag: Node.Tag = switch (p.tokenTag(p.tok_i)) { |
| 1722 | .bang => .bool_not, | 1638 | .bang => .bool_not, |
| ... | @@ -1738,28 +1654,6 @@ fn expectPrefixExpr(p: *Parse) Error!Node.Index { | ... | @@ -1738,28 +1654,6 @@ fn expectPrefixExpr(p: *Parse) Error!Node.Index { |
| 1738 | return try p.parsePrefixExpr() orelse return p.fail(.expected_prefix_expr); | 1654 | return try p.parsePrefixExpr() orelse return p.fail(.expected_prefix_expr); |
| 1739 | } | 1655 | } |
| 1740 | | 1656 | |
| 1741 | /// TypeExpr <- PrefixTypeOp* !PrefixTypeOpPrefix ErrorUnionExpr | | |
| 1742 | /// | | |
| 1743 | /// PrefixTypeOp | | |
| 1744 | /// <- QUESTIONMARK | | |
| 1745 | /// / KEYWORD_anyframe MINUSRARROW | | |
| 1746 | /// / (ManyPtrTypeStart / SliceTypeStart) PtrMods | | |
| 1747 | /// / SinglePtrTypeStart SinglePtrMods | | |
| 1748 | /// / ArrayTypeStart | | |
| 1749 | /// | | |
| 1750 | /// PrefixTypeOpPrefix | | |
| 1751 | /// <- QUESTIONMARK | | |
| 1752 | /// / KEYWORD_anyframe MINUSRARROW | | |
| 1753 | /// / LBRACKET | | |
| 1754 | /// / ASTERISK | | |
| 1755 | /// | | |
| 1756 | /// SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET | | |
| 1757 | /// | | |
| 1758 | /// SinglePtrTypeStart <- ASTERISK | | |
| 1759 | /// | | |
| 1760 | /// ManyPtrTypeStart <- LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET | | |
| 1761 | /// | | |
| 1762 | /// ArrayTypeStart <- LBRACKET !ASTERISK Expr (COLON Expr)? RBRACKET | | |
| 1763 | fn parseTypeExpr(p: *Parse) Error!?Node.Index { | 1657 | fn parseTypeExpr(p: *Parse) Error!?Node.Index { |
| 1764 | switch (p.tokenTag(p.tok_i)) { | 1658 | switch (p.tokenTag(p.tok_i)) { |
| 1765 | .question_mark => return try p.addNode(.{ | 1659 | .question_mark => return try p.addNode(.{ |
| ... | @@ -1957,18 +1851,6 @@ fn expectTypeExpr(p: *Parse) Error!Node.Index { | ... | @@ -1957,18 +1851,6 @@ fn expectTypeExpr(p: *Parse) Error!Node.Index { |
| 1957 | return try p.parseTypeExpr() orelse return p.fail(.expected_type_expr); | 1851 | return try p.parseTypeExpr() orelse return p.fail(.expected_type_expr); |
| 1958 | } | 1852 | } |
| 1959 | | 1853 | |
| 1960 | /// PrimaryExpr | | |
| 1961 | /// <- AsmExpr | | |
| 1962 | /// / IfExpr | | |
| 1963 | /// / KEYWORD_break BreakLabel? Expr? | | |
| 1964 | /// / KEYWORD_comptime Expr | | |
| 1965 | /// / KEYWORD_nosuspend Expr | | |
| 1966 | /// / KEYWORD_continue BreakLabel? Expr? | | |
| 1967 | /// / KEYWORD_resume Expr | | |
| 1968 | /// / KEYWORD_return Expr? | | |
| 1969 | /// / BlockLabel? LoopExpr | | |
| 1970 | /// / Block | | |
| 1971 | /// / CurlySuffixExpr | | |
| 1972 | fn parsePrimaryExpr(p: *Parse) !?Node.Index { | 1854 | fn parsePrimaryExpr(p: *Parse) !?Node.Index { |
| 1973 | switch (p.tokenTag(p.tok_i)) { | 1855 | switch (p.tokenTag(p.tok_i)) { |
| 1974 | .keyword_asm => return try p.expectAsmExpr(), | 1856 | .keyword_asm => return try p.expectAsmExpr(), |
| ... | @@ -2061,7 +1943,6 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { | ... | @@ -2061,7 +1943,6 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { |
| 2061 | } | 1943 | } |
| 2062 | } | 1944 | } |
| 2063 | | 1945 | |
| 2064 | /// Block <- LBRACE BlockStatement* RBRACE | | |
| 2065 | fn parseBlock(p: *Parse) !?Node.Index { | 1946 | fn parseBlock(p: *Parse) !?Node.Index { |
| 2066 | const lbrace = p.eatToken(.l_brace) orelse return null; | 1947 | const lbrace = p.eatToken(.l_brace) orelse return null; |
| 2067 | const scratch_top = p.scratch.items.len; | 1948 | const scratch_top = p.scratch.items.len; |
| ... | @@ -2092,11 +1973,6 @@ fn parseBlock(p: *Parse) !?Node.Index { | ... | @@ -2092,11 +1973,6 @@ fn parseBlock(p: *Parse) !?Node.Index { |
| 2092 | } | 1973 | } |
| 2093 | } | 1974 | } |
| 2094 | | 1975 | |
| 2095 | /// ForPrefix <- KEYWORD_for LPAREN ForInput (COMMA ForInput)* COMMA? RPAREN ForPayload | | |
| 2096 | /// | | |
| 2097 | /// ForInput <- Expr (DOT2 Expr?)? | | |
| 2098 | /// | | |
| 2099 | /// ForPayload <- PIPE ASTERISK? IDENTIFIER (COMMA ASTERISK? IDENTIFIER)* PIPE | | |
| 2100 | fn forPrefix(p: *Parse) Error!usize { | 1976 | fn forPrefix(p: *Parse) Error!usize { |
| 2101 | const start = p.scratch.items.len; | 1977 | const start = p.scratch.items.len; |
| 2102 | _ = try p.expectToken(.l_paren); | 1978 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2152,9 +2028,6 @@ fn forPrefix(p: *Parse) Error!usize { | ... | @@ -2152,9 +2028,6 @@ fn forPrefix(p: *Parse) Error!usize { |
| 2152 | return inputs; | 2028 | return inputs; |
| 2153 | } | 2029 | } |
| 2154 | | 2030 | |
| 2155 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? | | |
| 2156 | /// | | |
| 2157 | /// WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? !ExprSuffi | | |
| 2158 | fn expectWhileExpr(p: *Parse) !Node.Index { | 2031 | fn expectWhileExpr(p: *Parse) !Node.Index { |
| 2159 | const while_token = p.assertToken(.keyword_while); | 2032 | const while_token = p.assertToken(.keyword_while); |
| 2160 | _ = try p.expectToken(.l_paren); | 2033 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2204,12 +2077,6 @@ fn expectWhileExpr(p: *Parse) !Node.Index { | ... | @@ -2204,12 +2077,6 @@ fn expectWhileExpr(p: *Parse) !Node.Index { |
| 2204 | }); | 2077 | }); |
| 2205 | } | 2078 | } |
| 2206 | | 2079 | |
| 2207 | /// CurlySuffixExpr <- TypeExpr (InitList / !LBRACE) | | |
| 2208 | /// | | |
| 2209 | /// InitList | | |
| 2210 | /// <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE | | |
| 2211 | /// / LBRACE Expr (COMMA Expr)* COMMA? RBRACE | | |
| 2212 | /// / LBRACE RBRACE | | |
| 2213 | fn parseCurlySuffixExpr(p: *Parse) !?Node.Index { | 2080 | fn parseCurlySuffixExpr(p: *Parse) !?Node.Index { |
| 2214 | const lhs = try p.parseTypeExpr() orelse return null; | 2081 | const lhs = try p.parseTypeExpr() orelse return null; |
| 2215 | const lbrace = p.eatToken(.l_brace) orelse return lhs; | 2082 | const lbrace = p.eatToken(.l_brace) orelse return lhs; |
| ... | @@ -2306,7 +2173,6 @@ fn parseCurlySuffixExpr(p: *Parse) !?Node.Index { | ... | @@ -2306,7 +2173,6 @@ fn parseCurlySuffixExpr(p: *Parse) !?Node.Index { |
| 2306 | } | 2173 | } |
| 2307 | } | 2174 | } |
| 2308 | | 2175 | |
| 2309 | /// ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr / !EXCLAMATIONMARK) | | |
| 2310 | fn parseErrorUnionExpr(p: *Parse) !?Node.Index { | 2176 | fn parseErrorUnionExpr(p: *Parse) !?Node.Index { |
| 2311 | const suffix_expr = try p.parseSuffixExpr() orelse return null; | 2177 | const suffix_expr = try p.parseSuffixExpr() orelse return null; |
| 2312 | const bang = p.eatToken(.bang) orelse return suffix_expr; | 2178 | const bang = p.eatToken(.bang) orelse return suffix_expr; |
| ... | @@ -2320,7 +2186,6 @@ fn parseErrorUnionExpr(p: *Parse) !?Node.Index { | ... | @@ -2320,7 +2186,6 @@ fn parseErrorUnionExpr(p: *Parse) !?Node.Index { |
| 2320 | }); | 2186 | }); |
| 2321 | } | 2187 | } |
| 2322 | | 2188 | |
| 2323 | /// SuffixExpr <- PrimaryTypeExpr SuffixOp* !SuffixOpPrefix | | |
| 2324 | fn parseSuffixExpr(p: *Parse) !?Node.Index { | 2189 | fn parseSuffixExpr(p: *Parse) !?Node.Index { |
| 2325 | var res = try p.parsePrimaryTypeExpr() orelse return null; | 2190 | var res = try p.parsePrimaryTypeExpr() orelse return null; |
| 2326 | while (try p.parseSuffixOp(res)) |suffix_op| { | 2191 | while (try p.parseSuffixOp(res)) |suffix_op| { |
| ... | @@ -2329,46 +2194,6 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { | ... | @@ -2329,46 +2194,6 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { |
| 2329 | return res; | 2194 | return res; |
| 2330 | } | 2195 | } |
| 2331 | | 2196 | |
| 2332 | /// PrimaryTypeExpr | | |
| 2333 | /// <- BUILTINIDENTIFIER FnCallArguments | | |
| 2334 | /// / CHAR_LITERAL | | |
| 2335 | /// / ContainerDecl | | |
| 2336 | /// / DOT IDENTIFIER | | |
| 2337 | /// / DOT InitList | | |
| 2338 | /// / ErrorSetDecl | | |
| 2339 | /// / FnProto | | |
| 2340 | /// / GroupedExpr | | |
| 2341 | /// / LabeledTypeExpr | | |
| 2342 | /// / IDENTIFIER | | |
| 2343 | /// / IfTypeExpr | | |
| 2344 | /// / KEYWORD_comptime TypeExpr | | |
| 2345 | /// / KEYWORD_error DOT IDENTIFIER | | |
| 2346 | /// / KEYWORD_anyframe | | |
| 2347 | /// / KEYWORD_unreachable | | |
| 2348 | /// / NUMBERLITERAL | | |
| 2349 | /// / STRINGLITERAL | | |
| 2350 | /// | | |
| 2351 | /// ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto | | |
| 2352 | /// | | |
| 2353 | /// ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE | | |
| 2354 | /// | | |
| 2355 | /// InitList | | |
| 2356 | /// <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE | | |
| 2357 | /// / LBRACE Expr (COMMA Expr)* COMMA? RBRACE | | |
| 2358 | /// / LBRACE RBRACE | | |
| 2359 | /// | | |
| 2360 | /// ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE | | |
| 2361 | /// | | |
| 2362 | /// GroupedExpr <- LPAREN Expr RPAREN | | |
| 2363 | /// | | |
| 2364 | /// IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? !ExprSuffix | | |
| 2365 | /// | | |
| 2366 | /// LabeledTypeExpr | | |
| 2367 | /// <- BlockLabel Block | | |
| 2368 | /// / BlockLabel? LoopTypeExpr | | |
| 2369 | /// / BlockLabel? SwitchExpr | | |
| 2370 | /// | | |
| 2371 | /// LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) | | |
| 2372 | fn parsePrimaryTypeExpr(p: *Parse) !?Node.Index { | 2197 | fn parsePrimaryTypeExpr(p: *Parse) !?Node.Index { |
| 2373 | switch (p.tokenTag(p.tok_i)) { | 2198 | switch (p.tokenTag(p.tok_i)) { |
| 2374 | .char_literal => return try p.addNode(.{ | 2199 | .char_literal => return try p.addNode(.{ |
| ... | @@ -2637,9 +2462,6 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index { | ... | @@ -2637,9 +2462,6 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index { |
| 2637 | return try p.parsePrimaryTypeExpr() orelse return p.fail(.expected_primary_type_expr); | 2462 | return try p.parsePrimaryTypeExpr() orelse return p.fail(.expected_primary_type_expr); |
| 2638 | } | 2463 | } |
| 2639 | | 2464 | |
| 2640 | /// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? | | |
| 2641 | /// | | |
| 2642 | /// WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr / !KEYWORD_else) | | |
| 2643 | fn expectWhileTypeExpr(p: *Parse) !Node.Index { | 2465 | fn expectWhileTypeExpr(p: *Parse) !Node.Index { |
| 2644 | const while_token = p.assertToken(.keyword_while); | 2466 | const while_token = p.assertToken(.keyword_while); |
| 2645 | _ = try p.expectToken(.l_paren); | 2467 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2689,7 +2511,6 @@ fn expectWhileTypeExpr(p: *Parse) !Node.Index { | ... | @@ -2689,7 +2511,6 @@ fn expectWhileTypeExpr(p: *Parse) !Node.Index { |
| 2689 | }); | 2511 | }); |
| 2690 | } | 2512 | } |
| 2691 | | 2513 | |
| 2692 | /// SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE | | |
| 2693 | fn parseSwitchExpr(p: *Parse, is_labeled: bool) !?Node.Index { | 2514 | fn parseSwitchExpr(p: *Parse, is_labeled: bool) !?Node.Index { |
| 2694 | const switch_token = p.eatToken(.keyword_switch) orelse return null; | 2515 | const switch_token = p.eatToken(.keyword_switch) orelse return null; |
| 2695 | return try p.expectSwitchSuffix(if (is_labeled) switch_token - 2 else switch_token); | 2516 | return try p.expectSwitchSuffix(if (is_labeled) switch_token - 2 else switch_token); |
| ... | @@ -2722,19 +2543,6 @@ fn expectSwitchSuffix(p: *Parse, main_token: TokenIndex) !Node.Index { | ... | @@ -2722,19 +2543,6 @@ fn expectSwitchSuffix(p: *Parse, main_token: TokenIndex) !Node.Index { |
| 2722 | }); | 2543 | }); |
| 2723 | } | 2544 | } |
| 2724 | | 2545 | |
| 2725 | /// AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN | | |
| 2726 | /// | | |
| 2727 | /// AsmOutput <- COLON AsmOutputList AsmInput? | | |
| 2728 | /// | | |
| 2729 | /// AsmInput <- COLON AsmInputList AsmClobbers? | | |
| 2730 | /// | | |
| 2731 | /// AsmClobbers <- COLON Expr | | |
| 2732 | /// | | |
| 2733 | /// StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? | | |
| 2734 | /// | | |
| 2735 | /// AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? | | |
| 2736 | /// | | |
| 2737 | /// AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? | | |
| 2738 | fn expectAsmExpr(p: *Parse) !Node.Index { | 2546 | fn expectAsmExpr(p: *Parse) !Node.Index { |
| 2739 | const asm_token = p.assertToken(.keyword_asm); | 2547 | const asm_token = p.assertToken(.keyword_asm); |
| 2740 | _ = p.eatToken(.keyword_volatile); | 2548 | _ = p.eatToken(.keyword_volatile); |
| ... | @@ -2804,7 +2612,6 @@ fn expectAsmExpr(p: *Parse) !Node.Index { | ... | @@ -2804,7 +2612,6 @@ fn expectAsmExpr(p: *Parse) !Node.Index { |
| 2804 | }); | 2612 | }); |
| 2805 | } | 2613 | } |
| 2806 | | 2614 | |
| 2807 | /// AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERALSINGLE LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN | | |
| 2808 | fn parseAsmOutputItem(p: *Parse) !?Node.Index { | 2615 | fn parseAsmOutputItem(p: *Parse) !?Node.Index { |
| 2809 | _ = p.eatToken(.l_bracket) orelse return null; | 2616 | _ = p.eatToken(.l_bracket) orelse return null; |
| 2810 | const identifier = try p.expectToken(.identifier); | 2617 | const identifier = try p.expectToken(.identifier); |
| ... | @@ -2830,7 +2637,6 @@ fn parseAsmOutputItem(p: *Parse) !?Node.Index { | ... | @@ -2830,7 +2637,6 @@ fn parseAsmOutputItem(p: *Parse) !?Node.Index { |
| 2830 | }); | 2637 | }); |
| 2831 | } | 2638 | } |
| 2832 | | 2639 | |
| 2833 | /// AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERALSINGLE LPAREN Expr RPAREN | | |
| 2834 | fn parseAsmInputItem(p: *Parse) !?Node.Index { | 2640 | fn parseAsmInputItem(p: *Parse) !?Node.Index { |
| 2835 | _ = p.eatToken(.l_bracket) orelse return null; | 2641 | _ = p.eatToken(.l_bracket) orelse return null; |
| 2836 | const identifier = try p.expectToken(.identifier); | 2642 | const identifier = try p.expectToken(.identifier); |
| ... | @@ -2849,17 +2655,14 @@ fn parseAsmInputItem(p: *Parse) !?Node.Index { | ... | @@ -2849,17 +2655,14 @@ fn parseAsmInputItem(p: *Parse) !?Node.Index { |
| 2849 | }); | 2655 | }); |
| 2850 | } | 2656 | } |
| 2851 | | 2657 | |
| 2852 | /// BreakLabel <- COLON IDENTIFIER | | |
| 2853 | fn parseBreakLabel(p: *Parse) Error!OptionalTokenIndex { | 2658 | fn parseBreakLabel(p: *Parse) Error!OptionalTokenIndex { |
| 2854 | return if (p.eatTokens(&.{ .colon, .identifier })) |i| .fromToken(i + 1) else .none; | 2659 | return if (p.eatTokens(&.{ .colon, .identifier })) |i| .fromToken(i + 1) else .none; |
| 2855 | } | 2660 | } |
| 2856 | | 2661 | |
| 2857 | /// BlockLabel <- IDENTIFIER COLON | | |
| 2858 | fn parseBlockLabel(p: *Parse) ?TokenIndex { | 2662 | fn parseBlockLabel(p: *Parse) ?TokenIndex { |
| 2859 | return p.eatTokens(&.{ .identifier, .colon }); | 2663 | return p.eatTokens(&.{ .identifier, .colon }); |
| 2860 | } | 2664 | } |
| 2861 | | 2665 | |
| 2862 | /// FieldInit <- DOT IDENTIFIER EQUAL Expr | | |
| 2863 | fn parseFieldInit(p: *Parse) !?Node.Index { | 2666 | fn parseFieldInit(p: *Parse) !?Node.Index { |
| 2864 | if (p.eatTokens(&.{ .period, .identifier, .equal })) |_| { | 2667 | if (p.eatTokens(&.{ .period, .identifier, .equal })) |_| { |
| 2865 | return try p.expectExpr(); | 2668 | return try p.expectExpr(); |
| ... | @@ -2874,7 +2677,6 @@ fn expectFieldInit(p: *Parse) !Node.Index { | ... | @@ -2874,7 +2677,6 @@ fn expectFieldInit(p: *Parse) !Node.Index { |
| 2874 | return p.fail(.expected_initializer); | 2677 | return p.fail(.expected_initializer); |
| 2875 | } | 2678 | } |
| 2876 | | 2679 | |
| 2877 | /// WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN | | |
| 2878 | fn parseWhileContinueExpr(p: *Parse) !?Node.Index { | 2680 | fn parseWhileContinueExpr(p: *Parse) !?Node.Index { |
| 2879 | _ = p.eatToken(.colon) orelse return null; | 2681 | _ = p.eatToken(.colon) orelse return null; |
| 2880 | _ = try p.expectToken(.l_paren); | 2682 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2883,7 +2685,6 @@ fn parseWhileContinueExpr(p: *Parse) !?Node.Index { | ... | @@ -2883,7 +2685,6 @@ fn parseWhileContinueExpr(p: *Parse) !?Node.Index { |
| 2883 | return node; | 2685 | return node; |
| 2884 | } | 2686 | } |
| 2885 | | 2687 | |
| 2886 | /// LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN | | |
| 2887 | fn parseLinkSection(p: *Parse) !?Node.Index { | 2688 | fn parseLinkSection(p: *Parse) !?Node.Index { |
| 2888 | _ = p.eatToken(.keyword_linksection) orelse return null; | 2689 | _ = p.eatToken(.keyword_linksection) orelse return null; |
| 2889 | _ = try p.expectToken(.l_paren); | 2690 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2892,7 +2693,6 @@ fn parseLinkSection(p: *Parse) !?Node.Index { | ... | @@ -2892,7 +2693,6 @@ fn parseLinkSection(p: *Parse) !?Node.Index { |
| 2892 | return expr_node; | 2693 | return expr_node; |
| 2893 | } | 2694 | } |
| 2894 | | 2695 | |
| 2895 | /// CallConv <- KEYWORD_callconv LPAREN Expr RPAREN | | |
| 2896 | fn parseCallconv(p: *Parse) !?Node.Index { | 2696 | fn parseCallconv(p: *Parse) !?Node.Index { |
| 2897 | _ = p.eatToken(.keyword_callconv) orelse return null; | 2697 | _ = p.eatToken(.keyword_callconv) orelse return null; |
| 2898 | _ = try p.expectToken(.l_paren); | 2698 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2901,7 +2701,6 @@ fn parseCallconv(p: *Parse) !?Node.Index { | ... | @@ -2901,7 +2701,6 @@ fn parseCallconv(p: *Parse) !?Node.Index { |
| 2901 | return expr_node; | 2701 | return expr_node; |
| 2902 | } | 2702 | } |
| 2903 | | 2703 | |
| 2904 | /// AddrSpace <- KEYWORD_addrspace LPAREN Expr RPAREN | | |
| 2905 | fn parseAddrSpace(p: *Parse) !?Node.Index { | 2704 | fn parseAddrSpace(p: *Parse) !?Node.Index { |
| 2906 | _ = p.eatToken(.keyword_addrspace) orelse return null; | 2705 | _ = p.eatToken(.keyword_addrspace) orelse return null; |
| 2907 | _ = try p.expectToken(.l_paren); | 2706 | _ = try p.expectToken(.l_paren); |
| ... | @@ -2913,12 +2712,6 @@ fn parseAddrSpace(p: *Parse) !?Node.Index { | ... | @@ -2913,12 +2712,6 @@ fn parseAddrSpace(p: *Parse) !?Node.Index { |
| 2913 | /// This function can return null nodes and then still return nodes afterwards, | 2712 | /// This function can return null nodes and then still return nodes afterwards, |
| 2914 | /// such as in the case of anytype and `...`. Caller must look for rparen to find | 2713 | /// such as in the case of anytype and `...`. Caller must look for rparen to find |
| 2915 | /// out when there are no more param decls left. | 2714 | /// out when there are no more param decls left. |
| 2916 | /// | | |
| 2917 | /// ParamDecl <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime / !KEYWORD_comptime) (IDENTIFIER COLON / !(IDENTIFIER COLON)) ParamType | | |
| 2918 | /// | | |
| 2919 | /// ParamType | | |
| 2920 | /// <- KEYWORD_anytype | | |
| 2921 | /// / TypeExpr | | |
| 2922 | fn expectParamDecl(p: *Parse) !?Node.Index { | 2715 | fn expectParamDecl(p: *Parse) !?Node.Index { |
| 2923 | _ = try p.eatDocComments(); | 2716 | _ = try p.eatDocComments(); |
| 2924 | switch (p.tokenTag(p.tok_i)) { | 2717 | switch (p.tokenTag(p.tok_i)) { |
| ... | @@ -2937,7 +2730,6 @@ fn expectParamDecl(p: *Parse) !?Node.Index { | ... | @@ -2937,7 +2730,6 @@ fn expectParamDecl(p: *Parse) !?Node.Index { |
| 2937 | } | 2730 | } |
| 2938 | } | 2731 | } |
| 2939 | | 2732 | |
| 2940 | /// Payload <- PIPE IDENTIFIER PIPE | | |
| 2941 | fn parsePayload(p: *Parse) Error!OptionalTokenIndex { | 2733 | fn parsePayload(p: *Parse) Error!OptionalTokenIndex { |
| 2942 | _ = p.eatToken(.pipe) orelse return .none; | 2734 | _ = p.eatToken(.pipe) orelse return .none; |
| 2943 | const identifier = try p.expectToken(.identifier); | 2735 | const identifier = try p.expectToken(.identifier); |
| ... | @@ -2945,7 +2737,6 @@ fn parsePayload(p: *Parse) Error!OptionalTokenIndex { | ... | @@ -2945,7 +2737,6 @@ fn parsePayload(p: *Parse) Error!OptionalTokenIndex { |
| 2945 | return .fromToken(identifier); | 2737 | return .fromToken(identifier); |
| 2946 | } | 2738 | } |
| 2947 | | 2739 | |
| 2948 | /// PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE | | |
| 2949 | fn parsePtrPayload(p: *Parse) Error!OptionalTokenIndex { | 2740 | fn parsePtrPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2950 | _ = p.eatToken(.pipe) orelse return .none; | 2741 | _ = p.eatToken(.pipe) orelse return .none; |
| 2951 | _ = p.eatToken(.asterisk); | 2742 | _ = p.eatToken(.asterisk); |
| ... | @@ -2955,8 +2746,6 @@ fn parsePtrPayload(p: *Parse) Error!OptionalTokenIndex { | ... | @@ -2955,8 +2746,6 @@ fn parsePtrPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2955 | } | 2746 | } |
| 2956 | | 2747 | |
| 2957 | /// Returns the first identifier token, if any. | 2748 | /// Returns the first identifier token, if any. |
| 2958 | /// | | |
| 2959 | /// PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE | | |
| 2960 | fn parsePtrIndexPayload(p: *Parse) Error!OptionalTokenIndex { | 2749 | fn parsePtrIndexPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2961 | _ = p.eatToken(.pipe) orelse return .none; | 2750 | _ = p.eatToken(.pipe) orelse return .none; |
| 2962 | _ = p.eatToken(.asterisk); | 2751 | _ = p.eatToken(.asterisk); |
| ... | @@ -2968,11 +2757,6 @@ fn parsePtrIndexPayload(p: *Parse) Error!OptionalTokenIndex { | ... | @@ -2968,11 +2757,6 @@ fn parsePtrIndexPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2968 | return .fromToken(identifier); | 2757 | return .fromToken(identifier); |
| 2969 | } | 2758 | } |
| 2970 | | 2759 | |
| 2971 | /// SwitchProng <- KEYWORD_inline? SwitchCase EQUALRARROW PtrIndexPayload? AssignExpr | | |
| 2972 | /// | | |
| 2973 | /// SwitchCase | | |
| 2974 | /// <- SwitchItem (COMMA SwitchItem)* COMMA? | | |
| 2975 | /// / KEYWORD_else | | |
| 2976 | fn parseSwitchProng(p: *Parse) !?Node.Index { | 2760 | fn parseSwitchProng(p: *Parse) !?Node.Index { |
| 2977 | const scratch_top = p.scratch.items.len; | 2761 | const scratch_top = p.scratch.items.len; |
| 2978 | defer p.scratch.shrinkRetainingCapacity(scratch_top); | 2762 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | @@ -3015,7 +2799,6 @@ fn parseSwitchProng(p: *Parse) !?Node.Index { | ... | @@ -3015,7 +2799,6 @@ fn parseSwitchProng(p: *Parse) !?Node.Index { |
| 3015 | } | 2799 | } |
| 3016 | } | 2800 | } |
| 3017 | | 2801 | |
| 3018 | /// SwitchItem <- Expr (DOT3 Expr)? | | |
| 3019 | fn parseSwitchItem(p: *Parse) !?Node.Index { | 2802 | fn parseSwitchItem(p: *Parse) !?Node.Index { |
| 3020 | const expr = try p.parseExpr() orelse return null; | 2803 | const expr = try p.parseExpr() orelse return null; |
| 3021 | | 2804 | |
| ... | @@ -3043,22 +2826,6 @@ const PtrModifiers = struct { | ... | @@ -3043,22 +2826,6 @@ const PtrModifiers = struct { |
| 3043 | bit_range_end: Node.OptionalIndex, | 2826 | bit_range_end: Node.OptionalIndex, |
| 3044 | }; | 2827 | }; |
| 3045 | | 2828 | |
| 3046 | /// PtrMods | | |
| 3047 | /// <- PtrMod* ByteAlign? PtrMod* AddrSpace? PtrMod* | | |
| 3048 | /// / PtrMod* AddrSpace? PtrMod* ByteAlign? PtrMod* | | |
| 3049 | /// | | |
| 3050 | /// SinglePtrMods | | |
| 3051 | /// <- PtrMod* BitAlign? PtrMod* AddrSpace? PtrMod* | | |
| 3052 | /// / PtrMod* AddrSpace? PtrMod* BitAlign? PtrMod* | | |
| 3053 | /// | | |
| 3054 | /// PtrMod | | |
| 3055 | /// <- KEYWORD_allowzero | | |
| 3056 | /// / KEYWORD_const | | |
| 3057 | /// / KEYWORD_volatile | | |
| 3058 | /// | | |
| 3059 | /// AddrSpace <- KEYWORD_addrspace LPAREN Expr RPAREN | | |
| 3060 | /// ByteAlign <- KEYWORD_align LPAREN Expr RPAREN | | |
| 3061 | /// BitAlign <- KEYWORD_align LPAREN Expr (COLON Expr COLON Expr)? RPAREN | | |
| 3062 | fn parsePtrModifiers(p: *Parse, align_type: enum { bit_align, byte_align }) !PtrModifiers { | 2829 | fn parsePtrModifiers(p: *Parse, align_type: enum { bit_align, byte_align }) !PtrModifiers { |
| 3063 | var result: PtrModifiers = .{ | 2830 | var result: PtrModifiers = .{ |
| 3064 | .align_node = .none, | 2831 | .align_node = .none, |
| ... | @@ -3102,16 +2869,6 @@ fn parsePtrModifiers(p: *Parse, align_type: enum { bit_align, byte_align }) !Ptr | ... | @@ -3102,16 +2869,6 @@ fn parsePtrModifiers(p: *Parse, align_type: enum { bit_align, byte_align }) !Ptr |
| 3102 | } | 2869 | } |
| 3103 | } | 2870 | } |
| 3104 | | 2871 | |
| 3105 | /// SuffixOp | | |
| 3106 | /// <- LBRACKET Expr (DOT2 Expr? (COLON Expr)?)? RBRACKET | | |
| 3107 | /// / DOT IDENTIFIER | | |
| 3108 | /// / DOTASTERISK | | |
| 3109 | /// / DOT QUESTIONMARK | | |
| 3110 | /// / FnCallArguments | | |
| 3111 | /// | | |
| 3112 | /// FnCallArguments <- LPAREN ExprList RPAREN | | |
| 3113 | /// | | |
| 3114 | /// ExprList <- (Expr COMMA)* Expr? | | |
| 3115 | fn parseSuffixOp(p: *Parse, lhs: Node.Index) !?Node.Index { | 2872 | fn parseSuffixOp(p: *Parse, lhs: Node.Index) !?Node.Index { |
| 3116 | switch (p.tokenTag(p.tok_i)) { | 2873 | switch (p.tokenTag(p.tok_i)) { |
| 3117 | .l_bracket => { | 2874 | .l_bracket => { |
| ... | @@ -3246,14 +3003,6 @@ fn parseSuffixOp(p: *Parse, lhs: Node.Index) !?Node.Index { | ... | @@ -3246,14 +3003,6 @@ fn parseSuffixOp(p: *Parse, lhs: Node.Index) !?Node.Index { |
| 3246 | } | 3003 | } |
| 3247 | | 3004 | |
| 3248 | /// Caller must have already verified the first token. | 3005 | /// Caller must have already verified the first token. |
| 3249 | /// | | |
| 3250 | /// ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE | | |
| 3251 | /// | | |
| 3252 | /// ContainerDeclType | | |
| 3253 | /// <- KEYWORD_struct (LPAREN Expr RPAREN)? | | |
| 3254 | /// / KEYWORD_opaque | | |
| 3255 | /// / KEYWORD_enum (LPAREN Expr RPAREN)? | | |
| 3256 | /// / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? | | |
| 3257 | fn expectContainerDeclAuto(p: *Parse) !Node.Index { | 3006 | fn expectContainerDeclAuto(p: *Parse) !Node.Index { |
| 3258 | const main_token = p.nextToken(); | 3007 | const main_token = p.nextToken(); |
| 3259 | const arg_expr = switch (p.tokenTag(main_token)) { | 3008 | const arg_expr = switch (p.tokenTag(main_token)) { |
| ... | @@ -3407,8 +3156,6 @@ fn parseCStyleContainer(p: *Parse) Error!bool { | ... | @@ -3407,8 +3156,6 @@ fn parseCStyleContainer(p: *Parse) Error!bool { |
| 3407 | } | 3156 | } |
| 3408 | | 3157 | |
| 3409 | /// Holds temporary data until we are ready to construct the full ContainerDecl AST node. | 3158 | /// Holds temporary data until we are ready to construct the full ContainerDecl AST node. |
| 3410 | /// | | |
| 3411 | /// ByteAlign <- KEYWORD_align LPAREN Expr RPAREN | | |
| 3412 | fn parseByteAlign(p: *Parse) !?Node.Index { | 3159 | fn parseByteAlign(p: *Parse) !?Node.Index { |
| 3413 | _ = p.eatToken(.keyword_align) orelse return null; | 3160 | _ = p.eatToken(.keyword_align) orelse return null; |
| 3414 | _ = try p.expectToken(.l_paren); | 3161 | _ = try p.expectToken(.l_paren); |
| ... | @@ -3417,7 +3164,6 @@ fn parseByteAlign(p: *Parse) !?Node.Index { | ... | @@ -3417,7 +3164,6 @@ fn parseByteAlign(p: *Parse) !?Node.Index { |
| 3417 | return expr; | 3164 | return expr; |
| 3418 | } | 3165 | } |
| 3419 | | 3166 | |
| 3420 | /// SwitchProngList <- (SwitchProng COMMA)* SwitchProng? | | |
| 3421 | fn parseSwitchProngList(p: *Parse) !Node.SubRange { | 3167 | fn parseSwitchProngList(p: *Parse) !Node.SubRange { |
| 3422 | const scratch_top = p.scratch.items.len; | 3168 | const scratch_top = p.scratch.items.len; |
| 3423 | defer p.scratch.shrinkRetainingCapacity(scratch_top); | 3169 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | @@ -3438,7 +3184,6 @@ fn parseSwitchProngList(p: *Parse) !Node.SubRange { | ... | @@ -3438,7 +3184,6 @@ fn parseSwitchProngList(p: *Parse) !Node.SubRange { |
| 3438 | return p.listToSpan(p.scratch.items[scratch_top..]); | 3184 | return p.listToSpan(p.scratch.items[scratch_top..]); |
| 3439 | } | 3185 | } |
| 3440 | | 3186 | |
| 3441 | /// ParamDeclList <- (ParamDecl COMMA)* (ParamDecl / DOT3 COMMA?)? | | |
| 3442 | fn parseParamDeclList(p: *Parse) !SmallSpan { | 3187 | fn parseParamDeclList(p: *Parse) !SmallSpan { |
| 3443 | _ = try p.expectToken(.l_paren); | 3188 | _ = try p.expectToken(.l_paren); |
| 3444 | const scratch_top = p.scratch.items.len; | 3189 | const scratch_top = p.scratch.items.len; |
| ... | @@ -3475,9 +3220,6 @@ fn parseParamDeclList(p: *Parse) !SmallSpan { | ... | @@ -3475,9 +3220,6 @@ fn parseParamDeclList(p: *Parse) !SmallSpan { |
| 3475 | }; | 3220 | }; |
| 3476 | } | 3221 | } |
| 3477 | | 3222 | |
| 3478 | /// FnCallArguments <- LPAREN ExprList RPAREN | | |
| 3479 | /// | | |
| 3480 | /// ExprList <- (Expr COMMA)* Expr? | | |
| 3481 | fn expectBuiltinCall(p: *Parse) !Node.Index { | 3223 | fn expectBuiltinCall(p: *Parse) !Node.Index { |
| 3482 | const builtin_token = p.assertToken(.builtin); | 3224 | const builtin_token = p.assertToken(.builtin); |
| 3483 | _ = p.eatToken(.l_paren) orelse { | 3225 | _ = p.eatToken(.l_paren) orelse { |
| ... | @@ -3526,11 +3268,6 @@ fn expectBuiltinCall(p: *Parse) !Node.Index { | ... | @@ -3526,11 +3268,6 @@ fn expectBuiltinCall(p: *Parse) !Node.Index { |
| 3526 | } | 3268 | } |
| 3527 | } | 3269 | } |
| 3528 | | 3270 | |
| 3529 | /// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr / !KEYWORD_else) | | |
| 3530 | /// | | |
| 3531 | /// IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr / !KEYWORD_else) | | |
| 3532 | /// | | |
| 3533 | /// IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? | | |
| 3534 | fn expectIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index { | 3271 | fn expectIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index { |
| 3535 | const if_token = p.assertToken(.keyword_if); | 3272 | const if_token = p.assertToken(.keyword_if); |
| 3536 | _ = try p.expectToken(.l_paren); | 3273 | _ = try p.expectToken(.l_paren); |
| ... | @@ -3564,9 +3301,6 @@ fn expectIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !N | ... | @@ -3564,9 +3301,6 @@ fn expectIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !N |
| 3564 | }); | 3301 | }); |
| 3565 | } | 3302 | } |
| 3566 | | 3303 | |
| 3567 | /// ForExpr <- ForPrefix Expr (KEYWORD_else Expr / !KEYWORD_else) | | |
| 3568 | /// | | |
| 3569 | /// ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr / !KEYWORD_else) | | |
| 3570 | fn expectFor(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index { | 3304 | fn expectFor(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index { |
| 3571 | const for_token = p.assertToken(.keyword_for); | 3305 | const for_token = p.assertToken(.keyword_for); |
| 3572 | | 3306 | |