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 {...@@ -475,9 +475,12 @@ pub const NodePrefixOp = struct {
475 Negation,475 Negation,
476 NegationWrap,476 NegationWrap,
477 Return,477 Return,
478 ArrayType: &Node,
479 SliceType: AddrOfInfo,
478 Try,480 Try,
479 UnwrapMaybe,481 UnwrapMaybe,
480 };482 };
483
481 const AddrOfInfo = struct {484 const AddrOfInfo = struct {
482 align_expr: ?&Node,485 align_expr: ?&Node,
483 bit_offset_start_token: ?Token,486 bit_offset_start_token: ?Token,
...@@ -502,6 +505,8 @@ pub const NodePrefixOp = struct {...@@ -502,6 +505,8 @@ pub const NodePrefixOp = struct {
502 PrefixOp.Negation,505 PrefixOp.Negation,
503 PrefixOp.NegationWrap,506 PrefixOp.NegationWrap,
504 PrefixOp.Return,507 PrefixOp.Return,
508 PrefixOp.ArrayType,
509 PrefixOp.SliceType,
505 PrefixOp.Try,510 PrefixOp.Try,
506 PrefixOp.UnwrapMaybe => {},511 PrefixOp.UnwrapMaybe => {},
507 }512 }
std/zig/parser.zig+49-1
...@@ -385,6 +385,35 @@ pub const Parser = struct {...@@ -385,6 +385,35 @@ pub const Parser = struct {
385 try stack.append(State.ExpectOperand);385 try stack.append(State.ExpectOperand);
386 continue;386 continue;
387 },387 },
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 },
388 Token.Id.Ampersand => {417 Token.Id.Ampersand => {
389 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{418 const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
390 .AddrOf = ast.NodePrefixOp.AddrOfInfo {419 .AddrOf = ast.NodePrefixOp.AddrOfInfo {
...@@ -1567,6 +1596,25 @@ pub const Parser = struct {...@@ -1567,6 +1596,25 @@ pub const Parser = struct {
1567 try stack.append(RenderState { .Expression = align_expr});1596 try stack.append(RenderState { .Expression = align_expr});
1568 }1597 }
1569 },1598 },
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 },
1570 ast.NodePrefixOp.PrefixOp.BitNot => try stream.write("~"),1618 ast.NodePrefixOp.PrefixOp.BitNot => try stream.write("~"),
1571 ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"),1619 ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"),
1572 ast.NodePrefixOp.PrefixOp.Deref => try stream.write("*"),1620 ast.NodePrefixOp.PrefixOp.Deref => try stream.write("*"),
...@@ -2522,4 +2570,4 @@ test "zig fmt: zig fmt" {...@@ -2522,4 +2570,4 @@ test "zig fmt: zig fmt" {
2522 try testCanonical(@embedFile("index.zig"));2570 try testCanonical(@embedFile("index.zig"));
2523 try testCanonical(@embedFile("parser.zig"));2571 try testCanonical(@embedFile("parser.zig"));
2524 try testCanonical(@embedFile("tokenizer.zig"));2572 try testCanonical(@embedFile("tokenizer.zig"));
2525}
\ No newline at end of file
2573}