mirror of
https://github.com/ziglang/zig.git
synced 2026-02-15 05:48:31 +00:00
std.zig.parser now parses comptime
This commit is contained in:
parent
d04346d2ac
commit
7d32c9521f
@ -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,
|
||||
|
||||
@ -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 });
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user