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 {
126126 CompoundStmt,
127127 IfStmt,
128128 StaticAssert,
129 FnDef,
129 Fn,
130 Typedef,
131 Var,
130132 };
131133
132134 pub const Root = struct {
......@@ -274,13 +276,85 @@ pub const Node = struct {
274276 semicolon: TokenIndex,
275277 };
276278
277 pub const FnDef = struct {
278 base: Node = Node{ .id = .FnDef },
279 pub const Declarator = struct {
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 },
279322 decl_spec: DeclSpec,
280 declarator: *Node,
323 declarator: *Declarator,
281324 old_decls: OldDeclList,
282 body: *CompoundStmt,
325 body: ?*CompoundStmt,
283326
284327 pub const OldDeclList = SegmentedList(*Node, 0);
285328 };
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 };
286360};
lib/std/c/parse.zig+14-7
......@@ -588,12 +588,19 @@ const Parser = struct {
588588 /// RecordDeclarator <- Declarator? (COLON ConstExpr)?
589589 fn recordDeclarator(parser: *Parser) !*Node {}
590590
591 /// Declarator <- Pointer? DirectDeclarator
592 fn declarator(parser: *Parser) !*Node {}
593
594591 /// Pointer <- ASTERISK TypeQual* Pointer?
595 fn pointer(parser: *Parser) !*Node {}
596
592 fn pointer(parser: *Parser) !?*Node.Pointer {
593 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 }
597604 /// DirectDeclarator
598605 /// <- IDENTIFIER
599606 /// / LPAREN Declarator RPAREN
......@@ -687,7 +694,7 @@ const Parser = struct {
687694
688695 /// PrimaryExpr
689696 /// <- IDENTIFIER
690 /// / INTEGERLITERAL / FLITERAL / STRINGLITERAL / CHARLITERAL
697 /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL
691698 /// / LPAREN Expr RPAREN
692699 /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN
693700 fn primaryExpr(parser: *Parser) !*Node {}
......@@ -714,7 +721,7 @@ const Parser = struct {
714721 fn initializer(parser: *Parser) !*Node {}
715722
716723 /// Designator
717 /// <- LBRACKET Initializers RBRACKET
724 /// <- LBRACKET ConstExpr RBRACKET
718725 /// / PERIOD IDENTIFIER
719726 fn designator(parser: *Parser) !*Node {}
720727