| ... | ... | @@ -589,7 +589,7 @@ const Parser = struct { |
| 589 | 589 | fn recordDeclarator(parser: *Parser) !*Node {} |
| 590 | 590 | |
| 591 | 591 | /// Pointer <- ASTERISK TypeQual* Pointer? |
| 592 | | fn pointer(parser: *Parser) !?*Node.Pointer { |
| 592 | fn pointer(parser: *Parser) Error!?*Node { |
| 593 | 593 | const asterisk = parser.eatToken(.Asterisk) orelse return null; |
| 594 | 594 | const node = try parser.arena.create(Node.Pointer); |
| 595 | 595 | node.* = .{ |
| ... | ... | @@ -599,34 +599,129 @@ const Parser = struct { |
| 599 | 599 | }; |
| 600 | 600 | while (try parser.typeQual(&node.qual)) {} |
| 601 | 601 | node.pointer = try parser.pointer(); |
| 602 | | return node; |
| 602 | return &node.base; |
| 603 | 603 | } |
| 604 | | /// DirectDeclarator |
| 605 | | /// <- IDENTIFIER |
| 604 | |
| 605 | const Named = enum { |
| 606 | Must, |
| 607 | Allowed, |
| 608 | Forbidden, |
| 609 | }; |
| 610 | |
| 611 | /// Declarator <- Pointer? DeclaratorSuffix |
| 612 | /// DeclaratorPrefix |
| 613 | /// <- IDENTIFIER // if named != .Forbidden |
| 606 | 614 | /// / LPAREN Declarator RPAREN |
| 607 | | /// / DirectDeclarator LBRACKET (ASTERISK / BracketDeclarator)? RBRACKET |
| 608 | | /// / DirectDeclarator LPAREN (ParamDecl (COMMA ParamDecl)* (COMMA ELLIPSIS)?)? RPAREN |
| 609 | | fn directDeclarator(parser: *Parser) !*Node {} |
| 615 | /// / (none) // if named != .Must |
| 616 | /// DeclaratorSuffix |
| 617 | /// <. DeclaratorPrefix (LBRACKET ArrayDeclarator? RBRACKET)* |
| 618 | /// / DeclaratorPrefix LPAREN (ParamDecl (COMMA ParamDecl)* (COMMA ELLIPSIS)?)? RPAREN |
| 619 | fn declarator(parser: *Parser, named: Named) Error!?*Node { |
| 620 | const ptr = try parser.pointer(); |
| 621 | var node: *Node.Declarator = undefined; |
| 622 | // prefix |
| 623 | if (parser.eatToken(.LParen)) |lparen| { |
| 624 | const inner = (try parser.declarator(named)) orelse return parser.err(.{ |
| 625 | .ExpectedDeclarator = .{ .token = lparen + 1 }, |
| 626 | }); |
| 627 | node = try parser.arena.create(Node.Declarator); |
| 628 | node.* = .{ |
| 629 | .pointer = ptr, |
| 630 | .prefix = .{ |
| 631 | .Comples = .{ |
| 632 | .lparen = lparen, |
| 633 | .inner = inner, |
| 634 | .rparen = try parser.expectToken(.RParen), |
| 635 | }, |
| 636 | }, |
| 637 | .suffix = .None, |
| 638 | }; |
| 639 | } else if (named != .Forbidden) { |
| 640 | if (parser.eatToken(.Identifier)) |tok| { |
| 641 | node = try parser.arena.create(Node.Declarator); |
| 642 | node.* = .{ |
| 643 | .pointer = ptr, |
| 644 | .prefix = .{ .Simple = tok }, |
| 645 | .suffix = .None, |
| 646 | }; |
| 647 | } else if (named == .Must) { |
| 648 | return parser.err(.{ |
| 649 | .ExpectedToken = .{ .token = parser.it.index, .expected_id = .Identifier }, |
| 650 | }); |
| 651 | } else { |
| 652 | return ptr; |
| 653 | } |
| 654 | } else { |
| 655 | node = try parser.arena.create(Node.Declarator); |
| 656 | node.* = .{ |
| 657 | .pointer = ptr, |
| 658 | .prefix = .None, |
| 659 | .suffix = .None, |
| 660 | }; |
| 661 | } |
| 662 | // suffix |
| 663 | if (parser.eatToken(.LParen)) |lparen| { |
| 664 | node.suffix = .{ |
| 665 | .Fn = .{ |
| 666 | .lparen = lparen, |
| 667 | .params = .Node.Declarator.Params.init(parser.arena), |
| 668 | .rparen = undefined, |
| 669 | }, |
| 670 | }; |
| 671 | try parser.ParamDecl(node); |
| 672 | node.suffix.Fn.rparen = try parser.expectToken(.RParen); |
| 673 | } else { |
| 674 | while (parser.arrayDeclarator()) |arr| { |
| 675 | if (node.suffix == .None) |
| 676 | node.suffix = .{ .Array = .Node.Declarator.Arrays.init(parser.arena) }; |
| 677 | try node.suffix.Array.push(arr); |
| 678 | } |
| 679 | } |
| 680 | if (parser.eatToken(.LParen) orelse parser.eatToken(.LBracket)) |tok| |
| 681 | return parser.err(.{ |
| 682 | .InvalidDeclarator = .{ .token = tok }, |
| 683 | }); |
| 684 | return node; |
| 685 | } |
| 610 | 686 | |
| 611 | | /// BracketDeclarator |
| 612 | | /// <- Keyword_static TypeQual* AssignmentExpr |
| 687 | /// ArrayDeclarator |
| 688 | /// <- ASTERISK |
| 689 | /// / Keyword_static TypeQual* AssignmentExpr |
| 613 | 690 | /// / TypeQual+ (ASTERISK / Keyword_static AssignmentExpr) |
| 614 | 691 | /// / TypeQual+ AssignmentExpr? |
| 615 | 692 | /// / AssignmentExpr |
| 616 | | fn bracketDeclarator(parser: *Parser) !*Node {} |
| 693 | fn arrayDeclarator(parser: *Parser, dr: *Node.Declarator) !?*Node.Array { |
| 694 | const lbracket = parser.eatToken(.LBracket) orelse return null; |
| 695 | const arr = try parser.arena.create(Node.Array); |
| 696 | arr.* = .{ |
| 697 | .lbracket = lbarcket, |
| 698 | .inner = .Inferred, |
| 699 | .rbracket = undefined, |
| 700 | }; |
| 701 | if (parser.eatToken(.Asterisk)) |tok| { |
| 702 | arr.inner = .{ .Unspecified = tok }; |
| 703 | } else { |
| 704 | // TODO |
| 705 | } |
| 706 | arr.rbracket = try parser.expectToken(.RBracket); |
| 707 | return arr; |
| 708 | } |
| 617 | 709 | |
| 710 | /// Params <- ParamDecl (COMMA ParamDecl)* (COMMA ELLIPSIS)? |
| 618 | 711 | /// ParamDecl <- DeclSpec (Declarator / AbstractDeclarator) |
| 619 | | fn paramDecl(parser: *Parser) !*Node {} |
| 620 | | |
| 621 | | /// AbstractDeclarator <- Pointer? DirectAbstractDeclarator? |
| 622 | | fn abstractDeclarator(parser: *Parser) !*Node {} |
| 623 | | |
| 624 | | /// DirectAbstractDeclarator |
| 625 | | /// <- IDENTIFIER |
| 626 | | /// / LPAREN DirectAbstractDeclarator RPAREN |
| 627 | | /// / DirectAbstractDeclarator? LBRACKET (ASTERISK / BracketDeclarator)? RBRACKET |
| 628 | | /// / DirectAbstractDeclarator? LPAREN (ParamDecl (COMMA ParamDecl)* (COMMA ELLIPSIS)?)? RPAREN |
| 629 | | fn directAbstractDeclarator(parser: *Parser) !*Node {} |
| 712 | fn paramDecl(parser: *Parser, dr: *Node.Declarator) !void { |
| 713 | var old_style = false; |
| 714 | while (true) { |
| 715 | var ds = Node.DeclSpec; |
| 716 | if (try parser.declSpec(&ds)) { |
| 717 | //TODO |
| 718 | } else if (parser.eatToken(.Identifier)) { |
| 719 | old_style = true; |
| 720 | } else if (parser.eatToken(.Ellipsis)) { |
| 721 | // TODO |
| 722 | } |
| 723 | } |
| 724 | } |
| 630 | 725 | |
| 631 | 726 | /// Expr <- AssignmentExpr (COMMA Expr)* |
| 632 | 727 | fn expr(parser: *Parser) !*Node {} |