authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-10 23:19:01-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-12-10 23:19:01-05:00
log9a51091a5c3d7547989d705e3feebad6252019a6
tree75902c3bb37393e2d217a65820431b79a252bad9
parentf951bcf01b54d0cf16251d14fd3dee92b2dd9a10

self-hosted: clean up parser


1 files changed, 30 insertions(+), 45 deletions(-)

src-self-hosted/main.zig+30-45
...@@ -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 }
731731
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 };
736736
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 here825 .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 casts845 // 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 casts854 // 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 cast867 // 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 },