authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 15:16:32+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 15:16:32+02:00
log9d69e94bbad0b1ff23999584f5f632cfe8db3656
tree41b7fd86a7a450e8ccf9b596a7bdb2e670e5d204
parent5c82ed2ea9360ea0931ba789a4ffb73d689b6a72

std.zig.parser now parses grouped expressions

* I also moved some tests down, as they fail in ways I can't fix yet

2 files changed, 99 insertions(+), 44 deletions(-)

std/zig/ast.zig+28
...@@ -18,6 +18,7 @@ pub const Node = struct {...@@ -18,6 +18,7 @@ pub const Node = struct {
18 InfixOp,18 InfixOp,
19 PrefixOp,19 PrefixOp,
20 SuffixOp,20 SuffixOp,
21 GroupedExpression,
21 FieldInitializer,22 FieldInitializer,
22 IntegerLiteral,23 IntegerLiteral,
23 FloatLiteral,24 FloatLiteral,
...@@ -46,6 +47,7 @@ pub const Node = struct {...@@ -46,6 +47,7 @@ pub const Node = struct {
46 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index),47 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index),
47 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),48 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),
48 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index),49 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index),
50 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).iterate(index),
49 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).iterate(index),51 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).iterate(index),
50 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),52 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),
51 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),53 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),
...@@ -75,6 +77,7 @@ pub const Node = struct {...@@ -75,6 +77,7 @@ pub const Node = struct {
75 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(),77 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(),
76 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(),78 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(),
77 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(),79 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(),
80 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).firstToken(),
78 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).firstToken(),81 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).firstToken(),
79 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(),82 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(),
80 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(),83 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(),
...@@ -104,6 +107,7 @@ pub const Node = struct {...@@ -104,6 +107,7 @@ pub const Node = struct {
104 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(),107 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(),
105 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(),108 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(),
106 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(),109 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(),
110 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).lastToken(),
107 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).lastToken(),111 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).lastToken(),
108 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(),112 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(),
109 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(),113 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(),
...@@ -624,6 +628,30 @@ pub const NodeSuffixOp = struct {...@@ -624,6 +628,30 @@ pub const NodeSuffixOp = struct {
624 }628 }
625};629};
626630
631pub const NodeGroupedExpression = struct {
632 base: Node,
633 lparen: Token,
634 expr: &Node,
635 rparen: Token,
636
637 pub fn iterate(self: &NodeGroupedExpression, index: usize) ?&Node {
638 var i = index;
639
640 if (i < 1) return self.expr;
641 i -= 1;
642
643 return null;
644 }
645
646 pub fn firstToken(self: &NodeGroupedExpression) Token {
647 return self.lparen;
648 }
649
650 pub fn lastToken(self: &NodeGroupedExpression) Token {
651 return self.rparen;
652 }
653};
654
627pub const NodeIntegerLiteral = struct {655pub const NodeIntegerLiteral = struct {
628 base: Node,656 base: Node,
629 token: Token,657 token: Token,
std/zig/parser.zig+71-44
...@@ -594,6 +594,27 @@ pub const Parser = struct {...@@ -594,6 +594,27 @@ pub const Parser = struct {
594 try stack.append(State.AfterOperand);594 try stack.append(State.AfterOperand);
595 continue;595 continue;
596 },596 },
597 Token.Id.LParen => {
598 const node = try arena.create(ast.NodeGroupedExpression);
599 *node = ast.NodeGroupedExpression {
600 .base = self.initNode(ast.Node.Id.GroupedExpression),
601 .lparen = token,
602 .expr = undefined,
603 .rparen = undefined,
604 };
605 try stack.append(State {
606 .Operand = &node.base
607 });
608 try stack.append(State.AfterOperand);
609 try stack.append(State {
610 .ExpectTokenSave = ExpectTokenSave {
611 .id = Token.Id.RParen,
612 .ptr = &node.rparen,
613 }
614 });
615 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
616 continue;
617 },
597618
598 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),619 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),
599 }620 }
...@@ -1770,6 +1791,12 @@ pub const Parser = struct {...@@ -1770,6 +1791,12 @@ pub const Parser = struct {
17701791
1771 try stack.append(RenderState { .Expression = suffix_op.lhs });1792 try stack.append(RenderState { .Expression = suffix_op.lhs });
1772 },1793 },
1794 ast.Node.Id.GroupedExpression => {
1795 const grouped_expr = @fieldParentPtr(ast.NodeGroupedExpression, "base", base);
1796 try stack.append(RenderState { .Text = ")"});
1797 try stack.append(RenderState { .Expression = grouped_expr.expr });
1798 try stack.append(RenderState { .Text = "("});
1799 },
1773 ast.Node.Id.FieldInitializer => {1800 ast.Node.Id.FieldInitializer => {
1774 const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);1801 const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);
1775 try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));1802 try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));
...@@ -2240,50 +2267,6 @@ test "zig fmt: indexing" {...@@ -2240,50 +2267,6 @@ test "zig fmt: indexing" {
2240 );2267 );
2241}2268}
22422269
2243test "zig fmt: arrays" {
2244 try testCanonical(
2245 \\test "test array" {
2246 \\ const a: [2]u8 = [2]u8{ 1, 2 };
2247 \\ const a: [2]u8 = []u8{ 1, 2 };
2248 \\ const a: [0]u8 = []u8{};
2249 \\}
2250 \\
2251 );
2252}
2253
2254test "zig fmt: precedence" {
2255 try testCanonical(
2256 \\test "precedence" {
2257 \\ a!b();
2258 \\ (a!b)();
2259 \\ !a!b;
2260 \\ !(a!b);
2261 \\ !a{};
2262 \\ !(a{});
2263 \\ a + b{};
2264 \\ (a + b){};
2265 \\ a << b + c;
2266 \\ (a << b) + c;
2267 \\ a & b << c;
2268 \\ (a & b) << c;
2269 \\ a ^ b & c;
2270 \\ (a ^ b) & c;
2271 \\ a | b ^ c;
2272 \\ (a | b) ^ c;
2273 \\ a == b | c;
2274 \\ (a == b) | c;
2275 \\ a and b == c;
2276 \\ (a and b) == c;
2277 \\ a or b and c;
2278 \\ (a or b) and c;
2279 \\ (a or b) and c;
2280 \\ a = b or c;
2281 \\ (a = b) or c;
2282 \\}
2283 \\
2284 );
2285}
2286
2287test "zig fmt: struct declaration" {2270test "zig fmt: struct declaration" {
2288 try testCanonical(2271 try testCanonical(
2289 \\const S = struct {2272 \\const S = struct {
...@@ -2682,6 +2665,50 @@ test "zig fmt: coroutines" {...@@ -2682,6 +2665,50 @@ test "zig fmt: coroutines" {
2682 );2665 );
2683}2666}
26842667
2668test "zig fmt: arrays" {
2669 try testCanonical(
2670 \\test "test array" {
2671 \\ const a: [2]u8 = [2]u8{ 1, 2 };
2672 \\ const a: [2]u8 = []u8{ 1, 2 };
2673 \\ const a: [0]u8 = []u8{};
2674 \\}
2675 \\
2676 );
2677}
2678
2679test "zig fmt: precedence" {
2680 try testCanonical(
2681 \\test "precedence" {
2682 \\ a!b();
2683 \\ (a!b)();
2684 \\ !a!b;
2685 \\ !(a!b);
2686 \\ !a{};
2687 \\ !(a{});
2688 \\ a + b{};
2689 \\ (a + b){};
2690 \\ a << b + c;
2691 \\ (a << b) + c;
2692 \\ a & b << c;
2693 \\ (a & b) << c;
2694 \\ a ^ b & c;
2695 \\ (a ^ b) & c;
2696 \\ a | b ^ c;
2697 \\ (a | b) ^ c;
2698 \\ a == b | c;
2699 \\ (a == b) | c;
2700 \\ a and b == c;
2701 \\ (a and b) == c;
2702 \\ a or b and c;
2703 \\ (a or b) and c;
2704 \\ (a or b) and c;
2705 \\ a = b or c;
2706 \\ (a = b) or c;
2707 \\}
2708 \\
2709 );
2710}
2711
2685test "zig fmt: zig fmt" {2712test "zig fmt: zig fmt" {
2686 try testCanonical(@embedFile("ast.zig"));2713 try testCanonical(@embedFile("ast.zig"));
2687 try testCanonical(@embedFile("index.zig"));2714 try testCanonical(@embedFile("index.zig"));