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 {
1818 InfixOp,
1919 PrefixOp,
2020 SuffixOp,
21 GroupedExpression,
2122 FieldInitializer,
2223 IntegerLiteral,
2324 FloatLiteral,
......@@ -46,6 +47,7 @@ pub const Node = struct {
4647 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).iterate(index),
4748 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).iterate(index),
4849 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).iterate(index),
50 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).iterate(index),
4951 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).iterate(index),
5052 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).iterate(index),
5153 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).iterate(index),
......@@ -75,6 +77,7 @@ pub const Node = struct {
7577 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).firstToken(),
7678 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).firstToken(),
7779 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).firstToken(),
80 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).firstToken(),
7881 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).firstToken(),
7982 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).firstToken(),
8083 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).firstToken(),
......@@ -104,6 +107,7 @@ pub const Node = struct {
104107 Id.InfixOp => @fieldParentPtr(NodeInfixOp, "base", base).lastToken(),
105108 Id.PrefixOp => @fieldParentPtr(NodePrefixOp, "base", base).lastToken(),
106109 Id.SuffixOp => @fieldParentPtr(NodeSuffixOp, "base", base).lastToken(),
110 Id.GroupedExpression => @fieldParentPtr(NodeGroupedExpression, "base", base).lastToken(),
107111 Id.FieldInitializer => @fieldParentPtr(NodeFieldInitializer, "base", base).lastToken(),
108112 Id.IntegerLiteral => @fieldParentPtr(NodeIntegerLiteral, "base", base).lastToken(),
109113 Id.FloatLiteral => @fieldParentPtr(NodeFloatLiteral, "base", base).lastToken(),
......@@ -624,6 +628,30 @@ pub const NodeSuffixOp = struct {
624628 }
625629};
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
627655pub const NodeIntegerLiteral = struct {
628656 base: Node,
629657 token: Token,
std/zig/parser.zig+71-44
......@@ -594,6 +594,27 @@ pub const Parser = struct {
594594 try stack.append(State.AfterOperand);
595595 continue;
596596 },
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
598619 else => return self.parseError(token, "expected primary expression, found {}", @tagName(token.id)),
599620 }
......@@ -1770,6 +1791,12 @@ pub const Parser = struct {
17701791
17711792 try stack.append(RenderState { .Expression = suffix_op.lhs });
17721793 },
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 },
17731800 ast.Node.Id.FieldInitializer => {
17741801 const field_init = @fieldParentPtr(ast.NodeFieldInitializer, "base", base);
17751802 try stream.print(".{} = ", self.tokenizer.getTokenSlice(field_init.name_token));
......@@ -2240,50 +2267,6 @@ test "zig fmt: indexing" {
22402267 );
22412268}
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
22872270test "zig fmt: struct declaration" {
22882271 try testCanonical(
22892272 \\const S = struct {
......@@ -2682,6 +2665,50 @@ test "zig fmt: coroutines" {
26822665 );
26832666}
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
26852712test "zig fmt: zig fmt" {
26862713 try testCanonical(@embedFile("ast.zig"));
26872714 try testCanonical(@embedFile("index.zig"));