authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 10:54:19+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-03 10:54:19+02:00
loga2330d0ea366e0ced7fa917d3bf1ccd022e932c3
tree6af01264268192c9cbb8bf47bb8e478b5ec6b341
parentb9093185f748293064e7eeaaa07e7479099420ed

std.zig.parser now parses slice and array types


2 files changed, 54 insertions(+), 1 deletions(-)

std/zig/ast.zig+5
......@@ -475,9 +475,12 @@ pub const NodePrefixOp = struct {
475475 Negation,
476476 NegationWrap,
477477 Return,
478 ArrayType: &Node,
479 SliceType: AddrOfInfo,
478480 Try,
479481 UnwrapMaybe,
480482 };
483
481484 const AddrOfInfo = struct {
482485 align_expr: ?&Node,
483486 bit_offset_start_token: ?Token,
......@@ -502,6 +505,8 @@ pub const NodePrefixOp = struct {
502505 PrefixOp.Negation,
503506 PrefixOp.NegationWrap,
504507 PrefixOp.Return,
508 PrefixOp.ArrayType,
509 PrefixOp.SliceType,
505510 PrefixOp.Try,
506511 PrefixOp.UnwrapMaybe => {},
507512 }
std/zig/parser.zig+49-1
......@@ -385,6 +385,35 @@ pub const Parser = struct {
385385 try stack.append(State.ExpectOperand);
386386 continue;
387387 },
388 Token.Id.LBracket => {
389 const rbracket_token = self.getNextToken();
390 if (rbracket_token.id == Token.Id.RBracket) {
391 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
392 .SliceType = ast.NodePrefixOp.AddrOfInfo {
393 .align_expr = null,
394 .bit_offset_start_token = null,
395 .bit_offset_end_token = null,
396 .const_token = null,
397 .volatile_token = null,
398 }
399 });
400 try stack.append(State { .PrefixOp = prefix_op });
401 try stack.append(State.ExpectOperand);
402 try stack.append(State { .AddrOfModifiers = &prefix_op.op.AddrOf });
403 continue;
404 }
405
406 self.putBackToken(rbracket_token);
407
408 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
409 .ArrayType = undefined,
410 });
411 try stack.append(State { .PrefixOp = prefix_op });
412 try stack.append(State.ExpectOperand);
413 try stack.append(State { .ExpectToken = Token.Id.RBracket });
414 try stack.append(State { .Expression = DestPtr { .Field = &prefix_op.op.ArrayType } });
415
416 },
388417 Token.Id.Ampersand => {
389418 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
390419 .AddrOf = ast.NodePrefixOp.AddrOfInfo {
......@@ -1567,6 +1596,25 @@ pub const Parser = struct {
15671596 try stack.append(RenderState { .Expression = align_expr});
15681597 }
15691598 },
1599 ast.NodePrefixOp.PrefixOp.SliceType => |addr_of_info| {
1600 try stream.write("[]");
1601 if (addr_of_info.volatile_token != null) {
1602 try stack.append(RenderState { .Text = "volatile "});
1603 }
1604 if (addr_of_info.const_token != null) {
1605 try stack.append(RenderState { .Text = "const "});
1606 }
1607 if (addr_of_info.align_expr) |align_expr| {
1608 try stream.print("align(");
1609 try stack.append(RenderState { .Text = ") "});
1610 try stack.append(RenderState { .Expression = align_expr});
1611 }
1612 },
1613 ast.NodePrefixOp.PrefixOp.ArrayType => |array_index| {
1614 try stack.append(RenderState { .Text = "]"});
1615 try stack.append(RenderState { .Expression = array_index});
1616 try stack.append(RenderState { .Text = "["});
1617 },
15701618 ast.NodePrefixOp.PrefixOp.BitNot => try stream.write("~"),
15711619 ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"),
15721620 ast.NodePrefixOp.PrefixOp.Deref => try stream.write("*"),
......@@ -2522,4 +2570,4 @@ test "zig fmt: zig fmt" {
25222570 try testCanonical(@embedFile("index.zig"));
25232571 try testCanonical(@embedFile("parser.zig"));
25242572 try testCanonical(@embedFile("tokenizer.zig"));
2525}
\ No newline at end of file
2573}