Commit 7d32c9521f
Changed files (2)
std
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 });