authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-09 13:24:47+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-09 13:24:47+02:00
log7d32c9521fff3d2a18293d38562636c5a0e3408e
tree8538c3c8141ab9711c34da0f55aeed2b087c670d
parentd04346d2ac04c079c1722db691d1536c3d717735

std.zig.parser now parses comptime


2 files changed, 67 insertions(+), 2 deletions(-)

std/zig/ast.zig+27
...@@ -21,6 +21,7 @@ pub const Node = struct {...@@ -21,6 +21,7 @@ pub const Node = struct {
21 ParamDecl,21 ParamDecl,
22 Block,22 Block,
23 Defer,23 Defer,
24 Comptime,
24 ErrorPayload,25 ErrorPayload,
25 ValuePayload,26 ValuePayload,
26 ValueIndexPayload,27 ValueIndexPayload,
...@@ -67,6 +68,7 @@ pub const Node = struct {...@@ -67,6 +68,7 @@ pub const Node = struct {
67 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),68 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
68 Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index),69 Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index),
69 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index),70 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index),
71 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).iterate(index),
70 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index),72 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index),
71 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index),73 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index),
72 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index),74 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index),
...@@ -114,6 +116,7 @@ pub const Node = struct {...@@ -114,6 +116,7 @@ pub const Node = struct {
114 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),116 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
115 Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(),117 Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(),
116 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(),118 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(),
119 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).firstToken(),
117 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(),120 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(),
118 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(),121 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(),
119 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(),122 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(),
...@@ -161,6 +164,7 @@ pub const Node = struct {...@@ -161,6 +164,7 @@ pub const Node = struct {
161 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),164 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
162 Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(),165 Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(),
163 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(),166 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(),
167 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).lastToken(),
164 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(),168 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(),
165 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(),169 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(),
166 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(),170 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(),
...@@ -606,6 +610,29 @@ pub const NodeDefer = struct {...@@ -606,6 +610,29 @@ pub const NodeDefer = struct {
606 }610 }
607};611};
608612
613pub const NodeComptime = struct {
614 base: Node,
615 comptime_token: Token,
616 expr: &Node,
617
618 pub fn iterate(self: &NodeComptime, index: usize) ?&Node {
619 var i = index;
620
621 if (i < 1) return self.expr;
622 i -= 1;
623
624 return null;
625 }
626
627 pub fn firstToken(self: &NodeComptime) Token {
628 return self.comptime_token;
629 }
630
631 pub fn lastToken(self: &NodeComptime) Token {
632 return self.expr.lastToken();
633 }
634};
635
609pub const NodeErrorPayload = struct {636pub const NodeErrorPayload = struct {
610 base: Node,637 base: Node,
611 lpipe: Token,638 lpipe: Token,
std/zig/parser.zig+40-2
...@@ -309,6 +309,18 @@ pub const Parser = struct {...@@ -309,6 +309,18 @@ pub const Parser = struct {
309 });309 });
310 continue;310 continue;
311 },311 },
312 Token.Id.Keyword_comptime => {
313 const node = try arena.create(ast.NodeComptime);
314 *node = ast.NodeComptime {
315 .base = self.initNode(ast.Node.Id.Comptime),
316 .comptime_token = token,
317 .expr = undefined,
318 };
319 try root_node.decls.append(&node.base);
320 stack.append(State.TopLevel) catch unreachable;
321 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
322 continue;
323 },
312 else => {324 else => {
313 self.putBackToken(token);325 self.putBackToken(token);
314 stack.append(State.TopLevel) catch unreachable;326 stack.append(State.TopLevel) catch unreachable;
...@@ -1523,7 +1535,15 @@ pub const Parser = struct {...@@ -1523,7 +1535,15 @@ pub const Parser = struct {
1523 try stack.append(State { .ExpectToken = Token.Id.LParen });1535 try stack.append(State { .ExpectToken = Token.Id.LParen });
1524 },1536 },
1525 Token.Id.Keyword_comptime => {1537 Token.Id.Keyword_comptime => {
1526 @panic("TODO: inline comptime");1538 const node = try arena.create(ast.NodeComptime);
1539 *node = ast.NodeComptime {
1540 .base = self.initNode(ast.Node.Id.Comptime),
1541 .comptime_token = token,
1542 .expr = undefined,
1543 };
1544 dest_ptr.store(&node.base);
1545 try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
1546 continue;
1527 },1547 },
1528 else => {1548 else => {
1529 try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id));1549 try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id));
...@@ -2131,7 +2151,10 @@ pub const Parser = struct {...@@ -2131,7 +2151,10 @@ pub const Parser = struct {
2131 continue;2151 continue;
2132 } else {2152 } else {
2133 self.putBackToken(mut_token);2153 self.putBackToken(mut_token);
2134 @panic("TODO: comptime block");2154 self.putBackToken(next);
2155 const statememt = try block.statements.addOne();
2156 stack.append(State { .Semicolon = statememt }) catch unreachable;
2157 try stack.append(State { .Expression = DestPtr{.Field = statememt } });
2135 }2158 }
2136 },2159 },
2137 Token.Id.Keyword_var, Token.Id.Keyword_const => {2160 Token.Id.Keyword_var, Token.Id.Keyword_const => {
...@@ -2240,6 +2263,10 @@ pub const Parser = struct {...@@ -2240,6 +2263,10 @@ pub const Parser = struct {
2240 const defer_node = @fieldParentPtr(ast.NodeDefer, "base", n);2263 const defer_node = @fieldParentPtr(ast.NodeDefer, "base", n);
2241 n = defer_node.expr;2264 n = defer_node.expr;
2242 },2265 },
2266 ast.Node.Id.Comptime => {
2267 const comptime_node = @fieldParentPtr(ast.NodeComptime, "base", n);
2268 n = comptime_node.expr;
2269 },
2243 else => return true,2270 else => return true,
2244 }2271 }
2245 }2272 }
...@@ -2824,6 +2851,12 @@ pub const Parser = struct {...@@ -2824,6 +2851,12 @@ pub const Parser = struct {
2824 try stack.append(RenderState { .Expression = value});2851 try stack.append(RenderState { .Expression = value});
2825 }2852 }
2826 },2853 },
2854 ast.Node.Id.Comptime => {
2855 if (requireSemiColon(decl)) {
2856 try stack.append(RenderState { .Text = ";" });
2857 }
2858 try stack.append(RenderState { .Expression = decl });
2859 },
2827 else => unreachable,2860 else => unreachable,
2828 }2861 }
2829 },2862 },
...@@ -2939,6 +2972,11 @@ pub const Parser = struct {...@@ -2939,6 +2972,11 @@ pub const Parser = struct {
2939 try stream.print("{} ", self.tokenizer.getTokenSlice(defer_node.defer_token));2972 try stream.print("{} ", self.tokenizer.getTokenSlice(defer_node.defer_token));
2940 try stack.append(RenderState { .Expression = defer_node.expr });2973 try stack.append(RenderState { .Expression = defer_node.expr });
2941 },2974 },
2975 ast.Node.Id.Comptime => {
2976 const comptime_node = @fieldParentPtr(ast.NodeComptime, "base", base);
2977 try stream.print("{} ", self.tokenizer.getTokenSlice(comptime_node.comptime_token));
2978 try stack.append(RenderState { .Expression = comptime_node.expr });
2979 },
2942 ast.Node.Id.InfixOp => {2980 ast.Node.Id.InfixOp => {
2943 const prefix_op_node = @fieldParentPtr(ast.NodeInfixOp, "base", base);2981 const prefix_op_node = @fieldParentPtr(ast.NodeInfixOp, "base", base);
2944 try stack.append(RenderState { .Expression = prefix_op_node.rhs });2982 try stack.append(RenderState { .Expression = prefix_op_node.rhs });