commit a2330d0ea366e0ced7fa917d3bf1ccd022e932c3 (tree)
parent b9093185f748293064e7eeaaa07e7479099420ed
Author: Jimmi Holst Christensen <jhc@liab.dk>
Date: Tue, 3 Apr 2018 10:54:19 +0200
std.zig.parser now parses slice and array types
Diffstat:
2 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/std/zig/ast.zig b/std/zig/ast.zig
@@ -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 => {},
}
diff --git a/std/zig/parser.zig b/std/zig/parser.zig
@@ -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"));
-}
-\ No newline at end of file
+}