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
signature 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 {
656656 },
657657 };
658658};
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;
1515pub const Options = struct {
1616 // /// Keep simple macros unexpanded and add the definitions to the ast
1717 // retain_macros: bool = false,
18
1918 /// Warning or error
2019 warn_as_err: union(enum) {
2120 /// All warnings are warnings
......@@ -335,7 +334,9 @@ const Parser = struct {
335334 fn staticAssert(parser: *Parser) !?*Node {
336335 const tok = parser.eatToken(.Keyword_static_assert) orelse return null;
337336 _ = 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 });
339340 _ = try parser.expectToken(.Comma);
340341 const str = try parser.expectToken(.StringLiteral);
341342 _ = try parser.expectToken(.RParen);
......@@ -707,7 +708,9 @@ const Parser = struct {
707708 fn alignSpec(parser: *Parser, ds: *Node.DeclSpec) !bool {
708709 if (parser.eatToken(.Keyword_alignas)) |tok| {
709710 _ = 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 });
711714 if (ds.align_spec != null) {
712715 try parser.warn(.{
713716 .DuplicateSpecifier = .{ .token = parser.it.index },
......@@ -769,7 +772,9 @@ const Parser = struct {
769772 .value = null,
770773 };
771774 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 });
773778 }
774779 return &node.base;
775780 }
......@@ -845,10 +850,14 @@ const Parser = struct {
845850 }
846851
847852 /// TypeName <- TypeSpec* AbstractDeclarator?
848 fn typeName(parser: *Parser) !*Node {
853 fn typeName(parser: *Parser) Error!?*Node {
854 @panic("TODO");
855 }
849856
850857 /// RecordDeclarator <- Declarator? (COLON ConstExpr)?
851 fn recordDeclarator(parser: *Parser) !*Node {}
858 fn recordDeclarator(parser: *Parser) Error!*Node.RecordDeclarator {
859 @panic("TODO");
860 }
852861
853862 /// Pointer <- ASTERISK TypeQual* Pointer?
854863 fn pointer(parser: *Parser) Error!?*Node.Pointer {
......@@ -1001,14 +1010,18 @@ const Parser = struct {
10011010 }
10021011
10031012 /// Expr <- AssignmentExpr (COMMA Expr)*
1004 fn expr(parser: *Parser) !*Node {}
1013 fn expr(parser: *Parser) Error!?*Expr {
1014 @panic("TODO");
1015 }
10051016
10061017 /// AssignmentExpr
10071018 /// <- ConditionalExpr // TODO recursive?
10081019 /// / UnaryExpr (EQUAL / ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUA /
10091020 /// / ANGLEBRACKETANGLEBRACKETLEFTEQUAL / ANGLEBRACKETANGLEBRACKETRIGHTEQUAL /
10101021 /// / AMPERSANDEQUAL / CARETEQUAL / PIPEEQUAL) AssignmentExpr
1011 fn assignmentExpr(parser: *Parser) !*Node {}
1022 fn assignmentExpr(parser: *Parser) !?*Expr {
1023 @panic("TODO");
1024 }
10121025
10131026 /// ConstExpr <- ConditionalExpr
10141027 fn constExpr(parser: *Parser) Error!?*Expr {
......@@ -1022,37 +1035,59 @@ const Parser = struct {
10221035 }
10231036
10241037 /// ConditionalExpr <- LogicalOrExpr (QUESTIONMARK Expr COLON ConditionalExpr)?
1025 fn conditionalExpr(parser: *Parser) !*Node {}
1038 fn conditionalExpr(parser: *Parser) Error!?*Expr {
1039 @panic("TODO");
1040 }
10261041
10271042 /// 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
10301047 /// LogicalAndExpr <- BinOrExpr (AMPERSANDAMPERSAND LogicalAndExpr)*
1031 fn logicalAndExpr(parser: *Parser) !*Node {}
1048 fn logicalAndExpr(parser: *Parser) !*Node {
1049 @panic("TODO");
1050 }
10321051
10331052 /// BinOrExpr <- BinXorExpr (PIPE BinOrExpr)*
1034 fn binOrExpr(parser: *Parser) !*Node {}
1053 fn binOrExpr(parser: *Parser) !*Node {
1054 @panic("TODO");
1055 }
10351056
10361057 /// BinXorExpr <- BinAndExpr (CARET BinXorExpr)*
1037 fn binXorExpr(parser: *Parser) !*Node {}
1058 fn binXorExpr(parser: *Parser) !*Node {
1059 @panic("TODO");
1060 }
10381061
10391062 /// BinAndExpr <- EqualityExpr (AMPERSAND BinAndExpr)*
1040 fn binAndExpr(parser: *Parser) !*Node {}
1063 fn binAndExpr(parser: *Parser) !*Node {
1064 @panic("TODO");
1065 }
10411066
10421067 /// EqualityExpr <- ComparisionExpr ((EQUALEQUAL / BANGEQUAL) EqualityExpr)*
1043 fn equalityExpr(parser: *Parser) !*Node {}
1068 fn equalityExpr(parser: *Parser) !*Node {
1069 @panic("TODO");
1070 }
10441071
10451072 /// ComparisionExpr <- ShiftExpr (ANGLEBRACKETLEFT / ANGLEBRACKETLEFTEQUAL /ANGLEBRACKETRIGHT / ANGLEBRACKETRIGHTEQUAL) ComparisionExpr)*
1046 fn comparisionExpr(parser: *Parser) !*Node {}
1073 fn comparisionExpr(parser: *Parser) !*Node {
1074 @panic("TODO");
1075 }
10471076
10481077 /// ShiftExpr <- AdditiveExpr (ANGLEBRACKETANGLEBRACKETLEFT / ANGLEBRACKETANGLEBRACKETRIGHT) ShiftExpr)*
1049 fn shiftExpr(parser: *Parser) !*Node {}
1078 fn shiftExpr(parser: *Parser) !*Node {
1079 @panic("TODO");
1080 }
10501081
10511082 /// AdditiveExpr <- MultiplicativeExpr (PLUS / MINUS) AdditiveExpr)*
1052 fn additiveExpr(parser: *Parser) !*Node {}
1083 fn additiveExpr(parser: *Parser) !*Node {
1084 @panic("TODO");
1085 }
10531086
10541087 /// MultiplicativeExpr <- UnaryExpr (ASTERISK / SLASH / PERCENT) MultiplicativeExpr)*
1055 fn multiplicativeExpr(parser: *Parser) !*Node {}
1088 fn multiplicativeExpr(parser: *Parser) !*Node {
1089 @panic("TODO");
1090 }
10561091
10571092 /// UnaryExpr
10581093 /// <- LPAREN TypeName RPAREN UnaryExpr
......@@ -1061,19 +1096,25 @@ const Parser = struct {
10611096 /// / Keyword_alignof LAPERN TypeName RPAREN
10621097 /// / (AMPERSAND / ASTERISK / PLUS / PLUSPLUS / MINUS / MINUSMINUS / TILDE / BANG) UnaryExpr
10631098 /// / PrimaryExpr PostFixExpr*
1064 fn unaryExpr(parser: *Parser) !*Node {}
1099 fn unaryExpr(parser: *Parser) !*Node {
1100 @panic("TODO");
1101 }
10651102
10661103 /// PrimaryExpr
10671104 /// <- IDENTIFIER
10681105 /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL
10691106 /// / LPAREN Expr RPAREN
10701107 /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN
1071 fn primaryExpr(parser: *Parser) !*Node {}
1108 fn primaryExpr(parser: *Parser) !*Node {
1109 @panic("TODO");
1110 }
10721111
10731112 /// Generic
10741113 /// <- TypeName COLON AssignmentExpr
10751114 /// / Keyword_default COLON AssignmentExpr
1076 fn generic(parser: *Parser) !*Node {}
1115 fn generic(parser: *Parser) !*Node {
1116 @panic("TODO");
1117 }
10771118
10781119 /// PostFixExpr
10791120 /// <- LPAREN TypeName RPAREN LBRACE Initializers RBRACE
......@@ -1081,20 +1122,28 @@ const Parser = struct {
10811122 /// / LPAREN (AssignmentExpr (COMMA AssignmentExpr)*)? RPAREN
10821123 /// / (PERIOD / ARROW) IDENTIFIER
10831124 /// / (PLUSPLUS / MINUSMINUS)
1084 fn postFixExpr(parser: *Parser) !*Node {}
1125 fn postFixExpr(parser: *Parser) !*Node {
1126 @panic("TODO");
1127 }
10851128
10861129 /// 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
10891134 /// Initializer
10901135 /// <- LBRACE Initializers RBRACE
10911136 /// / AssignmentExpr
1092 fn initializer(parser: *Parser) !*Node {}
1137 fn initializer(parser: *Parser, dr: *Node.Declarator) Error!?*Node {
1138 @panic("TODO");
1139 }
10931140
10941141 /// Designator
10951142 /// <- LBRACKET ConstExpr RBRACKET
10961143 /// / PERIOD IDENTIFIER
1097 fn designator(parser: *Parser) !*Node {}
1144 fn designator(parser: *Parser) !*Node {
1145 @panic("TODO");
1146 }
10981147
10991148 /// CompoundStmt <- LBRACE (Declaration / Stmt)* RBRACE
11001149 fn compoundStmt(parser: *Parser) Error!?*Node {
......@@ -1196,7 +1245,7 @@ const Parser = struct {
11961245 try parser.pushScope(.Loop);
11971246 defer parser.popScope();
11981247 _ = try parser.expectToken(.LParen);
1199 const init = if (try parser.declaration()) |decl| blk:{
1248 const init = if (try parser.declaration()) |decl| blk: {
12001249 // TODO disallow storage class other than auto and register
12011250 break :blk decl;
12021251 } else try parser.exprStmt();
......@@ -1235,7 +1284,7 @@ const Parser = struct {
12351284 _ = try parser.expectToken(.Colon);
12361285 const node = try parser.arena.create(Node.LabeledStmt);
12371286 node.* = .{
1238 .kind = .{.Default = tok },
1287 .kind = .{ .Default = tok },
12391288 .stmt = try parser.stmt(),
12401289 };
12411290 return &node.base;
......@@ -1244,7 +1293,7 @@ const Parser = struct {
12441293 _ = try parser.expectToken(.Colon);
12451294 const node = try parser.arena.create(Node.LabeledStmt);
12461295 node.* = .{
1247 .kind = .{.Case = tok },
1296 .kind = .{ .Case = tok },
12481297 .stmt = try parser.stmt(),
12491298 };
12501299 return &node.base;
......@@ -1289,7 +1338,7 @@ const Parser = struct {
12891338 if (parser.eatToken(.Colon)) |_| {
12901339 const node = try parser.arena.create(Node.LabeledStmt);
12911340 node.* = .{
1292 .kind = .{.Label = tok },
1341 .kind = .{ .Label = tok },
12931342 .stmt = try parser.stmt(),
12941343 };
12951344 return &node.base;
......@@ -1379,3 +1428,4 @@ const Parser = struct {
13791428 });
13801429 }
13811430};
1431