authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-29 12:12:28+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-29 12:12:28+02:00
logabd1a7c91c611b35754e5d22a8755cfbebc65861
treec15790b939340189aac1136cbb8e9166ffbd31fa
parentad327fed05d2d809dfef612e3f4abbb5a9a5ed71
signaturelock-open Commit is signed but in an unrecognized format.

std-c add todos to unfinished parsing functioins


2 files changed, 103 insertions(+), 30 deletions(-)

lib/std/c/ast.zig+23
...@@ -656,3 +656,26 @@ pub const Node = struct {...@@ -656,3 +656,26 @@ pub const Node = struct {
656 },656 },
657 };657 };
658};658};
659
660pub const Expr = struct {
661 id: Id,
662 ty: *Type,
663 value: union(enum) {
664 None,
665 },
666
667 pub const Id = enum {
668 Infix,
669 Literal,
670 };
671
672 pub const Infix = struct {
673 base: Expr = Expr{ .id = .Infix },
674 lhs: *Expr,
675 op_token: TokenIndex,
676 op: Op,
677 rhs: *Expr,
678
679 pub const Op = enum {};
680 };
681};
lib/std/c/parse.zig+80-30
...@@ -15,7 +15,6 @@ pub const Error = error{ParseError} || Allocator.Error;...@@ -15,7 +15,6 @@ pub const Error = error{ParseError} || Allocator.Error;
15pub const Options = struct {15pub const Options = struct {
16 // /// Keep simple macros unexpanded and add the definitions to the ast16 // /// Keep simple macros unexpanded and add the definitions to the ast
17 // retain_macros: bool = false,17 // retain_macros: bool = false,
18
19 /// Warning or error18 /// Warning or error
20 warn_as_err: union(enum) {19 warn_as_err: union(enum) {
21 /// All warnings are warnings20 /// All warnings are warnings
...@@ -335,7 +334,9 @@ const Parser = struct {...@@ -335,7 +334,9 @@ const Parser = struct {
335 fn staticAssert(parser: *Parser) !?*Node {334 fn staticAssert(parser: *Parser) !?*Node {
336 const tok = parser.eatToken(.Keyword_static_assert) orelse return null;335 const tok = parser.eatToken(.Keyword_static_assert) orelse return null;
337 _ = try parser.expectToken(.LParen);336 _ = try parser.expectToken(.LParen);
338 const const_expr = try parser.constExpr();337 const const_expr = (try parser.constExpr()) orelse parser.err(.{
338 .ExpectedExpr = .{ .token = parser.it.index },
339 });
339 _ = try parser.expectToken(.Comma);340 _ = try parser.expectToken(.Comma);
340 const str = try parser.expectToken(.StringLiteral);341 const str = try parser.expectToken(.StringLiteral);
341 _ = try parser.expectToken(.RParen);342 _ = try parser.expectToken(.RParen);
...@@ -707,7 +708,9 @@ const Parser = struct {...@@ -707,7 +708,9 @@ const Parser = struct {
707 fn alignSpec(parser: *Parser, ds: *Node.DeclSpec) !bool {708 fn alignSpec(parser: *Parser, ds: *Node.DeclSpec) !bool {
708 if (parser.eatToken(.Keyword_alignas)) |tok| {709 if (parser.eatToken(.Keyword_alignas)) |tok| {
709 _ = try parser.expectToken(.LParen);710 _ = try parser.expectToken(.LParen);
710 const node = (try parser.typeName()) orelse (try parser.constExpr());711 const node = (try parser.typeName()) orelse (try parser.constExpr()) orelse parser.err(.{
712 .ExpectedExpr = .{ .token = parser.it.index },
713 });
711 if (ds.align_spec != null) {714 if (ds.align_spec != null) {
712 try parser.warn(.{715 try parser.warn(.{
713 .DuplicateSpecifier = .{ .token = parser.it.index },716 .DuplicateSpecifier = .{ .token = parser.it.index },
...@@ -769,7 +772,9 @@ const Parser = struct {...@@ -769,7 +772,9 @@ const Parser = struct {
769 .value = null,772 .value = null,
770 };773 };
771 if (parser.eatToken(.Equal)) |eq| {774 if (parser.eatToken(.Equal)) |eq| {
772 node.value = try parser.constExpr();775 node.value = (try parser.constExpr()) orelse parser.err(.{
776 .ExpectedExpr = .{ .token = parser.it.index },
777 });
773 }778 }
774 return &node.base;779 return &node.base;
775 }780 }
...@@ -845,10 +850,14 @@ const Parser = struct {...@@ -845,10 +850,14 @@ const Parser = struct {
845 }850 }
846851
847 /// TypeName <- TypeSpec* AbstractDeclarator?852 /// TypeName <- TypeSpec* AbstractDeclarator?
848 fn typeName(parser: *Parser) !*Node {853 fn typeName(parser: *Parser) Error!?*Node {
854 @panic("TODO");
855 }
849856
850 /// RecordDeclarator <- Declarator? (COLON ConstExpr)?857 /// RecordDeclarator <- Declarator? (COLON ConstExpr)?
851 fn recordDeclarator(parser: *Parser) !*Node {}858 fn recordDeclarator(parser: *Parser) Error!*Node.RecordDeclarator {
859 @panic("TODO");
860 }
852861
853 /// Pointer <- ASTERISK TypeQual* Pointer?862 /// Pointer <- ASTERISK TypeQual* Pointer?
854 fn pointer(parser: *Parser) Error!?*Node.Pointer {863 fn pointer(parser: *Parser) Error!?*Node.Pointer {
...@@ -1001,14 +1010,18 @@ const Parser = struct {...@@ -1001,14 +1010,18 @@ const Parser = struct {
1001 }1010 }
10021011
1003 /// Expr <- AssignmentExpr (COMMA Expr)*1012 /// Expr <- AssignmentExpr (COMMA Expr)*
1004 fn expr(parser: *Parser) !*Node {}1013 fn expr(parser: *Parser) Error!?*Expr {
1014 @panic("TODO");
1015 }
10051016
1006 /// AssignmentExpr1017 /// AssignmentExpr
1007 /// <- ConditionalExpr // TODO recursive?1018 /// <- ConditionalExpr // TODO recursive?
1008 /// / UnaryExpr (EQUAL / ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUA /1019 /// / UnaryExpr (EQUAL / ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUA /
1009 /// / ANGLEBRACKETANGLEBRACKETLEFTEQUAL / ANGLEBRACKETANGLEBRACKETRIGHTEQUAL /1020 /// / ANGLEBRACKETANGLEBRACKETLEFTEQUAL / ANGLEBRACKETANGLEBRACKETRIGHTEQUAL /
1010 /// / AMPERSANDEQUAL / CARETEQUAL / PIPEEQUAL) AssignmentExpr1021 /// / AMPERSANDEQUAL / CARETEQUAL / PIPEEQUAL) AssignmentExpr
1011 fn assignmentExpr(parser: *Parser) !*Node {}1022 fn assignmentExpr(parser: *Parser) !?*Expr {
1023 @panic("TODO");
1024 }
10121025
1013 /// ConstExpr <- ConditionalExpr1026 /// ConstExpr <- ConditionalExpr
1014 fn constExpr(parser: *Parser) Error!?*Expr {1027 fn constExpr(parser: *Parser) Error!?*Expr {
...@@ -1022,37 +1035,59 @@ const Parser = struct {...@@ -1022,37 +1035,59 @@ const Parser = struct {
1022 }1035 }
10231036
1024 /// ConditionalExpr <- LogicalOrExpr (QUESTIONMARK Expr COLON ConditionalExpr)?1037 /// ConditionalExpr <- LogicalOrExpr (QUESTIONMARK Expr COLON ConditionalExpr)?
1025 fn conditionalExpr(parser: *Parser) !*Node {}1038 fn conditionalExpr(parser: *Parser) Error!?*Expr {
1039 @panic("TODO");
1040 }
10261041
1027 /// LogicalOrExpr <- LogicalAndExpr (PIPEPIPE LogicalOrExpr)*1042 /// LogicalOrExpr <- LogicalAndExpr (PIPEPIPE LogicalOrExpr)*
1028 fn logicalOrExpr(parser: *Parser) !*Node {}1043 fn logicalOrExpr(parser: *Parser) !*Node {
1044 const lhs = (try parser.logicalAndExpr()) orelse return null;
1045 }
10291046
1030 /// LogicalAndExpr <- BinOrExpr (AMPERSANDAMPERSAND LogicalAndExpr)*1047 /// LogicalAndExpr <- BinOrExpr (AMPERSANDAMPERSAND LogicalAndExpr)*
1031 fn logicalAndExpr(parser: *Parser) !*Node {}1048 fn logicalAndExpr(parser: *Parser) !*Node {
1049 @panic("TODO");
1050 }
10321051
1033 /// BinOrExpr <- BinXorExpr (PIPE BinOrExpr)*1052 /// BinOrExpr <- BinXorExpr (PIPE BinOrExpr)*
1034 fn binOrExpr(parser: *Parser) !*Node {}1053 fn binOrExpr(parser: *Parser) !*Node {
1054 @panic("TODO");
1055 }
10351056
1036 /// BinXorExpr <- BinAndExpr (CARET BinXorExpr)*1057 /// BinXorExpr <- BinAndExpr (CARET BinXorExpr)*
1037 fn binXorExpr(parser: *Parser) !*Node {}1058 fn binXorExpr(parser: *Parser) !*Node {
1059 @panic("TODO");
1060 }
10381061
1039 /// BinAndExpr <- EqualityExpr (AMPERSAND BinAndExpr)*1062 /// BinAndExpr <- EqualityExpr (AMPERSAND BinAndExpr)*
1040 fn binAndExpr(parser: *Parser) !*Node {}1063 fn binAndExpr(parser: *Parser) !*Node {
1064 @panic("TODO");
1065 }
10411066
1042 /// EqualityExpr <- ComparisionExpr ((EQUALEQUAL / BANGEQUAL) EqualityExpr)*1067 /// EqualityExpr <- ComparisionExpr ((EQUALEQUAL / BANGEQUAL) EqualityExpr)*
1043 fn equalityExpr(parser: *Parser) !*Node {}1068 fn equalityExpr(parser: *Parser) !*Node {
1069 @panic("TODO");
1070 }
10441071
1045 /// ComparisionExpr <- ShiftExpr (ANGLEBRACKETLEFT / ANGLEBRACKETLEFTEQUAL /ANGLEBRACKETRIGHT / ANGLEBRACKETRIGHTEQUAL) ComparisionExpr)*1072 /// ComparisionExpr <- ShiftExpr (ANGLEBRACKETLEFT / ANGLEBRACKETLEFTEQUAL /ANGLEBRACKETRIGHT / ANGLEBRACKETRIGHTEQUAL) ComparisionExpr)*
1046 fn comparisionExpr(parser: *Parser) !*Node {}1073 fn comparisionExpr(parser: *Parser) !*Node {
1074 @panic("TODO");
1075 }
10471076
1048 /// ShiftExpr <- AdditiveExpr (ANGLEBRACKETANGLEBRACKETLEFT / ANGLEBRACKETANGLEBRACKETRIGHT) ShiftExpr)*1077 /// ShiftExpr <- AdditiveExpr (ANGLEBRACKETANGLEBRACKETLEFT / ANGLEBRACKETANGLEBRACKETRIGHT) ShiftExpr)*
1049 fn shiftExpr(parser: *Parser) !*Node {}1078 fn shiftExpr(parser: *Parser) !*Node {
1079 @panic("TODO");
1080 }
10501081
1051 /// AdditiveExpr <- MultiplicativeExpr (PLUS / MINUS) AdditiveExpr)*1082 /// AdditiveExpr <- MultiplicativeExpr (PLUS / MINUS) AdditiveExpr)*
1052 fn additiveExpr(parser: *Parser) !*Node {}1083 fn additiveExpr(parser: *Parser) !*Node {
1084 @panic("TODO");
1085 }
10531086
1054 /// MultiplicativeExpr <- UnaryExpr (ASTERISK / SLASH / PERCENT) MultiplicativeExpr)*1087 /// MultiplicativeExpr <- UnaryExpr (ASTERISK / SLASH / PERCENT) MultiplicativeExpr)*
1055 fn multiplicativeExpr(parser: *Parser) !*Node {}1088 fn multiplicativeExpr(parser: *Parser) !*Node {
1089 @panic("TODO");
1090 }
10561091
1057 /// UnaryExpr1092 /// UnaryExpr
1058 /// <- LPAREN TypeName RPAREN UnaryExpr1093 /// <- LPAREN TypeName RPAREN UnaryExpr
...@@ -1061,19 +1096,25 @@ const Parser = struct {...@@ -1061,19 +1096,25 @@ const Parser = struct {
1061 /// / Keyword_alignof LAPERN TypeName RPAREN1096 /// / Keyword_alignof LAPERN TypeName RPAREN
1062 /// / (AMPERSAND / ASTERISK / PLUS / PLUSPLUS / MINUS / MINUSMINUS / TILDE / BANG) UnaryExpr1097 /// / (AMPERSAND / ASTERISK / PLUS / PLUSPLUS / MINUS / MINUSMINUS / TILDE / BANG) UnaryExpr
1063 /// / PrimaryExpr PostFixExpr*1098 /// / PrimaryExpr PostFixExpr*
1064 fn unaryExpr(parser: *Parser) !*Node {}1099 fn unaryExpr(parser: *Parser) !*Node {
1100 @panic("TODO");
1101 }
10651102
1066 /// PrimaryExpr1103 /// PrimaryExpr
1067 /// <- IDENTIFIER1104 /// <- IDENTIFIER
1068 /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL1105 /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL
1069 /// / LPAREN Expr RPAREN1106 /// / LPAREN Expr RPAREN
1070 /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN1107 /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN
1071 fn primaryExpr(parser: *Parser) !*Node {}1108 fn primaryExpr(parser: *Parser) !*Node {
1109 @panic("TODO");
1110 }
10721111
1073 /// Generic1112 /// Generic
1074 /// <- TypeName COLON AssignmentExpr1113 /// <- TypeName COLON AssignmentExpr
1075 /// / Keyword_default COLON AssignmentExpr1114 /// / Keyword_default COLON AssignmentExpr
1076 fn generic(parser: *Parser) !*Node {}1115 fn generic(parser: *Parser) !*Node {
1116 @panic("TODO");
1117 }
10771118
1078 /// PostFixExpr1119 /// PostFixExpr
1079 /// <- LPAREN TypeName RPAREN LBRACE Initializers RBRACE1120 /// <- LPAREN TypeName RPAREN LBRACE Initializers RBRACE
...@@ -1081,20 +1122,28 @@ const Parser = struct {...@@ -1081,20 +1122,28 @@ const Parser = struct {
1081 /// / LPAREN (AssignmentExpr (COMMA AssignmentExpr)*)? RPAREN1122 /// / LPAREN (AssignmentExpr (COMMA AssignmentExpr)*)? RPAREN
1082 /// / (PERIOD / ARROW) IDENTIFIER1123 /// / (PERIOD / ARROW) IDENTIFIER
1083 /// / (PLUSPLUS / MINUSMINUS)1124 /// / (PLUSPLUS / MINUSMINUS)
1084 fn postFixExpr(parser: *Parser) !*Node {}1125 fn postFixExpr(parser: *Parser) !*Node {
1126 @panic("TODO");
1127 }
10851128
1086 /// Initializers <- ((Designator+ EQUAL)? Initializer COMMA)* (Designator+ EQUAL)? Initializer COMMA?1129 /// Initializers <- ((Designator+ EQUAL)? Initializer COMMA)* (Designator+ EQUAL)? Initializer COMMA?
1087 fn initializers(parser: *Parser) !*Node {}1130 fn initializers(parser: *Parser) !*Node {
1131 @panic("TODO");
1132 }
10881133
1089 /// Initializer1134 /// Initializer
1090 /// <- LBRACE Initializers RBRACE1135 /// <- LBRACE Initializers RBRACE
1091 /// / AssignmentExpr1136 /// / AssignmentExpr
1092 fn initializer(parser: *Parser) !*Node {}1137 fn initializer(parser: *Parser, dr: *Node.Declarator) Error!?*Node {
1138 @panic("TODO");
1139 }
10931140
1094 /// Designator1141 /// Designator
1095 /// <- LBRACKET ConstExpr RBRACKET1142 /// <- LBRACKET ConstExpr RBRACKET
1096 /// / PERIOD IDENTIFIER1143 /// / PERIOD IDENTIFIER
1097 fn designator(parser: *Parser) !*Node {}1144 fn designator(parser: *Parser) !*Node {
1145 @panic("TODO");
1146 }
10981147
1099 /// CompoundStmt <- LBRACE (Declaration / Stmt)* RBRACE1148 /// CompoundStmt <- LBRACE (Declaration / Stmt)* RBRACE
1100 fn compoundStmt(parser: *Parser) Error!?*Node {1149 fn compoundStmt(parser: *Parser) Error!?*Node {
...@@ -1196,7 +1245,7 @@ const Parser = struct {...@@ -1196,7 +1245,7 @@ const Parser = struct {
1196 try parser.pushScope(.Loop);1245 try parser.pushScope(.Loop);
1197 defer parser.popScope();1246 defer parser.popScope();
1198 _ = try parser.expectToken(.LParen);1247 _ = try parser.expectToken(.LParen);
1199 const init = if (try parser.declaration()) |decl| blk:{1248 const init = if (try parser.declaration()) |decl| blk: {
1200 // TODO disallow storage class other than auto and register1249 // TODO disallow storage class other than auto and register
1201 break :blk decl;1250 break :blk decl;
1202 } else try parser.exprStmt();1251 } else try parser.exprStmt();
...@@ -1235,7 +1284,7 @@ const Parser = struct {...@@ -1235,7 +1284,7 @@ const Parser = struct {
1235 _ = try parser.expectToken(.Colon);1284 _ = try parser.expectToken(.Colon);
1236 const node = try parser.arena.create(Node.LabeledStmt);1285 const node = try parser.arena.create(Node.LabeledStmt);
1237 node.* = .{1286 node.* = .{
1238 .kind = .{.Default = tok },1287 .kind = .{ .Default = tok },
1239 .stmt = try parser.stmt(),1288 .stmt = try parser.stmt(),
1240 };1289 };
1241 return &node.base;1290 return &node.base;
...@@ -1244,7 +1293,7 @@ const Parser = struct {...@@ -1244,7 +1293,7 @@ const Parser = struct {
1244 _ = try parser.expectToken(.Colon);1293 _ = try parser.expectToken(.Colon);
1245 const node = try parser.arena.create(Node.LabeledStmt);1294 const node = try parser.arena.create(Node.LabeledStmt);
1246 node.* = .{1295 node.* = .{
1247 .kind = .{.Case = tok },1296 .kind = .{ .Case = tok },
1248 .stmt = try parser.stmt(),1297 .stmt = try parser.stmt(),
1249 };1298 };
1250 return &node.base;1299 return &node.base;
...@@ -1289,7 +1338,7 @@ const Parser = struct {...@@ -1289,7 +1338,7 @@ const Parser = struct {
1289 if (parser.eatToken(.Colon)) |_| {1338 if (parser.eatToken(.Colon)) |_| {
1290 const node = try parser.arena.create(Node.LabeledStmt);1339 const node = try parser.arena.create(Node.LabeledStmt);
1291 node.* = .{1340 node.* = .{
1292 .kind = .{.Label = tok },1341 .kind = .{ .Label = tok },
1293 .stmt = try parser.stmt(),1342 .stmt = try parser.stmt(),
1294 };1343 };
1295 return &node.base;1344 return &node.base;
...@@ -1379,3 +1428,4 @@ const Parser = struct {...@@ -1379,3 +1428,4 @@ const Parser = struct {
1379 });1428 });
1380 }1429 }
1381};1430};
1431