std.zig.parser now parses slice and array types

master
Jimmi Holst Christensen 2018-04-03 10:54:19 +02:00
parent b9093185f7
commit a2330d0ea3
2 changed files with 54 additions and 1 deletions

View File

@ -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 => {},
}

View File

@ -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"));
}
}