| ... | @@ -1336,45 +1336,41 @@ const Parser = struct { | ... | @@ -1336,45 +1336,41 @@ const Parser = struct { |
| 1336 | // A table of binary operator information. Higher precedence numbers are | 1336 | // A table of binary operator information. Higher precedence numbers are |
| 1337 | // stickier. All operators at the same precedence level should have the same | 1337 | // stickier. All operators at the same precedence level should have the same |
| 1338 | // associativity. | 1338 | // associativity. |
| 1339 | fn operInfo(tag: Token.Tag) OperInfo { | 1339 | const operTable = std.enums.directEnumArrayDefault(Token.Tag, OperInfo, .{ .prec = -1, .tag = Node.Tag.root }, 0, .{ |
| 1340 | return switch (tag) { | 1340 | .keyword_or = .{ .prec = 10, .tag = .bool_or }, |
| 1341 | .keyword_or => .{ .prec = 10, .tag = .bool_or }, | 1341 | |
| 1342 | | 1342 | .keyword_and = .{ .prec = 20, .tag = .bool_and }, |
| 1343 | .keyword_and => .{ .prec = 20, .tag = .bool_and }, | 1343 | .invalid_ampersands = .{ .prec = 20, .tag = .bool_and }, |
| 1344 | .invalid_ampersands => .{ .prec = 20, .tag = .bool_and }, | 1344 | |
| 1345 | | 1345 | .equal_equal = .{ .prec = 30, .tag = .equal_equal, .assoc = Assoc.none }, |
| 1346 | .equal_equal => .{ .prec = 30, .tag = .equal_equal, .assoc = Assoc.none }, | 1346 | .bang_equal = .{ .prec = 30, .tag = .bang_equal, .assoc = Assoc.none }, |
| 1347 | .bang_equal => .{ .prec = 30, .tag = .bang_equal, .assoc = Assoc.none }, | 1347 | .angle_bracket_left = .{ .prec = 30, .tag = .less_than, .assoc = Assoc.none }, |
| 1348 | .angle_bracket_left => .{ .prec = 30, .tag = .less_than, .assoc = Assoc.none }, | 1348 | .angle_bracket_right = .{ .prec = 30, .tag = .greater_than, .assoc = Assoc.none }, |
| 1349 | .angle_bracket_right => .{ .prec = 30, .tag = .greater_than, .assoc = Assoc.none }, | 1349 | .angle_bracket_left_equal = .{ .prec = 30, .tag = .less_or_equal, .assoc = Assoc.none }, |
| 1350 | .angle_bracket_left_equal => .{ .prec = 30, .tag = .less_or_equal, .assoc = Assoc.none }, | 1350 | .angle_bracket_right_equal = .{ .prec = 30, .tag = .greater_or_equal, .assoc = Assoc.none }, |
| 1351 | .angle_bracket_right_equal => .{ .prec = 30, .tag = .greater_or_equal, .assoc = Assoc.none }, | 1351 | |
| 1352 | | 1352 | .ampersand = .{ .prec = 40, .tag = .bit_and }, |
| 1353 | .ampersand => .{ .prec = 40, .tag = .bit_and }, | 1353 | .caret = .{ .prec = 40, .tag = .bit_xor }, |
| 1354 | .caret => .{ .prec = 40, .tag = .bit_xor }, | 1354 | .pipe = .{ .prec = 40, .tag = .bit_or }, |
| 1355 | .pipe => .{ .prec = 40, .tag = .bit_or }, | 1355 | .keyword_orelse = .{ .prec = 40, .tag = .@"orelse" }, |
| 1356 | .keyword_orelse => .{ .prec = 40, .tag = .@"orelse" }, | 1356 | .keyword_catch = .{ .prec = 40, .tag = .@"catch" }, |
| 1357 | .keyword_catch => .{ .prec = 40, .tag = .@"catch" }, | 1357 | |
| 1358 | | 1358 | .angle_bracket_angle_bracket_left = .{ .prec = 50, .tag = .bit_shift_left }, |
| 1359 | .angle_bracket_angle_bracket_left => .{ .prec = 50, .tag = .bit_shift_left }, | 1359 | .angle_bracket_angle_bracket_right = .{ .prec = 50, .tag = .bit_shift_right }, |
| 1360 | .angle_bracket_angle_bracket_right => .{ .prec = 50, .tag = .bit_shift_right }, | 1360 | |
| 1361 | | 1361 | .plus = .{ .prec = 60, .tag = .add }, |
| 1362 | .plus => .{ .prec = 60, .tag = .add }, | 1362 | .minus = .{ .prec = 60, .tag = .sub }, |
| 1363 | .minus => .{ .prec = 60, .tag = .sub }, | 1363 | .plus_plus = .{ .prec = 60, .tag = .array_cat }, |
| 1364 | .plus_plus => .{ .prec = 60, .tag = .array_cat }, | 1364 | .plus_percent = .{ .prec = 60, .tag = .add_wrap }, |
| 1365 | .plus_percent => .{ .prec = 60, .tag = .add_wrap }, | 1365 | .minus_percent = .{ .prec = 60, .tag = .sub_wrap }, |
| 1366 | .minus_percent => .{ .prec = 60, .tag = .sub_wrap }, | 1366 | |
| 1367 | | 1367 | .pipe_pipe = .{ .prec = 70, .tag = .merge_error_sets }, |
| 1368 | .pipe_pipe => .{ .prec = 70, .tag = .merge_error_sets }, | 1368 | .asterisk = .{ .prec = 70, .tag = .mul }, |
| 1369 | .asterisk => .{ .prec = 70, .tag = .mul }, | 1369 | .slash = .{ .prec = 70, .tag = .div }, |
| 1370 | .slash => .{ .prec = 70, .tag = .div }, | 1370 | .percent = .{ .prec = 70, .tag = .mod }, |
| 1371 | .percent => .{ .prec = 70, .tag = .mod }, | 1371 | .asterisk_asterisk = .{ .prec = 70, .tag = .array_mult }, |
| 1372 | .asterisk_asterisk => .{ .prec = 70, .tag = .array_mult }, | 1372 | .asterisk_percent = .{ .prec = 70, .tag = .mul_wrap }, |
| 1373 | .asterisk_percent => .{ .prec = 70, .tag = .mul_wrap }, | 1373 | }); |
| 1374 | | | |
| 1375 | else => .{ .prec = -1, .tag = ast.Node.Tag.root }, // irrelevant | | |
| 1376 | }; | | |
| 1377 | } | | |
| 1378 | | 1374 | |
| 1379 | fn parseExprPrecedence(p: *Parser, min_prec: i32) Error!Node.Index { | 1375 | fn parseExprPrecedence(p: *Parser, min_prec: i32) Error!Node.Index { |
| 1380 | var node = try p.parsePrefixExpr(); | 1376 | var node = try p.parsePrefixExpr(); |
| ... | @@ -1386,7 +1382,7 @@ const Parser = struct { | ... | @@ -1386,7 +1382,7 @@ const Parser = struct { |
| 1386 | | 1382 | |
| 1387 | while (true) { | 1383 | while (true) { |
| 1388 | const tok_tag = p.token_tags[p.tok_i]; | 1384 | const tok_tag = p.token_tags[p.tok_i]; |
| 1389 | const info = operInfo(tok_tag); | 1385 | const info = operTable[@intCast(usize, @enumToInt(tok_tag))]; |
| 1390 | if (info.prec < min_prec or info.prec == banned_prec) { | 1386 | if (info.prec < min_prec or info.prec == banned_prec) { |
| 1391 | break; | 1387 | break; |
| 1392 | } | 1388 | } |