authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-06 00:06:33+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-06 00:06:33+02:00
logd5d52af26ec3d3e6a171564112978a7d8c96aba4
treebad2266d62b55a3667430f3a8f73aca020e65186
parent5feeff71236eb7bf8257b247660b6e9c33495ee8
signature Commit is signed but in an unrecognized format.

std-c parse pointer


2 files changed, 93 insertions(+), 12 deletions(-)

lib/std/c/ast.zig+79-5
...@@ -126,7 +126,9 @@ pub const Node = struct {...@@ -126,7 +126,9 @@ pub const Node = struct {
126 CompoundStmt,126 CompoundStmt,
127 IfStmt,127 IfStmt,
128 StaticAssert,128 StaticAssert,
129 FnDef,129 Fn,
130 Typedef,
131 Var,
130 };132 };
131133
132 pub const Root = struct {134 pub const Root = struct {
...@@ -274,13 +276,85 @@ pub const Node = struct {...@@ -274,13 +276,85 @@ pub const Node = struct {
274 semicolon: TokenIndex,276 semicolon: TokenIndex,
275 };277 };
276278
277 pub const FnDef = struct {279 pub const Declarator = struct {
278 base: Node = Node{ .id = .FnDef },280 pointer: *Pointer,
281 identifier: ?TokenIndex,
282 kind: union(enum) {
283 Simple,
284 Complex: struct {
285 lparen: TokenIndex,
286 inner: *Declarator,
287 rparen: TokenIndex,
288 },
289 Fn: ParamList,
290 Array: ArrayList,
291 },
292
293 pub const ArrayList = std.SegmentedList(*Array, 2);
294 pub const ParamList = std.SegmentedList(*Param, 4);
295 };
296
297 pub const Array = union(enum) {
298 Unspecified,
299 Variable: TokenIndex,
300 Known: *Expr,
301 };
302
303 pub const Pointer = struct {
304 asterisk: TokenIndex,
305 qual: TypeQual,
306 pointer: ?*Pointer,
307 };
308
309 pub const Param = struct {
310 kind: union(enum) {
311 Variable,
312 Old: TokenIndex,
313 Normal: struct {
314 decl_spec: *DeclSpec,
315 declarator: *Declarator,
316 },
317 },
318 };
319
320 pub const Fn = struct {
321 base: Node = Node{ .id = .Fn },
279 decl_spec: DeclSpec,322 decl_spec: DeclSpec,
280 declarator: *Node,323 declarator: *Declarator,
281 old_decls: OldDeclList,324 old_decls: OldDeclList,
282 body: *CompoundStmt,325 body: ?*CompoundStmt,
283326
284 pub const OldDeclList = SegmentedList(*Node, 0);327 pub const OldDeclList = SegmentedList(*Node, 0);
285 };328 };
329
330 pub const Typedef = struct {
331 base: Node = Node{ .id = .Typedef },
332 decl_spec: DeclSpec,
333 declarators: DeclaratorList,
334
335 pub const DeclaratorList = std.SegmentedList(*Declarator, 2);
336 };
337
338 pub const Var = struct {
339 base: Node = Node{ .id = .Var },
340 decl_spec: DeclSpec,
341 initializers: Initializers,
342
343 pub const Initializers = std.SegmentedList(*Initialized, 2);
344 };
345
346 pub const Initialized = struct {
347 declarator: *Declarator,
348 eq: TokenIndex,
349 init: Initializer,
350 };
351
352 pub const Initializer = union(enum) {
353 list: struct {
354 initializers: InitializerList,
355 rbrace: TokenIndex,
356 },
357 expr: *Expr,
358 pub const InitializerList = std.SegmentedList(*Initializer, 4);
359 };
286};360};
lib/std/c/parse.zig+14-7
...@@ -588,12 +588,19 @@ const Parser = struct {...@@ -588,12 +588,19 @@ const Parser = struct {
588 /// RecordDeclarator <- Declarator? (COLON ConstExpr)?588 /// RecordDeclarator <- Declarator? (COLON ConstExpr)?
589 fn recordDeclarator(parser: *Parser) !*Node {}589 fn recordDeclarator(parser: *Parser) !*Node {}
590590
591 /// Declarator <- Pointer? DirectDeclarator
592 fn declarator(parser: *Parser) !*Node {}
593
594 /// Pointer <- ASTERISK TypeQual* Pointer?591 /// Pointer <- ASTERISK TypeQual* Pointer?
595 fn pointer(parser: *Parser) !*Node {}592 fn pointer(parser: *Parser) !?*Node.Pointer {
596593 const asterisk = parser.eatToken(.Asterisk) orelse return null;
594 const node = try parser.arena.create(Node.Pointer);
595 node.* = .{
596 .asterisk = asterisk,
597 .qual = .{},
598 .pointer = null,
599 };
600 while (try parser.typeQual(&node.qual)) {}
601 node.pointer = try parser.pointer();
602 return node;
603 }
597 /// DirectDeclarator604 /// DirectDeclarator
598 /// <- IDENTIFIER605 /// <- IDENTIFIER
599 /// / LPAREN Declarator RPAREN606 /// / LPAREN Declarator RPAREN
...@@ -687,7 +694,7 @@ const Parser = struct {...@@ -687,7 +694,7 @@ const Parser = struct {
687694
688 /// PrimaryExpr695 /// PrimaryExpr
689 /// <- IDENTIFIER696 /// <- IDENTIFIER
690 /// / INTEGERLITERAL / FLITERAL / STRINGLITERAL / CHARLITERAL697 /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL
691 /// / LPAREN Expr RPAREN698 /// / LPAREN Expr RPAREN
692 /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN699 /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN
693 fn primaryExpr(parser: *Parser) !*Node {}700 fn primaryExpr(parser: *Parser) !*Node {}
...@@ -714,7 +721,7 @@ const Parser = struct {...@@ -714,7 +721,7 @@ const Parser = struct {
714 fn initializer(parser: *Parser) !*Node {}721 fn initializer(parser: *Parser) !*Node {}
715722
716 /// Designator723 /// Designator
717 /// <- LBRACKET Initializers RBRACKET724 /// <- LBRACKET ConstExpr RBRACKET
718 /// / PERIOD IDENTIFIER725 /// / PERIOD IDENTIFIER
719 fn designator(parser: *Parser) !*Node {}726 fn designator(parser: *Parser) !*Node {}
720727