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 {
2121 ParamDecl,
2222 Block,
2323 Defer,
24 Comptime,
2425 ErrorPayload,
2526 ValuePayload,
2627 ValueIndexPayload,
......@@ -67,6 +68,7 @@ pub const Node = struct {
6768 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
6869 Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index),
6970 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index),
71 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).iterate(index),
7072 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index),
7173 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index),
7274 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index),
......@@ -114,6 +116,7 @@ pub const Node = struct {
114116 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
115117 Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(),
116118 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(),
119 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).firstToken(),
117120 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(),
118121 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(),
119122 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(),
......@@ -161,6 +164,7 @@ pub const Node = struct {
161164 Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
162165 Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(),
163166 Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(),
167 Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).lastToken(),
164168 Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(),
165169 Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(),
166170 Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(),
......@@ -606,6 +610,29 @@ pub const NodeDefer = struct {
606610 }
607611};
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
609636pub const NodeErrorPayload = struct {
610637 base: Node,
611638 lpipe: Token,
std/zig/parser.zig+40-2
......@@ -309,6 +309,18 @@ pub const Parser = struct {
309309 });
310310 continue;
311311 },
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 },
312324 else => {
313325 self.putBackToken(token);
314326 stack.append(State.TopLevel) catch unreachable;
......@@ -1523,7 +1535,15 @@ pub const Parser = struct {
15231535 try stack.append(State { .ExpectToken = Token.Id.LParen });
15241536 },
15251537 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;
15271547 },
15281548 else => {
15291549 try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id));
......@@ -2131,7 +2151,10 @@ pub const Parser = struct {
21312151 continue;
21322152 } else {
21332153 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 } });
21352158 }
21362159 },
21372160 Token.Id.Keyword_var, Token.Id.Keyword_const => {
......@@ -2240,6 +2263,10 @@ pub const Parser = struct {
22402263 const defer_node = @fieldParentPtr(ast.NodeDefer, "base", n);
22412264 n = defer_node.expr;
22422265 },
2266 ast.Node.Id.Comptime => {
2267 const comptime_node = @fieldParentPtr(ast.NodeComptime, "base", n);
2268 n = comptime_node.expr;
2269 },
22432270 else => return true,
22442271 }
22452272 }
......@@ -2824,6 +2851,12 @@ pub const Parser = struct {
28242851 try stack.append(RenderState { .Expression = value});
28252852 }
28262853 },
2854 ast.Node.Id.Comptime => {
2855 if (requireSemiColon(decl)) {
2856 try stack.append(RenderState { .Text = ";" });
2857 }
2858 try stack.append(RenderState { .Expression = decl });
2859 },
28272860 else => unreachable,
28282861 }
28292862 },
......@@ -2939,6 +2972,11 @@ pub const Parser = struct {
29392972 try stream.print("{} ", self.tokenizer.getTokenSlice(defer_node.defer_token));
29402973 try stack.append(RenderState { .Expression = defer_node.expr });
29412974 },
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 },
29422980 ast.Node.Id.InfixOp => {
29432981 const prefix_op_node = @fieldParentPtr(ast.NodeInfixOp, "base", base);
29442982 try stack.append(RenderState { .Expression = prefix_op_node.rhs });