| ... | @@ -15,7 +15,6 @@ pub const Error = error{ParseError} || Allocator.Error; | ... | @@ -15,7 +15,6 @@ pub const Error = error{ParseError} || Allocator.Error; |
| 15 | pub const Options = struct { | 15 | pub const Options = struct { |
| 16 | // /// Keep simple macros unexpanded and add the definitions to the ast | 16 | // /// 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 error | 18 | /// Warning or error |
| 20 | warn_as_err: union(enum) { | 19 | warn_as_err: union(enum) { |
| 21 | /// All warnings are warnings | 20 | /// 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 | } |
| 846 | | 851 | |
| 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 | } |
| 849 | | 856 | |
| 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 | } |
| 852 | | 861 | |
| 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 | } |
| 1002 | | 1011 | |
| 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 | } |
| 1005 | | 1016 | |
| 1006 | /// AssignmentExpr | 1017 | /// 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) AssignmentExpr | 1021 | /// / AMPERSANDEQUAL / CARETEQUAL / PIPEEQUAL) AssignmentExpr |
| 1011 | fn assignmentExpr(parser: *Parser) !*Node {} | 1022 | fn assignmentExpr(parser: *Parser) !?*Expr { |
| | 1023 | @panic("TODO"); |
| | 1024 | } |
| 1012 | | 1025 | |
| 1013 | /// ConstExpr <- ConditionalExpr | 1026 | /// 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 | } |
| 1023 | | 1036 | |
| 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 | } |
| 1026 | | 1041 | |
| 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 | } |
| 1029 | | 1046 | |
| 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 | } |
| 1032 | | 1051 | |
| 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 | } |
| 1035 | | 1056 | |
| 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 | } |
| 1038 | | 1061 | |
| 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 | } |
| 1041 | | 1066 | |
| 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 | } |
| 1044 | | 1071 | |
| 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 | } |
| 1047 | | 1076 | |
| 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 | } |
| 1050 | | 1081 | |
| 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 | } |
| 1053 | | 1086 | |
| 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 | } |
| 1056 | | 1091 | |
| 1057 | /// UnaryExpr | 1092 | /// UnaryExpr |
| 1058 | /// <- LPAREN TypeName RPAREN UnaryExpr | 1093 | /// <- LPAREN TypeName RPAREN UnaryExpr |
| ... | @@ -1061,19 +1096,25 @@ const Parser = struct { | ... | @@ -1061,19 +1096,25 @@ const Parser = struct { |
| 1061 | /// / Keyword_alignof LAPERN TypeName RPAREN | 1096 | /// / Keyword_alignof LAPERN TypeName RPAREN |
| 1062 | /// / (AMPERSAND / ASTERISK / PLUS / PLUSPLUS / MINUS / MINUSMINUS / TILDE / BANG) UnaryExpr | 1097 | /// / (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 | } |
| 1065 | | 1102 | |
| 1066 | /// PrimaryExpr | 1103 | /// PrimaryExpr |
| 1067 | /// <- IDENTIFIER | 1104 | /// <- IDENTIFIER |
| 1068 | /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL | 1105 | /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL |
| 1069 | /// / LPAREN Expr RPAREN | 1106 | /// / LPAREN Expr RPAREN |
| 1070 | /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN | 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 | /// Generic | 1112 | /// Generic |
| 1074 | /// <- TypeName COLON AssignmentExpr | 1113 | /// <- TypeName COLON AssignmentExpr |
| 1075 | /// / Keyword_default COLON AssignmentExpr | 1114 | /// / Keyword_default COLON AssignmentExpr |
| 1076 | fn generic(parser: *Parser) !*Node {} | 1115 | fn generic(parser: *Parser) !*Node { |
| | 1116 | @panic("TODO"); |
| | 1117 | } |
| 1077 | | 1118 | |
| 1078 | /// PostFixExpr | 1119 | /// PostFixExpr |
| 1079 | /// <- LPAREN TypeName RPAREN LBRACE Initializers RBRACE | 1120 | /// <- 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)*)? RPAREN | 1122 | /// / LPAREN (AssignmentExpr (COMMA AssignmentExpr)*)? RPAREN |
| 1082 | /// / (PERIOD / ARROW) IDENTIFIER | 1123 | /// / (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 | } |
| 1085 | | 1128 | |
| 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 | } |
| 1088 | | 1133 | |
| 1089 | /// Initializer | 1134 | /// Initializer |
| 1090 | /// <- LBRACE Initializers RBRACE | 1135 | /// <- LBRACE Initializers RBRACE |
| 1091 | /// / AssignmentExpr | 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 | /// Designator | 1141 | /// Designator |
| 1095 | /// <- LBRACKET ConstExpr RBRACKET | 1142 | /// <- LBRACKET ConstExpr RBRACKET |
| 1096 | /// / PERIOD IDENTIFIER | 1143 | /// / PERIOD IDENTIFIER |
| 1097 | fn designator(parser: *Parser) !*Node {} | 1144 | fn designator(parser: *Parser) !*Node { |
| | 1145 | @panic("TODO"); |
| | 1146 | } |
| 1098 | | 1147 | |
| 1099 | /// CompoundStmt <- LBRACE (Declaration / Stmt)* RBRACE | 1148 | /// 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 register | 1249 | // 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 | |