| ... | @@ -878,34 +878,32 @@ const Parser = struct { | ... | @@ -878,34 +878,32 @@ const Parser = struct { |
| 878 | return node; | 878 | return node; |
| 879 | } | 879 | } |
| 880 | | 880 | |
| 881 | if (try p.parseAssignExpr()) |assign_expr| { | 881 | for_prefix.body = try p.expectNode(parseAssignExpr, .{ |
| 882 | for_prefix.body = assign_expr; | 882 | .ExpectedBlockOrAssignment = .{ .token = p.tok_i }, |
| 883 | | 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 | }); | | |
| 890 | | 884 | |
| 891 | const else_node = try p.arena.allocator.create(Node.Else); | 885 | if (p.eatToken(.Semicolon) != null) return node; |
| 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 | } | | |
| 900 | | 886 | |
| 901 | try p.errors.append(p.gpa, .{ | 887 | if (p.eatToken(.Keyword_else)) |else_token| { |
| 902 | .ExpectedSemiOrElse = .{ .token = p.tok_i }, | 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 | return node; | 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 | /// WhileStatement | 909 | /// WhileStatement |
| ... | @@ -939,36 +937,35 @@ const Parser = struct { | ... | @@ -939,36 +937,35 @@ const Parser = struct { |
| 939 | return node; | 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| { | 941 | while_prefix.body = try p.expectNode(parseAssignExpr, .{ |
| 948 | const payload = try p.parsePayload(); | 942 | .ExpectedBlockOrAssignment = .{ .token = p.tok_i }, |
| | 943 | }); |
| 949 | | 944 | |
| 950 | const statement_node = try p.expectNode(parseStatement, .{ | 945 | if (p.eatToken(.Semicolon) != null) return node; |
| 951 | .ExpectedStatement = .{ .token = p.tok_i }, | | |
| 952 | }); | | |
| 953 | | 946 | |
| 954 | const else_node = try p.arena.allocator.create(Node.Else); | 947 | if (p.eatToken(.Keyword_else)) |else_token| { |
| 955 | else_node.* = .{ | 948 | const payload = try p.parsePayload(); |
| 956 | .else_token = else_token, | | |
| 957 | .payload = payload, | | |
| 958 | .body = statement_node, | | |
| 959 | }; | | |
| 960 | while_prefix.@"else" = else_node; | | |
| 961 | return node; | | |
| 962 | } | | |
| 963 | | 949 | |
| 964 | try p.errors.append(p.gpa, .{ | 950 | const statement_node = try p.expectNode(parseStatement, .{ |
| 965 | .ExpectedSemiOrElse = .{ .token = p.tok_i }, | 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 | return node; | 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 | /// BlockExprStatement | 971 | /// BlockExprStatement |