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