Commit 7d32c9521f

Jimmi Holst Christensen <jhc@liab.dk>
2018-04-09 13:24:47
std.zig.parser now parses comptime
1 parent d04346d
Changed files (2)
std/zig/ast.zig
@@ -21,6 +21,7 @@ pub const Node = struct {
         ParamDecl,
         Block,
         Defer,
+        Comptime,
         ErrorPayload,
         ValuePayload,
         ValueIndexPayload,
@@ -67,6 +68,7 @@ pub const Node = struct {
             Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).iterate(index),
             Id.Block => @fieldParentPtr(NodeBlock, "base", base).iterate(index),
             Id.Defer => @fieldParentPtr(NodeDefer, "base", base).iterate(index),
+            Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).iterate(index),
             Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).iterate(index),
             Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).iterate(index),
             Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).iterate(index),
@@ -114,6 +116,7 @@ pub const Node = struct {
             Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).firstToken(),
             Id.Block => @fieldParentPtr(NodeBlock, "base", base).firstToken(),
             Id.Defer => @fieldParentPtr(NodeDefer, "base", base).firstToken(),
+            Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).firstToken(),
             Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).firstToken(),
             Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).firstToken(),
             Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).firstToken(),
@@ -161,6 +164,7 @@ pub const Node = struct {
             Id.ParamDecl => @fieldParentPtr(NodeParamDecl, "base", base).lastToken(),
             Id.Block => @fieldParentPtr(NodeBlock, "base", base).lastToken(),
             Id.Defer => @fieldParentPtr(NodeDefer, "base", base).lastToken(),
+            Id.Comptime => @fieldParentPtr(NodeComptime, "base", base).lastToken(),
             Id.ErrorPayload => @fieldParentPtr(NodeErrorPayload, "base", base).lastToken(),
             Id.ValuePayload => @fieldParentPtr(NodeValuePayload, "base", base).lastToken(),
             Id.ValueIndexPayload => @fieldParentPtr(NodeValueIndexPayload, "base", base).lastToken(),
@@ -606,6 +610,29 @@ pub const NodeDefer = struct {
     }
 };
 
+pub const NodeComptime = struct {
+    base: Node,
+    comptime_token: Token,
+    expr: &Node,
+
+    pub fn iterate(self: &NodeComptime, index: usize) ?&Node {
+        var i = index;
+
+        if (i < 1) return self.expr;
+        i -= 1;
+
+        return null;
+    }
+
+    pub fn firstToken(self: &NodeComptime) Token {
+        return self.comptime_token;
+    }
+
+    pub fn lastToken(self: &NodeComptime) Token {
+        return self.expr.lastToken();
+    }
+};
+
 pub const NodeErrorPayload = struct {
     base: Node,
     lpipe: Token,
std/zig/parser.zig
@@ -309,6 +309,18 @@ pub const Parser = struct {
                             });
                             continue;
                         },
+                        Token.Id.Keyword_comptime => {
+                            const node = try arena.create(ast.NodeComptime);
+                            *node = ast.NodeComptime {
+                                .base = self.initNode(ast.Node.Id.Comptime),
+                                .comptime_token = token,
+                                .expr = undefined,
+                            };
+                            try root_node.decls.append(&node.base);
+                            stack.append(State.TopLevel) catch unreachable;
+                            try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
+                            continue;
+                        },
                         else => {
                             self.putBackToken(token);
                             stack.append(State.TopLevel) catch unreachable;
@@ -1523,7 +1535,15 @@ pub const Parser = struct {
                             try stack.append(State { .ExpectToken = Token.Id.LParen });
                         },
                         Token.Id.Keyword_comptime => {
-                            @panic("TODO: inline comptime");
+                            const node = try arena.create(ast.NodeComptime);
+                            *node = ast.NodeComptime {
+                                .base = self.initNode(ast.Node.Id.Comptime),
+                                .comptime_token = token,
+                                .expr = undefined,
+                            };
+                            dest_ptr.store(&node.base);
+                            try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
+                            continue;
                         },
                         else => {
                             try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id));
@@ -2131,7 +2151,10 @@ pub const Parser = struct {
                                 continue;
                             } else {
                                 self.putBackToken(mut_token);
-                                @panic("TODO: comptime block");
+                                self.putBackToken(next);
+                                const statememt = try block.statements.addOne();
+                                stack.append(State { .Semicolon = statememt }) catch unreachable;
+                                try stack.append(State { .Expression = DestPtr{.Field = statememt } });
                             }
                         },
                         Token.Id.Keyword_var, Token.Id.Keyword_const => {
@@ -2240,6 +2263,10 @@ pub const Parser = struct {
                     const defer_node = @fieldParentPtr(ast.NodeDefer, "base", n);
                     n = defer_node.expr;
                 },
+                ast.Node.Id.Comptime => {
+                    const comptime_node = @fieldParentPtr(ast.NodeComptime, "base", n);
+                    n = comptime_node.expr;
+                },
                 else => return true,
             }
         }
@@ -2824,6 +2851,12 @@ pub const Parser = struct {
                                 try stack.append(RenderState { .Expression = value});
                             }
                         },
+                        ast.Node.Id.Comptime => {
+                            if (requireSemiColon(decl)) {
+                                try stack.append(RenderState { .Text = ";" });
+                            }
+                            try stack.append(RenderState { .Expression = decl });
+                        },
                         else => unreachable,
                     }
                 },
@@ -2939,6 +2972,11 @@ pub const Parser = struct {
                         try stream.print("{} ", self.tokenizer.getTokenSlice(defer_node.defer_token));
                         try stack.append(RenderState { .Expression = defer_node.expr });
                     },
+                    ast.Node.Id.Comptime => {
+                        const comptime_node = @fieldParentPtr(ast.NodeComptime, "base", base);
+                        try stream.print("{} ", self.tokenizer.getTokenSlice(comptime_node.comptime_token));
+                        try stack.append(RenderState { .Expression = comptime_node.expr });
+                    },
                     ast.Node.Id.InfixOp => {
                         const prefix_op_node = @fieldParentPtr(ast.NodeInfixOp, "base", base);
                         try stack.append(RenderState { .Expression = prefix_op_node.rhs });