| ... | ... | @@ -878,34 +878,32 @@ const Parser = struct { |
| 878 | 878 | return node; |
| 879 | 879 | } |
| 880 | 880 | |
| 881 | | if (try p.parseAssignExpr()) |assign_expr| { |
| 882 | | for_prefix.body = assign_expr; |
| 883 | | |
| 884 | | if (p.eatToken(.Semicolon) != null) return node; |
| 885 | | |
| 886 | | if (p.eatToken(.Keyword_else)) |else_token| { |
| 887 | | const statement_node = try p.expectNode(parseStatement, .{ |
| 888 | | .ExpectedStatement = .{ .token = p.tok_i }, |
| 889 | | }); |
| 881 | for_prefix.body = try p.expectNode(parseAssignExpr, .{ |
| 882 | .ExpectedBlockOrAssignment = .{ .token = p.tok_i }, |
| 883 | }); |
| 890 | 884 | |
| 891 | | const else_node = try p.arena.allocator.create(Node.Else); |
| 892 | | else_node.* = .{ |
| 893 | | .else_token = else_token, |
| 894 | | .payload = null, |
| 895 | | .body = statement_node, |
| 896 | | }; |
| 897 | | for_prefix.@"else" = else_node; |
| 898 | | return node; |
| 899 | | } |
| 885 | if (p.eatToken(.Semicolon) != null) return node; |
| 900 | 886 | |
| 901 | | try p.errors.append(p.gpa, .{ |
| 902 | | .ExpectedSemiOrElse = .{ .token = p.tok_i }, |
| 887 | if (p.eatToken(.Keyword_else)) |else_token| { |
| 888 | const statement_node = try p.expectNode(parseStatement, .{ |
| 889 | .ExpectedStatement = .{ .token = p.tok_i }, |
| 903 | 890 | }); |
| 904 | 891 | |
| 892 | const else_node = try p.arena.allocator.create(Node.Else); |
| 893 | else_node.* = .{ |
| 894 | .else_token = else_token, |
| 895 | .payload = null, |
| 896 | .body = statement_node, |
| 897 | }; |
| 898 | for_prefix.@"else" = else_node; |
| 905 | 899 | return node; |
| 906 | 900 | } |
| 907 | 901 | |
| 908 | | return null; |
| 902 | try p.errors.append(p.gpa, .{ |
| 903 | .ExpectedSemiOrElse = .{ .token = p.tok_i }, |
| 904 | }); |
| 905 | |
| 906 | return node; |
| 909 | 907 | } |
| 910 | 908 | |
| 911 | 909 | /// WhileStatement |
| ... | ... | @@ -939,36 +937,35 @@ const Parser = struct { |
| 939 | 937 | return node; |
| 940 | 938 | } |
| 941 | 939 | |
| 942 | | if (try p.parseAssignExpr()) |assign_expr_node| { |
| 943 | | while_prefix.body = assign_expr_node; |
| 944 | | |
| 945 | | if (p.eatToken(.Semicolon) != null) return node; |
| 946 | 940 | |
| 947 | | if (p.eatToken(.Keyword_else)) |else_token| { |
| 948 | | const payload = try p.parsePayload(); |
| 941 | while_prefix.body = try p.expectNode(parseAssignExpr, .{ |
| 942 | .ExpectedBlockOrAssignment = .{ .token = p.tok_i }, |
| 943 | }); |
| 949 | 944 | |
| 950 | | const statement_node = try p.expectNode(parseStatement, .{ |
| 951 | | .ExpectedStatement = .{ .token = p.tok_i }, |
| 952 | | }); |
| 945 | if (p.eatToken(.Semicolon) != null) return node; |
| 953 | 946 | |
| 954 | | const else_node = try p.arena.allocator.create(Node.Else); |
| 955 | | else_node.* = .{ |
| 956 | | .else_token = else_token, |
| 957 | | .payload = payload, |
| 958 | | .body = statement_node, |
| 959 | | }; |
| 960 | | while_prefix.@"else" = else_node; |
| 961 | | return node; |
| 962 | | } |
| 947 | if (p.eatToken(.Keyword_else)) |else_token| { |
| 948 | const payload = try p.parsePayload(); |
| 963 | 949 | |
| 964 | | try p.errors.append(p.gpa, .{ |
| 965 | | .ExpectedSemiOrElse = .{ .token = p.tok_i }, |
| 950 | const statement_node = try p.expectNode(parseStatement, .{ |
| 951 | .ExpectedStatement = .{ .token = p.tok_i }, |
| 966 | 952 | }); |
| 967 | 953 | |
| 954 | const else_node = try p.arena.allocator.create(Node.Else); |
| 955 | else_node.* = .{ |
| 956 | .else_token = else_token, |
| 957 | .payload = payload, |
| 958 | .body = statement_node, |
| 959 | }; |
| 960 | while_prefix.@"else" = else_node; |
| 968 | 961 | return node; |
| 969 | 962 | } |
| 970 | 963 | |
| 971 | | return null; |
| 964 | try p.errors.append(p.gpa, .{ |
| 965 | .ExpectedSemiOrElse = .{ .token = p.tok_i }, |
| 966 | }); |
| 967 | |
| 968 | return node; |
| 972 | 969 | } |
| 973 | 970 | |
| 974 | 971 | /// BlockExprStatement |