| ... | ... | @@ -385,6 +385,35 @@ pub const Parser = struct { |
| 385 | 385 | try stack.append(State.ExpectOperand); |
| 386 | 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 | 417 | Token.Id.Ampersand => { |
| 389 | 418 | const prefix_op = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{ |
| 390 | 419 | .AddrOf = ast.NodePrefixOp.AddrOfInfo { |
| ... | ... | @@ -1567,6 +1596,25 @@ pub const Parser = struct { |
| 1567 | 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 | 1618 | ast.NodePrefixOp.PrefixOp.BitNot => try stream.write("~"), |
| 1571 | 1619 | ast.NodePrefixOp.PrefixOp.BoolNot => try stream.write("!"), |
| 1572 | 1620 | ast.NodePrefixOp.PrefixOp.Deref => try stream.write("*"), |
| ... | ... | @@ -2522,4 +2570,4 @@ test "zig fmt: zig fmt" { |
| 2522 | 2570 | try testCanonical(@embedFile("index.zig")); |
| 2523 | 2571 | try testCanonical(@embedFile("parser.zig")); |
| 2524 | 2572 | try testCanonical(@embedFile("tokenizer.zig")); |
| 2525 | | } |
| | \ No newline at end of file |
| 2573 | } |