authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-11 12:05:10+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-11 12:05:10+02:00
log281c17f6ae3c294d0b7139fe640dd0cb30123ea1
tree22597baab53aa9bd2b79405d0cade6e200950a75
parentdae287524d94219b1f3a2ec82d410b9f34fb2546

std.zig.parser:

* Renamed eatToken to expectToken * A new eatToken fn, which only eats the token, if the id match * Inlined initNode, as it is not suppose to be used outside createNode

1 files changed, 148 insertions(+), 158 deletions(-)

std/zig/parser.zig+148-158
......@@ -266,8 +266,7 @@ pub const Parser = struct {
266266
267267 // look for line comments
268268 while (true) {
269 const token = self.getNextToken();
270 if (token.id == Token.Id.LineComment) {
269 if (self.eatToken(Token.Id.LineComment)) |line_comment| {
271270 const node = blk: {
272271 if (self.pending_line_comment_node) |comment_node| {
273272 break :blk comment_node;
......@@ -284,10 +283,9 @@ pub const Parser = struct {
284283 break :blk comment_node;
285284 }
286285 };
287 try node.lines.append(token);
286 try node.lines.append(line_comment);
288287 continue;
289288 }
290 self.putBackToken(token);
291289 break;
292290 }
293291
......@@ -301,8 +299,8 @@ pub const Parser = struct {
301299 Token.Id.Keyword_test => {
302300 stack.append(State.TopLevel) catch unreachable;
303301
304 const name_token = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue;
305 const lbrace = (try self.eatToken(&stack, Token.Id.LBrace)) ?? continue;
302 const name_token = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue;
303 const lbrace = (try self.expectToken(&stack, Token.Id.LBrace)) ?? continue;
306304
307305 const block = try self.createNode(arena, ast.NodeBlock,
308306 ast.NodeBlock {
......@@ -580,25 +578,27 @@ pub const Parser = struct {
580578 },
581579 State.VarDeclEq => |var_decl| {
582580 const token = self.getNextToken();
583 if (token.id == Token.Id.Equal) {
584 var_decl.eq_token = token;
585 stack.append(State {
586 .ExpectTokenSave = ExpectTokenSave {
587 .id = Token.Id.Semicolon,
588 .ptr = &var_decl.semicolon_token,
589 },
590 }) catch unreachable;
591 try stack.append(State {
592 .Expression = DestPtr {.NullableField = &var_decl.init_node},
593 });
594 continue;
595 }
596 if (token.id == Token.Id.Semicolon) {
597 var_decl.semicolon_token = token;
598 continue;
581 switch (token.id) {
582 Token.Id.Equal => {
583 var_decl.eq_token = token;
584 stack.append(State {
585 .ExpectTokenSave = ExpectTokenSave {
586 .id = Token.Id.Semicolon,
587 .ptr = &var_decl.semicolon_token,
588 },
589 }) catch unreachable;
590 try stack.append(State { .Expression = DestPtr {.NullableField = &var_decl.init_node} });
591 continue;
592 },
593 Token.Id.Semicolon => {
594 var_decl.semicolon_token = token;
595 continue;
596 },
597 else => {
598 try self.parseError(&stack, token, "expected '=' or ';', found {}", @tagName(token.id));
599 continue;
600 }
599601 }
600 try self.parseError(&stack, token, "expected '=' or ';', found {}", @tagName(token.id));
601 continue;
602602 },
603603
604604 State.ContainerExtern => |ctx| {
......@@ -752,12 +752,12 @@ pub const Parser = struct {
752752 },
753753
754754 State.ExpectToken => |token_id| {
755 _ = (try self.eatToken(&stack, token_id)) ?? continue;
755 _ = (try self.expectToken(&stack, token_id)) ?? continue;
756756 continue;
757757 },
758758
759759 State.ExpectTokenSave => |expect_token_save| {
760 *expect_token_save.ptr = (try self.eatToken(&stack, expect_token_save.id)) ?? continue;
760 *expect_token_save.ptr = (try self.expectToken(&stack, expect_token_save.id)) ?? continue;
761761 continue;
762762 },
763763
......@@ -817,7 +817,7 @@ pub const Parser = struct {
817817 break :blk null;
818818 }
819819
820 break :blk (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
820 break :blk (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
821821 };
822822
823823 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeControlFlowExpression,
......@@ -979,23 +979,20 @@ pub const Parser = struct {
979979 },
980980
981981 State.RangeExpressionEnd => |dest_ptr| {
982 const token = self.getNextToken();
983 if (token.id == Token.Id.Ellipsis3) {
982 if (self.eatToken(Token.Id.Ellipsis3)) |ellipsis3| {
984983 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeInfixOp,
985984 ast.NodeInfixOp {
986985 .base = undefined,
987986 .lhs = dest_ptr.get(),
988 .op_token = token,
987 .op_token = ellipsis3,
989988 .op = ast.NodeInfixOp.InfixOp.Range,
990989 .rhs = undefined,
991990 }
992991 );
993992 stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
994 continue;
995 } else {
996 self.putBackToken(token);
997 continue;
998993 }
994
995 continue;
999996 },
1000997
1001998 State.AssignmentExpressionBegin => |dest_ptr| {
......@@ -1329,57 +1326,49 @@ pub const Parser = struct {
13291326 },
13301327
13311328 State.CurlySuffixExpressionEnd => |dest_ptr| {
1332 const token = self.getNextToken();
1333 if (token.id != Token.Id.LBrace) {
1334 self.putBackToken(token);
1329 if (self.eatToken(Token.Id.LBrace) == null) {
13351330 continue;
13361331 }
13371332
1338 const next = self.getNextToken();
1339 switch (next.id) {
1340 Token.Id.Period => {
1341 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1342 ast.NodeSuffixOp {
1343 .base = undefined,
1344 .lhs = dest_ptr.get(),
1345 .op = ast.NodeSuffixOp.SuffixOp {
1346 .StructInitializer = ArrayList(&ast.NodeFieldInitializer).init(arena),
1347 },
1348 .rtoken = undefined,
1349 }
1350 );
1351 stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable;
1352 try stack.append(State {
1353 .FieldInitListItemOrEnd = ListSave(&ast.NodeFieldInitializer) {
1354 .list = &node.op.StructInitializer,
1355 .ptr = &node.rtoken,
1356 }
1357 });
1358 self.putBackToken(next);
1359 continue;
1360 },
1361 else => {
1362 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1363 ast.NodeSuffixOp {
1364 .base = undefined,
1365 .lhs = dest_ptr.get(),
1366 .op = ast.NodeSuffixOp.SuffixOp {
1367 .ArrayInitializer = ArrayList(&ast.Node).init(arena),
1368 },
1369 .rtoken = undefined,
1370 }
1371 );
1372 stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable;
1373 try stack.append(State {
1374 .ExprListItemOrEnd = ExprListCtx {
1375 .list = &node.op.ArrayInitializer,
1376 .end = Token.Id.RBrace,
1377 .ptr = &node.rtoken,
1378 }
1379 });
1380 self.putBackToken(next);
1381 continue;
1382 },
1333 if (self.isPeekToken(Token.Id.Period)) {
1334 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1335 ast.NodeSuffixOp {
1336 .base = undefined,
1337 .lhs = dest_ptr.get(),
1338 .op = ast.NodeSuffixOp.SuffixOp {
1339 .StructInitializer = ArrayList(&ast.NodeFieldInitializer).init(arena),
1340 },
1341 .rtoken = undefined,
1342 }
1343 );
1344 stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable;
1345 try stack.append(State {
1346 .FieldInitListItemOrEnd = ListSave(&ast.NodeFieldInitializer) {
1347 .list = &node.op.StructInitializer,
1348 .ptr = &node.rtoken,
1349 }
1350 });
1351 continue;
1352 } else {
1353 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeSuffixOp,
1354 ast.NodeSuffixOp {
1355 .base = undefined,
1356 .lhs = dest_ptr.get(),
1357 .op = ast.NodeSuffixOp.SuffixOp {
1358 .ArrayInitializer = ArrayList(&ast.Node).init(arena),
1359 },
1360 .rtoken = undefined,
1361 }
1362 );
1363 stack.append(State { .CurlySuffixExpressionEnd = dest_ptr }) catch unreachable;
1364 try stack.append(State {
1365 .ExprListItemOrEnd = ExprListCtx {
1366 .list = &node.op.ArrayInitializer,
1367 .end = Token.Id.RBrace,
1368 .ptr = &node.rtoken,
1369 }
1370 });
1371 continue;
13831372 }
13841373 },
13851374
......@@ -1836,7 +1825,7 @@ pub const Parser = struct {
18361825 continue;
18371826 },
18381827 Token.Id.Keyword_nakedcc, Token.Id.Keyword_stdcallcc => {
1839 const fn_token = (try self.eatToken(&stack, Token.Id.Keyword_fn)) ?? continue;
1828 const fn_token = (try self.expectToken(&stack, Token.Id.Keyword_fn)) ?? continue;
18401829 const fn_proto = try self.createToDestNode(arena, dest_ptr, ast.NodeFnProto,
18411830 ast.NodeFnProto {
18421831 .base = undefined,
......@@ -1867,8 +1856,8 @@ pub const Parser = struct {
18671856 }
18681857 break :blk true;
18691858 };
1870 _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue;
1871 const template = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue;
1859 _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue;
1860 const template = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue;
18721861 // TODO parse template
18731862
18741863 const node = try self.createToDestNode(arena, dest_ptr, ast.NodeAsm,
......@@ -1964,11 +1953,11 @@ pub const Parser = struct {
19641953 stack.append(State { .AsmOutputItems = items }) catch unreachable;
19651954 try stack.append(State { .IfToken = Token.Id.Comma });
19661955
1967 const symbolic_name = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
1968 _ = (try self.eatToken(&stack, Token.Id.RBracket)) ?? continue;
1969 const constraint = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue;
1956 const symbolic_name = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
1957 _ = (try self.expectToken(&stack, Token.Id.RBracket)) ?? continue;
1958 const constraint = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue;
19701959
1971 _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue;
1960 _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue;
19721961 try stack.append(State { .ExpectToken = Token.Id.RParen });
19731962
19741963 const node = try self.createNode(arena, ast.NodeAsmOutput,
......@@ -2009,11 +1998,11 @@ pub const Parser = struct {
20091998 stack.append(State { .AsmInputItems = items }) catch unreachable;
20101999 try stack.append(State { .IfToken = Token.Id.Comma });
20112000
2012 const symbolic_name = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
2013 _ = (try self.eatToken(&stack, Token.Id.RBracket)) ?? continue;
2014 const constraint = (try self.eatToken(&stack, Token.Id.StringLiteral)) ?? continue;
2001 const symbolic_name = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
2002 _ = (try self.expectToken(&stack, Token.Id.RBracket)) ?? continue;
2003 const constraint = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue;
20152004
2016 _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue;
2005 _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue;
20172006 try stack.append(State { .ExpectToken = Token.Id.RParen });
20182007
20192008 const node = try self.createNode(arena, ast.NodeAsmInput,
......@@ -2055,12 +2044,10 @@ pub const Parser = struct {
20552044 },
20562045
20572046 State.FieldInitListItemOrEnd => |list_state| {
2058 var token = self.getNextToken();
2059 if (token.id == Token.Id.RBrace){
2060 *list_state.ptr = token;
2047 if (self.eatToken(Token.Id.RBrace)) |rbrace| {
2048 *list_state.ptr = rbrace;
20612049 continue;
20622050 }
2063 self.putBackToken(token);
20642051
20652052 const node = try self.createNode(arena, ast.NodeFieldInitializer,
20662053 ast.NodeFieldInitializer {
......@@ -2090,12 +2077,10 @@ pub const Parser = struct {
20902077 },
20912078
20922079 State.SwitchCaseOrEnd => |list_state| {
2093 var token = self.getNextToken();
2094 if (token.id == Token.Id.RBrace){
2095 *list_state.ptr = token;
2080 if (self.eatToken(Token.Id.RBrace)) |rbrace| {
2081 *list_state.ptr = rbrace;
20962082 continue;
20972083 }
2098 self.putBackToken(token);
20992084
21002085 const node = try self.createNode(arena, ast.NodeSwitchCase,
21012086 ast.NodeSwitchCase {
......@@ -2112,12 +2097,12 @@ pub const Parser = struct {
21122097
21132098 const maybe_else = self.getNextToken();
21142099 if (maybe_else.id == Token.Id.Keyword_else) {
2115 const else_node = try arena.create(ast.NodeSwitchElse);
2116 *else_node = ast.NodeSwitchElse {
2117 .base = self.initNode(ast.Node.Id.SwitchElse),
2100 const else_node = try self.createAttachNode(arena, &node.items, ast.NodeSwitchElse,
2101 ast.NodeSwitchElse {
2102 .base = undefined,
21182103 .token = maybe_else,
2119 };
2120 try node.items.append(&else_node.base);
2104 }
2105 );
21212106 try stack.append(State { .ExpectToken = Token.Id.EqualAngleBracketRight });
21222107 continue;
21232108 } else {
......@@ -2186,7 +2171,7 @@ pub const Parser = struct {
21862171 continue;
21872172 }
21882173
2189 _ = (try self.eatToken(&stack, Token.Id.LParen)) ?? continue;
2174 _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue;
21902175 stack.append(State { .ExpectToken = Token.Id.RParen }) catch unreachable;
21912176 try stack.append(State { .AssignmentExpressionBegin = DestPtr { .NullableField = dest } });
21922177 },
......@@ -2232,8 +2217,8 @@ pub const Parser = struct {
22322217 continue;
22332218 }
22342219
2235 const error_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
2236 const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue;
2220 const error_symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
2221 const rpipe = (try self.expectToken(&stack, Token.Id.Pipe)) ?? continue;
22372222 *dest = try self.createNode(arena, ast.NodePayload,
22382223 ast.NodePayload {
22392224 .base = undefined,
......@@ -2261,8 +2246,8 @@ pub const Parser = struct {
22612246 }
22622247 };
22632248
2264 const value_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
2265 const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue;
2249 const value_symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
2250 const rpipe = (try self.expectToken(&stack, Token.Id.Pipe)) ?? continue;
22662251 *dest = try self.createNode(arena, ast.NodePointerPayload,
22672252 ast.NodePointerPayload {
22682253 .base = undefined,
......@@ -2291,7 +2276,7 @@ pub const Parser = struct {
22912276 }
22922277 };
22932278
2294 const value_symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
2279 const value_symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
22952280 const index_symbol = blk: {
22962281 const comma = self.getNextToken();
22972282 if (comma.id != Token.Id.Comma) {
......@@ -2299,11 +2284,11 @@ pub const Parser = struct {
22992284 break :blk null;
23002285 }
23012286
2302 const symbol = (try self.eatToken(&stack, Token.Id.Identifier)) ?? continue;
2287 const symbol = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue;
23032288 break :blk try self.createLiteral(arena, ast.NodeIdentifier, symbol);
23042289 };
23052290
2306 const rpipe = (try self.eatToken(&stack, Token.Id.Pipe)) ?? continue;
2291 const rpipe = (try self.expectToken(&stack, Token.Id.Pipe)) ?? continue;
23072292 *dest = try self.createNode(arena, ast.NodePointerIndexPayload,
23082293 ast.NodePointerIndexPayload {
23092294 .base = undefined,
......@@ -2370,11 +2355,9 @@ pub const Parser = struct {
23702355 },
23712356
23722357 State.FnProtoAlign => |fn_proto| {
2373 const token = self.getNextToken();
2374 if (token.id == Token.Id.Keyword_align) {
2358 if (self.eatToken(Token.Id.Keyword_align)) |align_token| {
23752359 @panic("TODO fn proto align");
23762360 }
2377 self.putBackToken(token);
23782361 stack.append(State {
23792362 .FnProtoReturnType = fn_proto,
23802363 }) catch unreachable;
......@@ -2389,6 +2372,11 @@ pub const Parser = struct {
23892372 stack.append(State {
23902373 .TypeExprBegin = DestPtr {.Field = &fn_proto.return_type.InferErrorSet},
23912374 }) catch unreachable;
2375 continue;
2376 },
2377 Token.Id.Keyword_align => {
2378 @panic("TODO fn proto align");
2379 continue;
23922380 },
23932381 else => {
23942382 self.putBackToken(token);
......@@ -2396,17 +2384,13 @@ pub const Parser = struct {
23962384 stack.append(State {
23972385 .TypeExprBegin = DestPtr {.Field = &fn_proto.return_type.Explicit},
23982386 }) catch unreachable;
2387 continue;
23992388 },
24002389 }
2401 if (token.id == Token.Id.Keyword_align) {
2402 @panic("TODO fn proto align");
2403 }
2404 continue;
24052390 },
24062391
24072392 State.ParamDecl => |fn_proto| {
2408 var token = self.getNextToken();
2409 if (token.id == Token.Id.RParen) {
2393 if (self.eatToken(Token.Id.RParen)) |_| {
24102394 continue;
24112395 }
24122396 const param_decl = try self.createAttachNode(arena, &fn_proto.params, ast.NodeParamDecl,
......@@ -2419,28 +2403,22 @@ pub const Parser = struct {
24192403 .var_args_token = null,
24202404 },
24212405 );
2422 if (token.id == Token.Id.Keyword_comptime) {
2423 param_decl.comptime_token = token;
2424 token = self.getNextToken();
2425 } else if (token.id == Token.Id.Keyword_noalias) {
2426 param_decl.noalias_token = token;
2427 token = self.getNextToken();
2406 if (self.eatToken(Token.Id.Keyword_comptime)) |comptime_token| {
2407 param_decl.comptime_token = comptime_token;
2408 } else if (self.eatToken(Token.Id.Keyword_noalias)) |noalias_token| {
2409 param_decl.noalias_token = noalias_token;
24282410 }
2429 if (token.id == Token.Id.Identifier) {
2430 const next_token = self.getNextToken();
2431 if (next_token.id == Token.Id.Colon) {
2432 param_decl.name_token = token;
2433 token = self.getNextToken();
2411 if (self.eatToken(Token.Id.Identifier)) |identifier| {
2412 if (self.eatToken(Token.Id.Colon)) |_| {
2413 param_decl.name_token = identifier;
24342414 } else {
2435 self.putBackToken(next_token);
2415 self.putBackToken(identifier);
24362416 }
24372417 }
2438 if (token.id == Token.Id.Ellipsis3) {
2439 param_decl.var_args_token = token;
2418 if (self.eatToken(Token.Id.Ellipsis3)) |ellipsis3| {
2419 param_decl.var_args_token = ellipsis3;
24402420 stack.append(State { .ExpectToken = Token.Id.RParen }) catch unreachable;
24412421 continue;
2442 } else {
2443 self.putBackToken(token);
24442422 }
24452423
24462424 stack.append(State { .ParamDecl = fn_proto }) catch unreachable;
......@@ -2736,7 +2714,7 @@ pub const Parser = struct {
27362714 State.Semicolon => |node_ptr| {
27372715 const node = *node_ptr;
27382716 if (requireSemiColon(node)) {
2739 _ = (try self.eatToken(&stack, Token.Id.Semicolon)) ?? continue;
2717 _ = (try self.expectToken(&stack, Token.Id.Semicolon)) ?? continue;
27402718 }
27412719 }
27422720 }
......@@ -2923,18 +2901,17 @@ pub const Parser = struct {
29232901 };
29242902 }
29252903
2926 fn initNode(self: &Parser, id: ast.Node.Id) ast.Node {
2927 if (self.pending_line_comment_node) |comment_node| {
2928 self.pending_line_comment_node = null;
2929 return ast.Node {.id = id, .comment = comment_node};
2930 }
2931 return ast.Node {.id = id, .comment = null };
2932 }
2933
29342904 fn createNode(self: &Parser, arena: &mem.Allocator, comptime T: type, init_to: &const T) !&T {
29352905 const node = try arena.create(T);
29362906 *node = *init_to;
2937 node.base = self.initNode(ast.Node.typeToId(T));
2907 node.base = blk: {
2908 const id = ast.Node.typeToId(T);
2909 if (self.pending_line_comment_node) |comment_node| {
2910 self.pending_line_comment_node = null;
2911 break :blk ast.Node {.id = id, .comment = comment_node};
2912 }
2913 break :blk ast.Node {.id = id, .comment = null };
2914 };
29382915
29392916 return node;
29402917 }
......@@ -2986,15 +2963,6 @@ pub const Parser = struct {
29862963 };
29872964 }
29882965
2989 fn eatToken(self: &Parser, stack: &ArrayList(State), id: @TagType(Token.Id)) !?Token {
2990 const token = self.getNextToken();
2991 if (token.id != id) {
2992 try self.parseError(stack, token, "expected {}, found {}", @tagName(id), @tagName(token.id));
2993 return null;
2994 }
2995 return token;
2996 }
2997
29982966 fn revertIfOptional(self: &Parser, stack: &ArrayList(State)) !void {
29992967 while (stack.popOrNull()) |state| {
30002968 switch (state) {
......@@ -3011,6 +2979,22 @@ pub const Parser = struct {
30112979 return error.NoOptionalStateFound;
30122980 }
30132981
2982 fn expectToken(self: &Parser, stack: &ArrayList(State), id: @TagType(Token.Id)) !?Token {
2983 const token = self.getNextToken();
2984 if (token.id != id) {
2985 try self.parseError(stack, token, "expected {}, found {}", @tagName(id), @tagName(token.id));
2986 return null;
2987 }
2988 return token;
2989 }
2990
2991 fn eatToken(self: &Parser, id: @TagType(Token.Id)) ?Token {
2992 if (self.isPeekToken(id)) {
2993 return self.getNextToken();
2994 }
2995 return null;
2996 }
2997
30142998 fn putBackToken(self: &Parser, token: &const Token) void {
30152999 self.put_back_tokens[self.put_back_count] = *token;
30163000 self.put_back_count += 1;
......@@ -3027,6 +3011,12 @@ pub const Parser = struct {
30273011 }
30283012 }
30293013
3014 fn isPeekToken(self: &Parser, id: @TagType(Token.Id)) bool {
3015 const token = self.getNextToken();
3016 defer self.putBackToken(token);
3017 return id == token.id;
3018 }
3019
30303020 const RenderAstFrame = struct {
30313021 node: &ast.Node,
30323022 indent: usize,