| ... | ... | @@ -261,11 +261,6 @@ pub fn parseZon(p: *Parse) Allocator.Error!void { |
| 261 | 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 | 264 | fn parseContainerMembers(p: *Parse) Error!Members { |
| 270 | 265 | const scratch_top = p.scratch.items.len; |
| 271 | 266 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | ... | @@ -613,7 +608,6 @@ fn findNextStmt(p: *Parse) void { |
| 613 | 608 | } |
| 614 | 609 | } |
| 615 | 610 | |
| 616 | | /// TestDecl <- KEYWORD_test (STRINGLITERALSINGLE / IDENTIFIER)? Block |
| 617 | 611 | fn expectTestDecl(p: *Parse) Error!Node.Index { |
| 618 | 612 | const test_token = p.assertToken(.keyword_test); |
| 619 | 613 | const name_token: OptionalTokenIndex = switch (p.tokenTag(p.tok_i)) { |
| ... | ... | @@ -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 | 640 | fn expectTopLevelDecl(p: *Parse) !?Node.Index { |
| 651 | 641 | const extern_export_inline_token = p.nextToken(); |
| 652 | 642 | var is_extern: bool = false; |
| ... | ... | @@ -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 | 715 | fn parseFnProto(p: *Parse) !?Node.Index { |
| 727 | 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 | 804 | init_expr_result.* = init_expr; |
| 816 | 805 | } |
| 817 | 806 | |
| 818 | | /// VarDeclProto <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? AddrSpace? LinkSection? |
| 819 | 807 | /// Returns a `*_var_decl` node with its rhs (init expression) initialized to .none. |
| 820 | 808 | fn parseVarDeclProto(p: *Parse) !?Node.Index { |
| 821 | 809 | const mut_token = p.eatToken(.keyword_const) orelse |
| ... | ... | @@ -887,7 +875,6 @@ fn parseVarDeclProto(p: *Parse) !?Node.Index { |
| 887 | 875 | } |
| 888 | 876 | } |
| 889 | 877 | |
| 890 | | /// GlobalVarDecl <- VarDeclProto (EQUAL Expr?) SEMICOLON |
| 891 | 878 | fn parseGlobalVarDecl(p: *Parse) !?Node.Index { |
| 892 | 879 | const var_decl = try p.parseVarDeclProto() orelse return null; |
| 893 | 880 | |
| ... | ... | @@ -910,7 +897,6 @@ fn parseGlobalVarDecl(p: *Parse) !?Node.Index { |
| 910 | 897 | return var_decl; |
| 911 | 898 | } |
| 912 | 899 | |
| 913 | | // ContainerField <- doc_comment? KEYWORD_comptime? (IDENTIFIER COLON)? TypeExpr ByteAlign? (EQUAL Expr)? |
| 914 | 900 | fn expectContainerField(p: *Parse) !Node.Index { |
| 915 | 901 | _ = p.eatToken(.keyword_comptime); |
| 916 | 902 | const main_token = p.tok_i; |
| ... | ... | @@ -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 | 941 | fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index { |
| 975 | 942 | if (p.eatToken(.keyword_comptime)) |comptime_token| { |
| 976 | 943 | const opt_block_expr = try p.parseBlockExpr(); |
| ... | ... | @@ -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 | 1022 | fn expectVarAssignStatement(p: *Parse, comptime_token: ?TokenIndex) !Node.Index { |
| 1057 | 1023 | const scratch_top = p.scratch.items.len; |
| 1058 | 1024 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | ... | @@ -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 | 1151 | fn expectIfStatement(p: *Parse) !Node.Index { |
| 1191 | 1152 | const if_token = p.assertToken(.keyword_if); |
| 1192 | 1153 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -1244,7 +1205,6 @@ fn expectIfStatement(p: *Parse) !Node.Index { |
| 1244 | 1205 | }); |
| 1245 | 1206 | } |
| 1246 | 1207 | |
| 1247 | | /// LabeledStatement <- BlockLabel? (Block / LoopStatement / SwitchExpr) |
| 1248 | 1208 | fn parseLabeledStatement(p: *Parse) !?Node.Index { |
| 1249 | 1209 | const opt_label_token = p.parseBlockLabel(); |
| 1250 | 1210 | |
| ... | ... | @@ -1271,7 +1231,6 @@ fn parseLabeledStatement(p: *Parse) !?Node.Index { |
| 1271 | 1231 | return p.failMsg(.{ .tag = .expected_labelable, .token = after_colon }); |
| 1272 | 1232 | } |
| 1273 | 1233 | |
| 1274 | | /// LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) |
| 1275 | 1234 | fn parseLoopStatement(p: *Parse) !?Node.Index { |
| 1276 | 1235 | const inline_token = p.eatToken(.keyword_inline); |
| 1277 | 1236 | |
| ... | ... | @@ -1284,9 +1243,6 @@ fn parseLoopStatement(p: *Parse) !?Node.Index { |
| 1284 | 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 | 1246 | fn parseForStatement(p: *Parse) !?Node.Index { |
| 1291 | 1247 | const for_token = p.eatToken(.keyword_for) orelse return null; |
| 1292 | 1248 | |
| ... | ... | @@ -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 | 1298 | fn parseWhileStatement(p: *Parse) !?Node.Index { |
| 1348 | 1299 | const while_token = p.eatToken(.keyword_while) orelse return null; |
| 1349 | 1300 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -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 | 1385 | fn parseBlockExprStatement(p: *Parse) !?Node.Index { |
| 1438 | 1386 | const block_expr = try p.parseBlockExpr(); |
| 1439 | 1387 | if (block_expr) |expr| return expr; |
| ... | ... | @@ -1449,7 +1397,6 @@ fn expectBlockExprStatement(p: *Parse) !Node.Index { |
| 1449 | 1397 | return try p.parseBlockExprStatement() orelse return p.fail(.expected_block_or_expr); |
| 1450 | 1398 | } |
| 1451 | 1399 | |
| 1452 | | /// BlockExpr <- BlockLabel? Block |
| 1453 | 1400 | fn parseBlockExpr(p: *Parse) Error!?Node.Index { |
| 1454 | 1401 | switch (p.tokenTag(p.tok_i)) { |
| 1455 | 1402 | .identifier => { |
| ... | ... | @@ -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 | 1417 | fn parseAssignExpr(p: *Parse) !?Node.Index { |
| 1492 | 1418 | const expr = try p.parseExpr() orelse return null; |
| 1493 | 1419 | return try p.finishAssignExpr(expr); |
| 1494 | 1420 | } |
| 1495 | 1421 | |
| 1496 | | /// SingleAssignExpr <- Expr (AssignOp Expr / !AssignOp) |
| 1497 | 1422 | fn parseSingleAssignExpr(p: *Parse) !?Node.Index { |
| 1498 | 1423 | const lhs = try p.parseExpr() orelse return null; |
| 1499 | 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 | 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 | 1636 | fn parsePrefixExpr(p: *Parse) Error!?Node.Index { |
| 1721 | 1637 | const tag: Node.Tag = switch (p.tokenTag(p.tok_i)) { |
| 1722 | 1638 | .bang => .bool_not, |
| ... | ... | @@ -1738,28 +1654,6 @@ fn expectPrefixExpr(p: *Parse) Error!Node.Index { |
| 1738 | 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 | 1657 | fn parseTypeExpr(p: *Parse) Error!?Node.Index { |
| 1764 | 1658 | switch (p.tokenTag(p.tok_i)) { |
| 1765 | 1659 | .question_mark => return try p.addNode(.{ |
| ... | ... | @@ -1957,18 +1851,6 @@ fn expectTypeExpr(p: *Parse) Error!Node.Index { |
| 1957 | 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 | 1854 | fn parsePrimaryExpr(p: *Parse) !?Node.Index { |
| 1973 | 1855 | switch (p.tokenTag(p.tok_i)) { |
| 1974 | 1856 | .keyword_asm => return try p.expectAsmExpr(), |
| ... | ... | @@ -2061,7 +1943,6 @@ fn parsePrimaryExpr(p: *Parse) !?Node.Index { |
| 2061 | 1943 | } |
| 2062 | 1944 | } |
| 2063 | 1945 | |
| 2064 | | /// Block <- LBRACE BlockStatement* RBRACE |
| 2065 | 1946 | fn parseBlock(p: *Parse) !?Node.Index { |
| 2066 | 1947 | const lbrace = p.eatToken(.l_brace) orelse return null; |
| 2067 | 1948 | const scratch_top = p.scratch.items.len; |
| ... | ... | @@ -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 | 1976 | fn forPrefix(p: *Parse) Error!usize { |
| 2101 | 1977 | const start = p.scratch.items.len; |
| 2102 | 1978 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -2152,9 +2028,6 @@ fn forPrefix(p: *Parse) Error!usize { |
| 2152 | 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 | 2031 | fn expectWhileExpr(p: *Parse) !Node.Index { |
| 2159 | 2032 | const while_token = p.assertToken(.keyword_while); |
| 2160 | 2033 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -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 | 2080 | fn parseCurlySuffixExpr(p: *Parse) !?Node.Index { |
| 2214 | 2081 | const lhs = try p.parseTypeExpr() orelse return null; |
| 2215 | 2082 | const lbrace = p.eatToken(.l_brace) orelse return lhs; |
| ... | ... | @@ -2306,7 +2173,6 @@ fn parseCurlySuffixExpr(p: *Parse) !?Node.Index { |
| 2306 | 2173 | } |
| 2307 | 2174 | } |
| 2308 | 2175 | |
| 2309 | | /// ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr / !EXCLAMATIONMARK) |
| 2310 | 2176 | fn parseErrorUnionExpr(p: *Parse) !?Node.Index { |
| 2311 | 2177 | const suffix_expr = try p.parseSuffixExpr() orelse return null; |
| 2312 | 2178 | const bang = p.eatToken(.bang) orelse return suffix_expr; |
| ... | ... | @@ -2320,7 +2186,6 @@ fn parseErrorUnionExpr(p: *Parse) !?Node.Index { |
| 2320 | 2186 | }); |
| 2321 | 2187 | } |
| 2322 | 2188 | |
| 2323 | | /// SuffixExpr <- PrimaryTypeExpr SuffixOp* !SuffixOpPrefix |
| 2324 | 2189 | fn parseSuffixExpr(p: *Parse) !?Node.Index { |
| 2325 | 2190 | var res = try p.parsePrimaryTypeExpr() orelse return null; |
| 2326 | 2191 | while (try p.parseSuffixOp(res)) |suffix_op| { |
| ... | ... | @@ -2329,46 +2194,6 @@ fn parseSuffixExpr(p: *Parse) !?Node.Index { |
| 2329 | 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 | 2197 | fn parsePrimaryTypeExpr(p: *Parse) !?Node.Index { |
| 2373 | 2198 | switch (p.tokenTag(p.tok_i)) { |
| 2374 | 2199 | .char_literal => return try p.addNode(.{ |
| ... | ... | @@ -2637,9 +2462,6 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index { |
| 2637 | 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 | 2465 | fn expectWhileTypeExpr(p: *Parse) !Node.Index { |
| 2644 | 2466 | const while_token = p.assertToken(.keyword_while); |
| 2645 | 2467 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -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 | 2514 | fn parseSwitchExpr(p: *Parse, is_labeled: bool) !?Node.Index { |
| 2694 | 2515 | const switch_token = p.eatToken(.keyword_switch) orelse return null; |
| 2695 | 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 | 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 | 2546 | fn expectAsmExpr(p: *Parse) !Node.Index { |
| 2739 | 2547 | const asm_token = p.assertToken(.keyword_asm); |
| 2740 | 2548 | _ = p.eatToken(.keyword_volatile); |
| ... | ... | @@ -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 | 2615 | fn parseAsmOutputItem(p: *Parse) !?Node.Index { |
| 2809 | 2616 | _ = p.eatToken(.l_bracket) orelse return null; |
| 2810 | 2617 | const identifier = try p.expectToken(.identifier); |
| ... | ... | @@ -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 | 2640 | fn parseAsmInputItem(p: *Parse) !?Node.Index { |
| 2835 | 2641 | _ = p.eatToken(.l_bracket) orelse return null; |
| 2836 | 2642 | const identifier = try p.expectToken(.identifier); |
| ... | ... | @@ -2849,17 +2655,14 @@ fn parseAsmInputItem(p: *Parse) !?Node.Index { |
| 2849 | 2655 | }); |
| 2850 | 2656 | } |
| 2851 | 2657 | |
| 2852 | | /// BreakLabel <- COLON IDENTIFIER |
| 2853 | 2658 | fn parseBreakLabel(p: *Parse) Error!OptionalTokenIndex { |
| 2854 | 2659 | return if (p.eatTokens(&.{ .colon, .identifier })) |i| .fromToken(i + 1) else .none; |
| 2855 | 2660 | } |
| 2856 | 2661 | |
| 2857 | | /// BlockLabel <- IDENTIFIER COLON |
| 2858 | 2662 | fn parseBlockLabel(p: *Parse) ?TokenIndex { |
| 2859 | 2663 | return p.eatTokens(&.{ .identifier, .colon }); |
| 2860 | 2664 | } |
| 2861 | 2665 | |
| 2862 | | /// FieldInit <- DOT IDENTIFIER EQUAL Expr |
| 2863 | 2666 | fn parseFieldInit(p: *Parse) !?Node.Index { |
| 2864 | 2667 | if (p.eatTokens(&.{ .period, .identifier, .equal })) |_| { |
| 2865 | 2668 | return try p.expectExpr(); |
| ... | ... | @@ -2874,7 +2677,6 @@ fn expectFieldInit(p: *Parse) !Node.Index { |
| 2874 | 2677 | return p.fail(.expected_initializer); |
| 2875 | 2678 | } |
| 2876 | 2679 | |
| 2877 | | /// WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN |
| 2878 | 2680 | fn parseWhileContinueExpr(p: *Parse) !?Node.Index { |
| 2879 | 2681 | _ = p.eatToken(.colon) orelse return null; |
| 2880 | 2682 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -2883,7 +2685,6 @@ fn parseWhileContinueExpr(p: *Parse) !?Node.Index { |
| 2883 | 2685 | return node; |
| 2884 | 2686 | } |
| 2885 | 2687 | |
| 2886 | | /// LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN |
| 2887 | 2688 | fn parseLinkSection(p: *Parse) !?Node.Index { |
| 2888 | 2689 | _ = p.eatToken(.keyword_linksection) orelse return null; |
| 2889 | 2690 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -2892,7 +2693,6 @@ fn parseLinkSection(p: *Parse) !?Node.Index { |
| 2892 | 2693 | return expr_node; |
| 2893 | 2694 | } |
| 2894 | 2695 | |
| 2895 | | /// CallConv <- KEYWORD_callconv LPAREN Expr RPAREN |
| 2896 | 2696 | fn parseCallconv(p: *Parse) !?Node.Index { |
| 2897 | 2697 | _ = p.eatToken(.keyword_callconv) orelse return null; |
| 2898 | 2698 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -2901,7 +2701,6 @@ fn parseCallconv(p: *Parse) !?Node.Index { |
| 2901 | 2701 | return expr_node; |
| 2902 | 2702 | } |
| 2903 | 2703 | |
| 2904 | | /// AddrSpace <- KEYWORD_addrspace LPAREN Expr RPAREN |
| 2905 | 2704 | fn parseAddrSpace(p: *Parse) !?Node.Index { |
| 2906 | 2705 | _ = p.eatToken(.keyword_addrspace) orelse return null; |
| 2907 | 2706 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -2913,12 +2712,6 @@ fn parseAddrSpace(p: *Parse) !?Node.Index { |
| 2913 | 2712 | /// This function can return null nodes and then still return nodes afterwards, |
| 2914 | 2713 | /// such as in the case of anytype and `...`. Caller must look for rparen to find |
| 2915 | 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 | 2715 | fn expectParamDecl(p: *Parse) !?Node.Index { |
| 2923 | 2716 | _ = try p.eatDocComments(); |
| 2924 | 2717 | switch (p.tokenTag(p.tok_i)) { |
| ... | ... | @@ -2937,7 +2730,6 @@ fn expectParamDecl(p: *Parse) !?Node.Index { |
| 2937 | 2730 | } |
| 2938 | 2731 | } |
| 2939 | 2732 | |
| 2940 | | /// Payload <- PIPE IDENTIFIER PIPE |
| 2941 | 2733 | fn parsePayload(p: *Parse) Error!OptionalTokenIndex { |
| 2942 | 2734 | _ = p.eatToken(.pipe) orelse return .none; |
| 2943 | 2735 | const identifier = try p.expectToken(.identifier); |
| ... | ... | @@ -2945,7 +2737,6 @@ fn parsePayload(p: *Parse) Error!OptionalTokenIndex { |
| 2945 | 2737 | return .fromToken(identifier); |
| 2946 | 2738 | } |
| 2947 | 2739 | |
| 2948 | | /// PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE |
| 2949 | 2740 | fn parsePtrPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2950 | 2741 | _ = p.eatToken(.pipe) orelse return .none; |
| 2951 | 2742 | _ = p.eatToken(.asterisk); |
| ... | ... | @@ -2955,8 +2746,6 @@ fn parsePtrPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2955 | 2746 | } |
| 2956 | 2747 | |
| 2957 | 2748 | /// Returns the first identifier token, if any. |
| 2958 | | /// |
| 2959 | | /// PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE |
| 2960 | 2749 | fn parsePtrIndexPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2961 | 2750 | _ = p.eatToken(.pipe) orelse return .none; |
| 2962 | 2751 | _ = p.eatToken(.asterisk); |
| ... | ... | @@ -2968,11 +2757,6 @@ fn parsePtrIndexPayload(p: *Parse) Error!OptionalTokenIndex { |
| 2968 | 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 | 2760 | fn parseSwitchProng(p: *Parse) !?Node.Index { |
| 2977 | 2761 | const scratch_top = p.scratch.items.len; |
| 2978 | 2762 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | ... | @@ -3015,7 +2799,6 @@ fn parseSwitchProng(p: *Parse) !?Node.Index { |
| 3015 | 2799 | } |
| 3016 | 2800 | } |
| 3017 | 2801 | |
| 3018 | | /// SwitchItem <- Expr (DOT3 Expr)? |
| 3019 | 2802 | fn parseSwitchItem(p: *Parse) !?Node.Index { |
| 3020 | 2803 | const expr = try p.parseExpr() orelse return null; |
| 3021 | 2804 | |
| ... | ... | @@ -3043,22 +2826,6 @@ const PtrModifiers = struct { |
| 3043 | 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 | 2829 | fn parsePtrModifiers(p: *Parse, align_type: enum { bit_align, byte_align }) !PtrModifiers { |
| 3063 | 2830 | var result: PtrModifiers = .{ |
| 3064 | 2831 | .align_node = .none, |
| ... | ... | @@ -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 | 2872 | fn parseSuffixOp(p: *Parse, lhs: Node.Index) !?Node.Index { |
| 3116 | 2873 | switch (p.tokenTag(p.tok_i)) { |
| 3117 | 2874 | .l_bracket => { |
| ... | ... | @@ -3246,14 +3003,6 @@ fn parseSuffixOp(p: *Parse, lhs: Node.Index) !?Node.Index { |
| 3246 | 3003 | } |
| 3247 | 3004 | |
| 3248 | 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 | 3006 | fn expectContainerDeclAuto(p: *Parse) !Node.Index { |
| 3258 | 3007 | const main_token = p.nextToken(); |
| 3259 | 3008 | const arg_expr = switch (p.tokenTag(main_token)) { |
| ... | ... | @@ -3407,8 +3156,6 @@ fn parseCStyleContainer(p: *Parse) Error!bool { |
| 3407 | 3156 | } |
| 3408 | 3157 | |
| 3409 | 3158 | /// Holds temporary data until we are ready to construct the full ContainerDecl AST node. |
| 3410 | | /// |
| 3411 | | /// ByteAlign <- KEYWORD_align LPAREN Expr RPAREN |
| 3412 | 3159 | fn parseByteAlign(p: *Parse) !?Node.Index { |
| 3413 | 3160 | _ = p.eatToken(.keyword_align) orelse return null; |
| 3414 | 3161 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -3417,7 +3164,6 @@ fn parseByteAlign(p: *Parse) !?Node.Index { |
| 3417 | 3164 | return expr; |
| 3418 | 3165 | } |
| 3419 | 3166 | |
| 3420 | | /// SwitchProngList <- (SwitchProng COMMA)* SwitchProng? |
| 3421 | 3167 | fn parseSwitchProngList(p: *Parse) !Node.SubRange { |
| 3422 | 3168 | const scratch_top = p.scratch.items.len; |
| 3423 | 3169 | defer p.scratch.shrinkRetainingCapacity(scratch_top); |
| ... | ... | @@ -3438,7 +3184,6 @@ fn parseSwitchProngList(p: *Parse) !Node.SubRange { |
| 3438 | 3184 | return p.listToSpan(p.scratch.items[scratch_top..]); |
| 3439 | 3185 | } |
| 3440 | 3186 | |
| 3441 | | /// ParamDeclList <- (ParamDecl COMMA)* (ParamDecl / DOT3 COMMA?)? |
| 3442 | 3187 | fn parseParamDeclList(p: *Parse) !SmallSpan { |
| 3443 | 3188 | _ = try p.expectToken(.l_paren); |
| 3444 | 3189 | const scratch_top = p.scratch.items.len; |
| ... | ... | @@ -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 | 3223 | fn expectBuiltinCall(p: *Parse) !Node.Index { |
| 3482 | 3224 | const builtin_token = p.assertToken(.builtin); |
| 3483 | 3225 | _ = p.eatToken(.l_paren) orelse { |
| ... | ... | @@ -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 | 3271 | fn expectIf(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index { |
| 3535 | 3272 | const if_token = p.assertToken(.keyword_if); |
| 3536 | 3273 | _ = try p.expectToken(.l_paren); |
| ... | ... | @@ -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 | 3304 | fn expectFor(p: *Parse, comptime bodyParseFn: fn (p: *Parse) Error!Node.Index) !Node.Index { |
| 3571 | 3305 | const for_token = p.assertToken(.keyword_for); |
| 3572 | 3306 | |