| 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,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 | }; |
| 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 | pub const NodeErrorPayload = struct { | 636 | pub 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 }); |