| ... | @@ -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 | } |