authorgravatar for shachaf@gmail.comShachaf Ben-Kiki <shachaf@gmail.com> 2021-04-24 22:35:37-07:00
committergravatar for shachaf@gmail.comShachaf Ben-Kiki <shachaf@gmail.com> 2021-04-24 23:03:48-07:00
log33da465079d8d51bbe8d6e6c9976815a750872d0
tree4910ed1aa0535f9ff48aa9e7232d9415fb251921
parent01aa74a93fa7c18f8a2f27a4c5f76333935c3502

Use a directEnumArray lookup table instead of a switch


1 files changed, 36 insertions(+), 40 deletions(-)

lib/std/zig/parse.zig+36-40
...@@ -1336,45 +1336,41 @@ const Parser = struct {...@@ -1336,45 +1336,41 @@ const Parser = struct {
1336 // A table of binary operator information. Higher precedence numbers are1336 // A table of binary operator information. Higher precedence numbers are
1337 // stickier. All operators at the same precedence level should have the same1337 // 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
13421342 .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
13451345 .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
13521352 .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
13581358 .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
13611361 .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
13671367 .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 }
13781374
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 {
13861382
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 }