| ... | ... | @@ -729,15 +729,15 @@ const Parser = struct { |
| 729 | 729 | self.allocator.free(self.utility_bytes); |
| 730 | 730 | } |
| 731 | 731 | |
| 732 | | const TopLevelExternCtx = struct { |
| 732 | const TopLevelDeclCtx = struct { |
| 733 | 733 | visib_token: ?Token, |
| 734 | | extern_token: Token, |
| 734 | extern_token: ?Token, |
| 735 | 735 | }; |
| 736 | 736 | |
| 737 | 737 | const State = union(enum) { |
| 738 | 738 | TopLevel, |
| 739 | | TopLevelModifier: ?Token, |
| 740 | | TopLevelExtern: TopLevelExternCtx, |
| 739 | TopLevelExtern: ?Token, |
| 740 | TopLevelDecl: TopLevelDeclCtx, |
| 741 | 741 | Expression: &&AstNode, |
| 742 | 742 | GroupedExpression: &&AstNode, |
| 743 | 743 | UnwrapExpression: &&AstNode, |
| ... | ... | @@ -805,61 +805,46 @@ const Parser = struct { |
| 805 | 805 | const token = self.getNextToken(); |
| 806 | 806 | switch (token.id) { |
| 807 | 807 | Token.Id.Keyword_pub, Token.Id.Keyword_export => { |
| 808 | | stack.append(State { .TopLevelModifier = token }) %% unreachable; |
| 809 | | continue; |
| 810 | | }, |
| 811 | | Token.Id.Keyword_const, Token.Id.Keyword_var => { |
| 812 | | stack.append(State.TopLevel) %% unreachable; |
| 813 | | // TODO shouldn't need this cast |
| 814 | | const var_decl_node = %return self.createAttachVarDecl(&root_node.decls, (?Token)(null), |
| 815 | | token, (?Token)(null), (?Token)(null)); |
| 816 | | %return stack.append(State { .VarDecl = var_decl_node }); |
| 808 | stack.append(State { .TopLevelExtern = token }) %% unreachable; |
| 817 | 809 | continue; |
| 818 | 810 | }, |
| 819 | 811 | Token.Id.Eof => return root_node, |
| 820 | | Token.Id.Keyword_extern => { |
| 821 | | stack.append(State { |
| 822 | | .TopLevelExtern = TopLevelExternCtx { |
| 823 | | .visib_token = null, |
| 824 | | .extern_token = token, |
| 825 | | } |
| 826 | | }) %% unreachable; |
| 812 | else => { |
| 813 | self.putBackToken(token); |
| 814 | // TODO shouldn't need this cast |
| 815 | stack.append(State { .TopLevelExtern = null }) %% unreachable; |
| 827 | 816 | continue; |
| 828 | 817 | }, |
| 829 | | else => return self.parseError(token, "expected top level declaration, found {}", @tagName(token.id)), |
| 830 | 818 | } |
| 831 | 819 | }, |
| 832 | | State.TopLevelModifier => |visib_token| { |
| 820 | State.TopLevelExtern => |visib_token| { |
| 833 | 821 | const token = self.getNextToken(); |
| 834 | | switch (token.id) { |
| 835 | | Token.Id.Keyword_const, Token.Id.Keyword_var => { |
| 836 | | stack.append(State.TopLevel) %% unreachable; |
| 837 | | // TODO shouldn't need the casts here |
| 838 | | const var_decl_node = %return self.createAttachVarDecl(&root_node.decls, visib_token, |
| 839 | | token, (?Token)(null), (?Token)(null)); |
| 840 | | %return stack.append(State { .VarDecl = var_decl_node }); |
| 841 | | continue; |
| 842 | | }, |
| 843 | | Token.Id.Keyword_extern => { |
| 844 | | stack.append(State { |
| 845 | | .TopLevelExtern = TopLevelExternCtx { |
| 846 | | .visib_token = visib_token, |
| 847 | | .extern_token = token, |
| 848 | | }, |
| 849 | | }) %% unreachable; |
| 850 | | continue; |
| 851 | | }, |
| 852 | | else => return self.parseError(token, "expected top level declaration, found {}", @tagName(token.id)), |
| 822 | if (token.id == Token.Id.Keyword_extern) { |
| 823 | stack.append(State { |
| 824 | .TopLevelDecl = TopLevelDeclCtx { |
| 825 | .visib_token = visib_token, |
| 826 | .extern_token = token, |
| 827 | }, |
| 828 | }) %% unreachable; |
| 829 | continue; |
| 853 | 830 | } |
| 831 | self.putBackToken(token); |
| 832 | stack.append(State { |
| 833 | .TopLevelDecl = TopLevelDeclCtx { |
| 834 | .visib_token = visib_token, |
| 835 | .extern_token = null, |
| 836 | }, |
| 837 | }) %% unreachable; |
| 838 | continue; |
| 854 | 839 | }, |
| 855 | | State.TopLevelExtern => |ctx| { |
| 840 | State.TopLevelDecl => |ctx| { |
| 856 | 841 | const token = self.getNextToken(); |
| 857 | 842 | switch (token.id) { |
| 858 | 843 | Token.Id.Keyword_var, Token.Id.Keyword_const => { |
| 859 | 844 | stack.append(State.TopLevel) %% unreachable; |
| 860 | 845 | // TODO shouldn't need these casts |
| 861 | 846 | const var_decl_node = %return self.createAttachVarDecl(&root_node.decls, ctx.visib_token, |
| 862 | | token, (?Token)(null), (?Token)(ctx.extern_token)); |
| 847 | token, (?Token)(null), ctx.extern_token); |
| 863 | 848 | %return stack.append(State { .VarDecl = var_decl_node }); |
| 864 | 849 | continue; |
| 865 | 850 | }, |
| ... | ... | @@ -868,7 +853,7 @@ const Parser = struct { |
| 868 | 853 | %return stack.append(State { .ExpectToken = Token.Id.Semicolon }); |
| 869 | 854 | // TODO shouldn't need these casts |
| 870 | 855 | const fn_proto_node = %return self.createAttachFnProto(&root_node.decls, token, |
| 871 | | (?Token)(ctx.extern_token), (?Token)(null), (?Token)(null), (?Token)(null)); |
| 856 | ctx.extern_token, (?Token)(null), (?Token)(null), (?Token)(null)); |
| 872 | 857 | %return stack.append(State { .FnProto = fn_proto_node }); |
| 873 | 858 | continue; |
| 874 | 859 | }, |
| ... | ... | @@ -881,7 +866,7 @@ const Parser = struct { |
| 881 | 866 | const fn_token = %return self.eatToken(Token.Id.Keyword_fn); |
| 882 | 867 | // TODO shouldn't need this cast |
| 883 | 868 | const fn_proto_node = %return self.createAttachFnProto(&root_node.decls, fn_token, |
| 884 | | (?Token)(ctx.extern_token), (?Token)(token), (?Token)(null), (?Token)(null)); |
| 869 | ctx.extern_token, (?Token)(token), (?Token)(null), (?Token)(null)); |
| 885 | 870 | %return stack.append(State { .FnProto = fn_proto_node }); |
| 886 | 871 | continue; |
| 887 | 872 | }, |