feature. See also
. The project being documented here (as the example) is the Zig library itself.
Parse.parsePrimaryExpr
fn parsePrimaryExpr(p: *Parse) !?Node.Index
File
Code
fn parsePrimaryExpr(p: *Parse) !?Node.Index {
switch (p.tokenTag(p.tok_i)) {
.keyword_asm => return try p.expectAsmExpr(),
.keyword_if => return try p.expectIf(expectExpr),
.keyword_break => {
return try p.addNode(.{
.tag = .@"break",
.main_token = p.nextToken(),
.data = .{ .opt_token_and_opt_node = .{
try p.parseBreakLabel(),
.fromOptional(try p.parseExpr()),
} },
});
},
.keyword_continue => {
return try p.addNode(.{
.tag = .@"continue",
.main_token = p.nextToken(),
.data = .{ .opt_token_and_opt_node = .{
try p.parseBreakLabel(),
.fromOptional(try p.parseExpr()),
} },
});
},
.keyword_comptime => {
return try p.addNode(.{
.tag = .@"comptime",
.main_token = p.nextToken(),
.data = .{ .node = try p.expectExpr() },
});
},
.keyword_nosuspend => {
return try p.addNode(.{
.tag = .@"nosuspend",
.main_token = p.nextToken(),
.data = .{ .node = try p.expectExpr() },
});
},
.keyword_resume => {
return try p.addNode(.{
.tag = .@"resume",
.main_token = p.nextToken(),
.data = .{ .node = try p.expectExpr() },
});
},
.keyword_return => {
return try p.addNode(.{
.tag = .@"return",
.main_token = p.nextToken(),
.data = .{ .opt_node = .fromOptional(try p.parseExpr()) },
});
},
.identifier => {
if (p.tokenTag(p.tok_i + 1) == .colon) {
switch (p.tokenTag(p.tok_i + 2)) {
.keyword_inline => {
p.tok_i += 3;
switch (p.tokenTag(p.tok_i)) {
.keyword_for => return try p.expectFor(expectExpr),
.keyword_while => return try p.expectWhileExpr(),
else => return p.fail(.expected_inlinable),
}
},
.keyword_for => {
p.tok_i += 2;
return try p.expectFor(expectExpr);
},
.keyword_while => {
p.tok_i += 2;
return try p.expectWhileExpr();
},
else => return try p.parseCurlySuffixExpr(),
}
} else {
return try p.parseCurlySuffixExpr();
}
},
.keyword_inline => {
p.tok_i += 1;
switch (p.tokenTag(p.tok_i)) {
.keyword_for => return try p.expectFor(expectExpr),
.keyword_while => return try p.expectWhileExpr(),
else => return p.fail(.expected_inlinable),
}
},
.keyword_for => return try p.expectFor(expectExpr),
.keyword_while => return try p.expectWhileExpr(),
.l_brace => return try p.parseBlock(),
else => return try p.parseCurlySuffixExpr(),
}
}