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 {
729729 self.allocator.free(self.utility_bytes);
730730 }
731731
732 const TopLevelExternCtx = struct {
732 const TopLevelDeclCtx = struct {
733733 visib_token: ?Token,
734 extern_token: Token,
734 extern_token: ?Token,
735735 };
736736
737737 const State = union(enum) {
738738 TopLevel,
739 TopLevelModifier: ?Token,
740 TopLevelExtern: TopLevelExternCtx,
739 TopLevelExtern: ?Token,
740 TopLevelDecl: TopLevelDeclCtx,
741741 Expression: &&AstNode,
742742 GroupedExpression: &&AstNode,
743743 UnwrapExpression: &&AstNode,
......@@ -805,61 +805,46 @@ const Parser = struct {
805805 const token = self.getNextToken();
806806 switch (token.id) {
807807 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;
817809 continue;
818810 },
819811 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;
827816 continue;
828817 },
829 else => return self.parseError(token, "expected top level declaration, found {}", @tagName(token.id)),
830818 }
831819 },
832 State.TopLevelModifier => |visib_token| {
820 State.TopLevelExtern => |visib_token| {
833821 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;
853830 }
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;
854839 },
855 State.TopLevelExtern => |ctx| {
840 State.TopLevelDecl => |ctx| {
856841 const token = self.getNextToken();
857842 switch (token.id) {
858843 Token.Id.Keyword_var, Token.Id.Keyword_const => {
859844 stack.append(State.TopLevel) %% unreachable;
860845 // TODO shouldn't need these casts
861846 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);
863848 %return stack.append(State { .VarDecl = var_decl_node });
864849 continue;
865850 },
......@@ -868,7 +853,7 @@ const Parser = struct {
868853 %return stack.append(State { .ExpectToken = Token.Id.Semicolon });
869854 // TODO shouldn't need these casts
870855 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));
872857 %return stack.append(State { .FnProto = fn_proto_node });
873858 continue;
874859 },
......@@ -881,7 +866,7 @@ const Parser = struct {
881866 const fn_token = %return self.eatToken(Token.Id.Keyword_fn);
882867 // TODO shouldn't need this cast
883868 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));
885870 %return stack.append(State { .FnProto = fn_proto_node });
886871 continue;
887872 },