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