| ... | ... | @@ -15,7 +15,6 @@ pub const Error = error{ParseError} || Allocator.Error; |
| 15 | 15 | pub const Options = struct { |
| 16 | 16 | // /// Keep simple macros unexpanded and add the definitions to the ast |
| 17 | 17 | // retain_macros: bool = false, |
| 18 | | |
| 19 | 18 | /// Warning or error |
| 20 | 19 | warn_as_err: union(enum) { |
| 21 | 20 | /// All warnings are warnings |
| ... | ... | @@ -335,7 +334,9 @@ const Parser = struct { |
| 335 | 334 | fn staticAssert(parser: *Parser) !?*Node { |
| 336 | 335 | const tok = parser.eatToken(.Keyword_static_assert) orelse return null; |
| 337 | 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 | 340 | _ = try parser.expectToken(.Comma); |
| 340 | 341 | const str = try parser.expectToken(.StringLiteral); |
| 341 | 342 | _ = try parser.expectToken(.RParen); |
| ... | ... | @@ -707,7 +708,9 @@ const Parser = struct { |
| 707 | 708 | fn alignSpec(parser: *Parser, ds: *Node.DeclSpec) !bool { |
| 708 | 709 | if (parser.eatToken(.Keyword_alignas)) |tok| { |
| 709 | 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 | 714 | if (ds.align_spec != null) { |
| 712 | 715 | try parser.warn(.{ |
| 713 | 716 | .DuplicateSpecifier = .{ .token = parser.it.index }, |
| ... | ... | @@ -769,7 +772,9 @@ const Parser = struct { |
| 769 | 772 | .value = null, |
| 770 | 773 | }; |
| 771 | 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 | 779 | return &node.base; |
| 775 | 780 | } |
| ... | ... | @@ -845,10 +850,14 @@ const Parser = struct { |
| 845 | 850 | } |
| 846 | 851 | |
| 847 | 852 | /// TypeName <- TypeSpec* AbstractDeclarator? |
| 848 | | fn typeName(parser: *Parser) !*Node { |
| 853 | fn typeName(parser: *Parser) Error!?*Node { |
| 854 | @panic("TODO"); |
| 855 | } |
| 849 | 856 | |
| 850 | 857 | /// RecordDeclarator <- Declarator? (COLON ConstExpr)? |
| 851 | | fn recordDeclarator(parser: *Parser) !*Node {} |
| 858 | fn recordDeclarator(parser: *Parser) Error!*Node.RecordDeclarator { |
| 859 | @panic("TODO"); |
| 860 | } |
| 852 | 861 | |
| 853 | 862 | /// Pointer <- ASTERISK TypeQual* Pointer? |
| 854 | 863 | fn pointer(parser: *Parser) Error!?*Node.Pointer { |
| ... | ... | @@ -1001,14 +1010,18 @@ const Parser = struct { |
| 1001 | 1010 | } |
| 1002 | 1011 | |
| 1003 | 1012 | /// Expr <- AssignmentExpr (COMMA Expr)* |
| 1004 | | fn expr(parser: *Parser) !*Node {} |
| 1013 | fn expr(parser: *Parser) Error!?*Expr { |
| 1014 | @panic("TODO"); |
| 1015 | } |
| 1005 | 1016 | |
| 1006 | 1017 | /// AssignmentExpr |
| 1007 | 1018 | /// <- ConditionalExpr // TODO recursive? |
| 1008 | 1019 | /// / UnaryExpr (EQUAL / ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUA / |
| 1009 | 1020 | /// / ANGLEBRACKETANGLEBRACKETLEFTEQUAL / ANGLEBRACKETANGLEBRACKETRIGHTEQUAL / |
| 1010 | 1021 | /// / AMPERSANDEQUAL / CARETEQUAL / PIPEEQUAL) AssignmentExpr |
| 1011 | | fn assignmentExpr(parser: *Parser) !*Node {} |
| 1022 | fn assignmentExpr(parser: *Parser) !?*Expr { |
| 1023 | @panic("TODO"); |
| 1024 | } |
| 1012 | 1025 | |
| 1013 | 1026 | /// ConstExpr <- ConditionalExpr |
| 1014 | 1027 | fn constExpr(parser: *Parser) Error!?*Expr { |
| ... | ... | @@ -1022,37 +1035,59 @@ const Parser = struct { |
| 1022 | 1035 | } |
| 1023 | 1036 | |
| 1024 | 1037 | /// ConditionalExpr <- LogicalOrExpr (QUESTIONMARK Expr COLON ConditionalExpr)? |
| 1025 | | fn conditionalExpr(parser: *Parser) !*Node {} |
| 1038 | fn conditionalExpr(parser: *Parser) Error!?*Expr { |
| 1039 | @panic("TODO"); |
| 1040 | } |
| 1026 | 1041 | |
| 1027 | 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 | } |
| 1029 | 1046 | |
| 1030 | 1047 | /// LogicalAndExpr <- BinOrExpr (AMPERSANDAMPERSAND LogicalAndExpr)* |
| 1031 | | fn logicalAndExpr(parser: *Parser) !*Node {} |
| 1048 | fn logicalAndExpr(parser: *Parser) !*Node { |
| 1049 | @panic("TODO"); |
| 1050 | } |
| 1032 | 1051 | |
| 1033 | 1052 | /// BinOrExpr <- BinXorExpr (PIPE BinOrExpr)* |
| 1034 | | fn binOrExpr(parser: *Parser) !*Node {} |
| 1053 | fn binOrExpr(parser: *Parser) !*Node { |
| 1054 | @panic("TODO"); |
| 1055 | } |
| 1035 | 1056 | |
| 1036 | 1057 | /// BinXorExpr <- BinAndExpr (CARET BinXorExpr)* |
| 1037 | | fn binXorExpr(parser: *Parser) !*Node {} |
| 1058 | fn binXorExpr(parser: *Parser) !*Node { |
| 1059 | @panic("TODO"); |
| 1060 | } |
| 1038 | 1061 | |
| 1039 | 1062 | /// BinAndExpr <- EqualityExpr (AMPERSAND BinAndExpr)* |
| 1040 | | fn binAndExpr(parser: *Parser) !*Node {} |
| 1063 | fn binAndExpr(parser: *Parser) !*Node { |
| 1064 | @panic("TODO"); |
| 1065 | } |
| 1041 | 1066 | |
| 1042 | 1067 | /// EqualityExpr <- ComparisionExpr ((EQUALEQUAL / BANGEQUAL) EqualityExpr)* |
| 1043 | | fn equalityExpr(parser: *Parser) !*Node {} |
| 1068 | fn equalityExpr(parser: *Parser) !*Node { |
| 1069 | @panic("TODO"); |
| 1070 | } |
| 1044 | 1071 | |
| 1045 | 1072 | /// ComparisionExpr <- ShiftExpr (ANGLEBRACKETLEFT / ANGLEBRACKETLEFTEQUAL /ANGLEBRACKETRIGHT / ANGLEBRACKETRIGHTEQUAL) ComparisionExpr)* |
| 1046 | | fn comparisionExpr(parser: *Parser) !*Node {} |
| 1073 | fn comparisionExpr(parser: *Parser) !*Node { |
| 1074 | @panic("TODO"); |
| 1075 | } |
| 1047 | 1076 | |
| 1048 | 1077 | /// ShiftExpr <- AdditiveExpr (ANGLEBRACKETANGLEBRACKETLEFT / ANGLEBRACKETANGLEBRACKETRIGHT) ShiftExpr)* |
| 1049 | | fn shiftExpr(parser: *Parser) !*Node {} |
| 1078 | fn shiftExpr(parser: *Parser) !*Node { |
| 1079 | @panic("TODO"); |
| 1080 | } |
| 1050 | 1081 | |
| 1051 | 1082 | /// AdditiveExpr <- MultiplicativeExpr (PLUS / MINUS) AdditiveExpr)* |
| 1052 | | fn additiveExpr(parser: *Parser) !*Node {} |
| 1083 | fn additiveExpr(parser: *Parser) !*Node { |
| 1084 | @panic("TODO"); |
| 1085 | } |
| 1053 | 1086 | |
| 1054 | 1087 | /// MultiplicativeExpr <- UnaryExpr (ASTERISK / SLASH / PERCENT) MultiplicativeExpr)* |
| 1055 | | fn multiplicativeExpr(parser: *Parser) !*Node {} |
| 1088 | fn multiplicativeExpr(parser: *Parser) !*Node { |
| 1089 | @panic("TODO"); |
| 1090 | } |
| 1056 | 1091 | |
| 1057 | 1092 | /// UnaryExpr |
| 1058 | 1093 | /// <- LPAREN TypeName RPAREN UnaryExpr |
| ... | ... | @@ -1061,19 +1096,25 @@ const Parser = struct { |
| 1061 | 1096 | /// / Keyword_alignof LAPERN TypeName RPAREN |
| 1062 | 1097 | /// / (AMPERSAND / ASTERISK / PLUS / PLUSPLUS / MINUS / MINUSMINUS / TILDE / BANG) UnaryExpr |
| 1063 | 1098 | /// / PrimaryExpr PostFixExpr* |
| 1064 | | fn unaryExpr(parser: *Parser) !*Node {} |
| 1099 | fn unaryExpr(parser: *Parser) !*Node { |
| 1100 | @panic("TODO"); |
| 1101 | } |
| 1065 | 1102 | |
| 1066 | 1103 | /// PrimaryExpr |
| 1067 | 1104 | /// <- IDENTIFIER |
| 1068 | 1105 | /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL |
| 1069 | 1106 | /// / LPAREN Expr RPAREN |
| 1070 | 1107 | /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN |
| 1071 | | fn primaryExpr(parser: *Parser) !*Node {} |
| 1108 | fn primaryExpr(parser: *Parser) !*Node { |
| 1109 | @panic("TODO"); |
| 1110 | } |
| 1072 | 1111 | |
| 1073 | 1112 | /// Generic |
| 1074 | 1113 | /// <- TypeName COLON AssignmentExpr |
| 1075 | 1114 | /// / Keyword_default COLON AssignmentExpr |
| 1076 | | fn generic(parser: *Parser) !*Node {} |
| 1115 | fn generic(parser: *Parser) !*Node { |
| 1116 | @panic("TODO"); |
| 1117 | } |
| 1077 | 1118 | |
| 1078 | 1119 | /// PostFixExpr |
| 1079 | 1120 | /// <- LPAREN TypeName RPAREN LBRACE Initializers RBRACE |
| ... | ... | @@ -1081,20 +1122,28 @@ const Parser = struct { |
| 1081 | 1122 | /// / LPAREN (AssignmentExpr (COMMA AssignmentExpr)*)? RPAREN |
| 1082 | 1123 | /// / (PERIOD / ARROW) IDENTIFIER |
| 1083 | 1124 | /// / (PLUSPLUS / MINUSMINUS) |
| 1084 | | fn postFixExpr(parser: *Parser) !*Node {} |
| 1125 | fn postFixExpr(parser: *Parser) !*Node { |
| 1126 | @panic("TODO"); |
| 1127 | } |
| 1085 | 1128 | |
| 1086 | 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 | } |
| 1088 | 1133 | |
| 1089 | 1134 | /// Initializer |
| 1090 | 1135 | /// <- LBRACE Initializers RBRACE |
| 1091 | 1136 | /// / AssignmentExpr |
| 1092 | | fn initializer(parser: *Parser) !*Node {} |
| 1137 | fn initializer(parser: *Parser, dr: *Node.Declarator) Error!?*Node { |
| 1138 | @panic("TODO"); |
| 1139 | } |
| 1093 | 1140 | |
| 1094 | 1141 | /// Designator |
| 1095 | 1142 | /// <- LBRACKET ConstExpr RBRACKET |
| 1096 | 1143 | /// / PERIOD IDENTIFIER |
| 1097 | | fn designator(parser: *Parser) !*Node {} |
| 1144 | fn designator(parser: *Parser) !*Node { |
| 1145 | @panic("TODO"); |
| 1146 | } |
| 1098 | 1147 | |
| 1099 | 1148 | /// CompoundStmt <- LBRACE (Declaration / Stmt)* RBRACE |
| 1100 | 1149 | fn compoundStmt(parser: *Parser) Error!?*Node { |
| ... | ... | @@ -1196,7 +1245,7 @@ const Parser = struct { |
| 1196 | 1245 | try parser.pushScope(.Loop); |
| 1197 | 1246 | defer parser.popScope(); |
| 1198 | 1247 | _ = try parser.expectToken(.LParen); |
| 1199 | | const init = if (try parser.declaration()) |decl| blk:{ |
| 1248 | const init = if (try parser.declaration()) |decl| blk: { |
| 1200 | 1249 | // TODO disallow storage class other than auto and register |
| 1201 | 1250 | break :blk decl; |
| 1202 | 1251 | } else try parser.exprStmt(); |
| ... | ... | @@ -1235,7 +1284,7 @@ const Parser = struct { |
| 1235 | 1284 | _ = try parser.expectToken(.Colon); |
| 1236 | 1285 | const node = try parser.arena.create(Node.LabeledStmt); |
| 1237 | 1286 | node.* = .{ |
| 1238 | | .kind = .{.Default = tok }, |
| 1287 | .kind = .{ .Default = tok }, |
| 1239 | 1288 | .stmt = try parser.stmt(), |
| 1240 | 1289 | }; |
| 1241 | 1290 | return &node.base; |
| ... | ... | @@ -1244,7 +1293,7 @@ const Parser = struct { |
| 1244 | 1293 | _ = try parser.expectToken(.Colon); |
| 1245 | 1294 | const node = try parser.arena.create(Node.LabeledStmt); |
| 1246 | 1295 | node.* = .{ |
| 1247 | | .kind = .{.Case = tok }, |
| 1296 | .kind = .{ .Case = tok }, |
| 1248 | 1297 | .stmt = try parser.stmt(), |
| 1249 | 1298 | }; |
| 1250 | 1299 | return &node.base; |
| ... | ... | @@ -1289,7 +1338,7 @@ const Parser = struct { |
| 1289 | 1338 | if (parser.eatToken(.Colon)) |_| { |
| 1290 | 1339 | const node = try parser.arena.create(Node.LabeledStmt); |
| 1291 | 1340 | node.* = .{ |
| 1292 | | .kind = .{.Label = tok }, |
| 1341 | .kind = .{ .Label = tok }, |
| 1293 | 1342 | .stmt = try parser.stmt(), |
| 1294 | 1343 | }; |
| 1295 | 1344 | return &node.base; |
| ... | ... | @@ -1379,3 +1428,4 @@ const Parser = struct { |
| 1379 | 1428 | }); |
| 1380 | 1429 | } |
| 1381 | 1430 | }; |
| 1431 | |