authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-09 12:51:18+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-09 12:51:18+02:00
logc19f5a2356b441e3dde95e85e029fec6ef4f836d
tree35c83611aec9775dc3018ac709f53fb726c38487
parent7dd55a8007c540415d3e704e490609dd86bea924

std.zig.parser now parses if statements


2 files changed, 137 insertions(+), 11 deletions(-)

std/zig/ast.zig+47
......@@ -29,6 +29,7 @@ pub const Node = struct {
2929 SwitchElse,
3030 While,
3131 For,
32 If,
3233 InfixOp,
3334 PrefixOp,
3435 SuffixOp,
......@@ -73,6 +74,7 @@ pub const Node = struct {
7374 Id.SwitchElse => @fieldParentPtr(NodeSwitchElse, "base", base).iterate(index),
7475 Id.While => @fieldParentPtr(NodeWhile, "base", base).iterate(index),
7576 Id.For => @fieldParentPtr(NodeFor, "base", base).iterate(index),
77 Id.If => @fieldParentPtr(NodeIf, "base", base).iterate(index),
7678 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index),
7779 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),
7880 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index),
......@@ -118,6 +120,7 @@ pub const Node = struct {
118120 Id.SwitchElse => @fieldParentPtr(NodeSwitchElse, "base", base).firstToken(),
119121 Id.While => @fieldParentPtr(NodeWhile, "base", base).firstToken(),
120122 Id.For => @fieldParentPtr(NodeFor, "base", base).firstToken(),
123 Id.If => @fieldParentPtr(NodeIf, "base", base).firstToken(),
121124 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(),
122125 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(),
123126 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(),
......@@ -163,6 +166,7 @@ pub const Node = struct {
163166 Id.SwitchElse => @fieldParentPtr(NodeSwitchElse, "base", base).lastToken(),
164167 Id.While => @fieldParentPtr(NodeWhile, "base", base).lastToken(),
165168 Id.For => @fieldParentPtr(NodeFor, "base", base).lastToken(),
169 Id.If => @fieldParentPtr(NodeIf, "base", base).lastToken(),
166170 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(),
167171 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(),
168172 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(),
......@@ -867,6 +871,49 @@ pub const NodeFor = struct {
867871 }
868872};
869873
874pub const NodeIf = struct {
875 base: Node,
876 if_token: Token,
877 condition: &Node,
878 payload: ?&NodeValuePayload,
879 body: &Node,
880 @"else": ?&NodeElse,
881
882 pub fn iterate(self: &NodeIf, index: usize) ?&Node {
883 var i = index;
884
885 if (i < 1) return self.condition;
886 i -= 1;
887
888 if (self.payload) |payload| {
889 if (i < 1) return &payload.base;
890 i -= 1;
891 }
892
893 if (i < 1) return self.body;
894 i -= 1;
895
896 if (self.@"else") |@"else"| {
897 if (i < 1) return &@"else".base;
898 i -= 1;
899 }
900
901 return null;
902 }
903
904 pub fn firstToken(self: &NodeIf) Token {
905 return self.if_token;
906 }
907
908 pub fn lastToken(self: &NodeIf) Token {
909 if (self.@"else") |@"else"| {
910 return @"else".body.lastToken();
911 }
912
913 return self.body.lastToken();
914 }
915};
916
870917pub const NodeInfixOp = struct {
871918 base: Node,
872919 op_token: Token,
std/zig/parser.zig+90-11
......@@ -1449,7 +1449,24 @@ pub const Parser = struct {
14491449 @panic("TODO: inline asm");
14501450 },
14511451 Token.Id.Keyword_if => {
1452 @panic("TODO: inline if");
1452 const node = try arena.create(ast.NodeIf);
1453 *node = ast.NodeIf {
1454 .base = self.initNode(ast.Node.Id.If),
1455 .if_token = token,
1456 .condition = undefined,
1457 .payload = null,
1458 .body = undefined,
1459 .@"else" = null,
1460 };
1461 dest_ptr.store(&node.base);
1462
1463 stack.append(State { .Else = &node.@"else" }) catch unreachable;
1464 try stack.append(State { .Expression = DestPtr { .Field = &node.body } });
1465 try stack.append(State { .ValuePayload = &node.payload });
1466 try stack.append(State { .ExpectToken = Token.Id.RParen });
1467 try stack.append(State { .Expression = DestPtr { .Field = &node.condition } });
1468 try stack.append(State { .ExpectToken = Token.Id.LParen });
1469 continue;
14531470 },
14541471 Token.Id.Keyword_inline => {
14551472 stack.append(State {
......@@ -2188,6 +2205,15 @@ pub const Parser = struct {
21882205
21892206 n = for_node.body;
21902207 },
2208 ast.Node.Id.If => {
2209 const if_node = @fieldParentPtr(ast.NodeIf, "base", n);
2210 if (if_node.@"else") |@"else"| {
2211 n = @"else".base;
2212 continue;
2213 }
2214
2215 n = if_node.body;
2216 },
21912217 ast.Node.Id.Else => {
21922218 const else_node = @fieldParentPtr(ast.NodeElse, "base", n);
21932219 n = else_node.body;
......@@ -3363,14 +3389,19 @@ pub const Parser = struct {
33633389 const else_node = @fieldParentPtr(ast.NodeElse, "base", base);
33643390 try stream.print("{} ", self.tokenizer.getTokenSlice(else_node.else_token));
33653391
3366 if (else_node.body.id == ast.Node.Id.Block) {
3367 try stack.append(RenderState { .Expression = else_node.body });
3368 } else {
3369 try stack.append(RenderState { .Indent = indent });
3370 try stack.append(RenderState { .Expression = else_node.body });
3371 try stack.append(RenderState.PrintIndent);
3372 try stack.append(RenderState { .Indent = indent + indent_delta });
3373 try stack.append(RenderState { .Text = "\n" });
3392 switch (else_node.body.id) {
3393 ast.Node.Id.Block, ast.Node.Id.If,
3394 ast.Node.Id.For, ast.Node.Id.While,
3395 ast.Node.Id.Switch => {
3396 try stack.append(RenderState { .Expression = else_node.body });
3397 },
3398 else => {
3399 try stack.append(RenderState { .Indent = indent });
3400 try stack.append(RenderState { .Expression = else_node.body });
3401 try stack.append(RenderState.PrintIndent);
3402 try stack.append(RenderState { .Indent = indent + indent_delta });
3403 try stack.append(RenderState { .Text = "\n" });
3404 }
33743405 }
33753406
33763407 if (else_node.payload) |payload| {
......@@ -3396,6 +3427,7 @@ pub const Parser = struct {
33963427 if (while_node.body.id == ast.Node.Id.Block) {
33973428 try stack.append(RenderState { .Text = " " });
33983429 } else {
3430 try stack.append(RenderState.PrintIndent);
33993431 try stack.append(RenderState { .Text = "\n" });
34003432 }
34013433 }
......@@ -3445,6 +3477,7 @@ pub const Parser = struct {
34453477 if (for_node.body.id == ast.Node.Id.Block) {
34463478 try stack.append(RenderState { .Text = " " });
34473479 } else {
3480 try stack.append(RenderState.PrintIndent);
34483481 try stack.append(RenderState { .Text = "\n" });
34493482 }
34503483 }
......@@ -3469,6 +3502,53 @@ pub const Parser = struct {
34693502 try stack.append(RenderState { .Expression = for_node.array_expr });
34703503 try stack.append(RenderState { .Text = "(" });
34713504 },
3505 ast.Node.Id.If => {
3506 const if_node = @fieldParentPtr(ast.NodeIf, "base", base);
3507 try stream.print("{} ", self.tokenizer.getTokenSlice(if_node.if_token));
3508
3509 switch (if_node.body.id) {
3510 ast.Node.Id.Block, ast.Node.Id.If,
3511 ast.Node.Id.For, ast.Node.Id.While,
3512 ast.Node.Id.Switch => {
3513 if (if_node.@"else") |@"else"| {
3514 try stack.append(RenderState { .Expression = &@"else".base });
3515
3516 if (if_node.body.id == ast.Node.Id.Block) {
3517 try stack.append(RenderState { .Text = " " });
3518 } else {
3519 try stack.append(RenderState.PrintIndent);
3520 try stack.append(RenderState { .Text = "\n" });
3521 }
3522 }
3523 },
3524 else => {
3525 if (if_node.@"else") |@"else"| {
3526 try stack.append(RenderState { .Expression = @"else".body });
3527
3528 if (@"else".payload) |payload| {
3529 try stack.append(RenderState { .Text = " " });
3530 try stack.append(RenderState { .Expression = &payload.base });
3531 }
3532
3533 try stack.append(RenderState { .Text = " " });
3534 try stack.append(RenderState { .Text = self.tokenizer.getTokenSlice(@"else".else_token) });
3535 try stack.append(RenderState { .Text = " " });
3536 }
3537 }
3538 }
3539
3540 try stack.append(RenderState { .Expression = if_node.body });
3541 try stack.append(RenderState { .Text = " " });
3542
3543 if (if_node.payload) |payload| {
3544 try stack.append(RenderState { .Expression = &payload.base });
3545 try stack.append(RenderState { .Text = " " });
3546 }
3547
3548 try stack.append(RenderState { .Text = ")" });
3549 try stack.append(RenderState { .Expression = if_node.condition });
3550 try stack.append(RenderState { .Text = "(" });
3551 },
34723552
34733553 ast.Node.Id.StructField,
34743554 ast.Node.Id.UnionTag,
......@@ -4210,8 +4290,7 @@ test "zig fmt: if" {
42104290 \\ unreachable;
42114291 \\ }
42124292 \\
4213 \\ if (10 < 0)
4214 \\ unreachable;
4293 \\ if (10 < 0) unreachable;
42154294 \\
42164295 \\ if (10 < 0) {
42174296 \\ unreachable;