std.zig.parser now parses slice and array types

This commit is contained in:
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, Negation,
NegationWrap, NegationWrap,
Return, Return,
ArrayType: &Node,
SliceType: AddrOfInfo,
Try, Try,
UnwrapMaybe, UnwrapMaybe,
}; };
const AddrOfInfo = struct { const AddrOfInfo = struct {
align_expr: ?&Node, align_expr: ?&Node,
bit_offset_start_token: ?Token, bit_offset_start_token: ?Token,
@ -502,6 +505,8 @@ pub const NodePrefixOp = struct {
PrefixOp.Negation, PrefixOp.Negation,
PrefixOp.NegationWrap, PrefixOp.NegationWrap,
PrefixOp.Return, PrefixOp.Return,
PrefixOp.ArrayType,
PrefixOp.SliceType,
PrefixOp.Try, PrefixOp.Try,
PrefixOp.UnwrapMaybe => {}, PrefixOp.UnwrapMaybe => {},
} }

View File

@ -385,6 +385,35 @@ pub const Parser = struct {
try stack.append(State.ExpectOperand); try stack.append(State.ExpectOperand);
continue; 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 => { Token.Id.Ampersand => {
const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{ const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
.AddrOf = ast.NodePrefixOp.AddrOfInfo { .AddrOf = ast.NodePrefixOp.AddrOfInfo {
@ -1567,6 +1596,25 @@ pub const Parser = struct {
try stack.append(RenderState { .Expression = align_expr}); 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.BitNot => try stream.write("~"),
ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"), ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"),
ast.NodePrefixOp.PrefixOp.Deref => 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("index.zig"));
try testCanonical(@embedFile("parser.zig")); try testCanonical(@embedFile("parser.zig"));
try testCanonical(@embedFile("tokenizer.zig")); try testCanonical(@embedFile("tokenizer.zig"));
} }