std.zig.parser now parses slice and array types
parent
b9093185f7
commit
a2330d0ea3
|
@ -475,9 +475,12 @@ pub const NodePrefixOp = struct {
|
|||
Negation,
|
||||
NegationWrap,
|
||||
Return,
|
||||
ArrayType: &Node,
|
||||
SliceType: AddrOfInfo,
|
||||
Try,
|
||||
UnwrapMaybe,
|
||||
};
|
||||
|
||||
const AddrOfInfo = struct {
|
||||
align_expr: ?&Node,
|
||||
bit_offset_start_token: ?Token,
|
||||
|
@ -502,6 +505,8 @@ pub const NodePrefixOp = struct {
|
|||
PrefixOp.Negation,
|
||||
PrefixOp.NegationWrap,
|
||||
PrefixOp.Return,
|
||||
PrefixOp.ArrayType,
|
||||
PrefixOp.SliceType,
|
||||
PrefixOp.Try,
|
||||
PrefixOp.UnwrapMaybe => {},
|
||||
}
|
||||
|
|
|
@ -385,6 +385,35 @@ pub const Parser = struct {
|
|||
try stack.append(State.ExpectOperand);
|
||||
continue;
|
||||
},
|
||||
Token.Id.LBracket => {
|
||||
const rbracket_token = self.getNextToken();
|
||||
if (rbracket_token.id == Token.Id.RBracket) {
|
||||
const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
|
||||
.SliceType = ast.NodePrefixOp.AddrOfInfo {
|
||||
.align_expr = null,
|
||||
.bit_offset_start_token = null,
|
||||
.bit_offset_end_token = null,
|
||||
.const_token = null,
|
||||
.volatile_token = null,
|
||||
}
|
||||
});
|
||||
try stack.append(State { .PrefixOp = prefix_op });
|
||||
try stack.append(State.ExpectOperand);
|
||||
try stack.append(State { .AddrOfModifiers = &prefix_op.op.AddrOf });
|
||||
continue;
|
||||
}
|
||||
|
||||
self.putBackToken(rbracket_token);
|
||||
|
||||
const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
|
||||
.ArrayType = undefined,
|
||||
});
|
||||
try stack.append(State { .PrefixOp = prefix_op });
|
||||
try stack.append(State.ExpectOperand);
|
||||
try stack.append(State { .ExpectToken = Token.Id.RBracket });
|
||||
try stack.append(State { .Expression = DestPtr { .Field = &prefix_op.op.ArrayType } });
|
||||
|
||||
},
|
||||
Token.Id.Ampersand => {
|
||||
const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
|
||||
.AddrOf = ast.NodePrefixOp.AddrOfInfo {
|
||||
|
@ -1567,6 +1596,25 @@ pub const Parser = struct {
|
|||
try stack.append(RenderState { .Expression = align_expr});
|
||||
}
|
||||
},
|
||||
ast.NodePrefixOp.PrefixOp.SliceType => |addr_of_info| {
|
||||
try stream.write("[]");
|
||||
if (addr_of_info.volatile_token != null) {
|
||||
try stack.append(RenderState { .Text = "volatile "});
|
||||
}
|
||||
if (addr_of_info.const_token != null) {
|
||||
try stack.append(RenderState { .Text = "const "});
|
||||
}
|
||||
if (addr_of_info.align_expr) |align_expr| {
|
||||
try stream.print("align(");
|
||||
try stack.append(RenderState { .Text = ") "});
|
||||
try stack.append(RenderState { .Expression = align_expr});
|
||||
}
|
||||
},
|
||||
ast.NodePrefixOp.PrefixOp.ArrayType => |array_index| {
|
||||
try stack.append(RenderState { .Text = "]"});
|
||||
try stack.append(RenderState { .Expression = array_index});
|
||||
try stack.append(RenderState { .Text = "["});
|
||||
},
|
||||
ast.NodePrefixOp.PrefixOp.BitNot => try stream.write("~"),
|
||||
ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"),
|
||||
ast.NodePrefixOp.PrefixOp.Deref => try stream.write("*"),
|
||||
|
@ -2522,4 +2570,4 @@ test "zig fmt: zig fmt" {
|
|||
try testCanonical(@embedFile("index.zig"));
|
||||
try testCanonical(@embedFile("parser.zig"));
|
||||
try testCanonical(@embedFile("tokenizer.zig"));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue