| author | |
| committer | |
| log | 7d32c9521fff3d2a18293d38562636c5a0e3408e |
| tree | 8538c3c8141ab9711c34da0f55aeed2b087c670d |
| parent | d04346d2ac04c079c1722db691d1536c3d717735 |
2 files changed, 67 insertions(+), 2 deletions(-)
std/zig/ast.zig+27| ... | ... | @@ -21,6 +21,7 @@ pub const Node = struct { |
| 21 | 21 | ParamDecl, |
| 22 | 22 | Block, |
| 23 | 23 | Defer, |
| 24 | Comptime, | |
| 24 | 25 | ErrorPayload, |
| 25 | 26 | ValuePayload, |
| 26 | 27 | ValueIndexPayload, |
| ... | ... | @@ -67,6 +68,7 @@ pub const Node = struct { |
| 67 | 68 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index), |
| 68 | 69 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index), |
| 69 | 70 | Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index), |
| 71 | Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).iterate(index), | |
| 70 | 72 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index), |
| 71 | 73 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index), |
| 72 | 74 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index), |
| ... | ... | @@ -114,6 +116,7 @@ pub const Node = struct { |
| 114 | 116 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(), |
| 115 | 117 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(), |
| 116 | 118 | Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(), |
| 119 | Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).firstToken(), | |
| 117 | 120 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(), |
| 118 | 121 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(), |
| 119 | 122 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(), |
| ... | ... | @@ -161,6 +164,7 @@ pub const Node = struct { |
| 161 | 164 | Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(), |
| 162 | 165 | Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(), |
| 163 | 166 | Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(), |
| 167 | Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).lastToken(), | |
| 164 | 168 | Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(), |
| 165 | 169 | Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(), |
| 166 | 170 | Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(), |
| ... | ... | @@ -606,6 +610,29 @@ pub const NodeDefer = struct { |
| 606 | 610 | } |
| 607 | 611 | }; |
| 608 | 612 | |
| 613 | pub 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 | ||
| 609 | 636 | pub const NodeErrorPayload = struct { |
| 610 | 637 | base: Node, |
| 611 | 638 | lpipe: Token, |
std/zig/parser.zig+40-2| ... | ... | @@ -309,6 +309,18 @@ pub const Parser = struct { |
| 309 | 309 | }); |
| 310 | 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 | 324 | else => { |
| 313 | 325 | self.putBackToken(token); |
| 314 | 326 | stack.append(State.TopLevel) catch unreachable; |
| ... | ... | @@ -1523,7 +1535,15 @@ pub const Parser = struct { |
| 1523 | 1535 | try stack.append(State { .ExpectToken = Token.Id.LParen }); |
| 1524 | 1536 | }, |
| 1525 | 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 | 1548 | else => { |
| 1529 | 1549 | try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id)); |
| ... | ... | @@ -2131,7 +2151,10 @@ pub const Parser = struct { |
| 2131 | 2151 | continue; |
| 2132 | 2152 | } else { |
| 2133 | 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 | 2160 | Token.Id.Keyword_var, Token.Id.Keyword_const => { |
| ... | ... | @@ -2240,6 +2263,10 @@ pub const Parser = struct { |
| 2240 | 2263 | const defer_node = @fieldParentPtr(ast.NodeDefer, "base", n); |
| 2241 | 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 | 2270 | else => return true, |
| 2244 | 2271 | } |
| 2245 | 2272 | } |
| ... | ... | @@ -2824,6 +2851,12 @@ pub const Parser = struct { |
| 2824 | 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 | 2860 | else => unreachable, |
| 2828 | 2861 | } |
| 2829 | 2862 | }, |
| ... | ... | @@ -2939,6 +2972,11 @@ pub const Parser = struct { |
| 2939 | 2972 | try stream.print("{} ", self.tokenizer.getTokenSlice(defer_node.defer_token)); |
| 2940 | 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 | 2980 | ast.Node.Id.InfixOp => { |
| 2943 | 2981 | const prefix_op_node = @fieldParentPtr(ast.NodeInfixOp, "base", base); |
| 2944 | 2982 | try stack.append(RenderState { .Expression = prefix_op_node.rhs }); |