| author | |
| committer | |
| log | d5d52af26ec3d3e6a171564112978a7d8c96aba4 |
| tree | bad2266d62b55a3667430f3a8f73aca020e65186 |
| parent | 5feeff71236eb7bf8257b247660b6e9c33495ee8 |
| signature |
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 | }; |
| 131 | 133 | ||
| 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 | }; |
| 276 | 278 | ||
| 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, |
| 283 | 326 | ||
| 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 {} |
| 590 | 590 | ||
| 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 { |
| 596 | 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 | } | ||
| 597 | /// DirectDeclarator | 604 | /// DirectDeclarator |
| 598 | /// <- IDENTIFIER | 605 | /// <- IDENTIFIER |
| 599 | /// / LPAREN Declarator RPAREN | 606 | /// / LPAREN Declarator RPAREN |
| ... | @@ -687,7 +694,7 @@ const Parser = struct { | ... | @@ -687,7 +694,7 @@ const Parser = struct { |
| 687 | 694 | ||
| 688 | /// PrimaryExpr | 695 | /// PrimaryExpr |
| 689 | /// <- IDENTIFIER | 696 | /// <- IDENTIFIER |
| 690 | /// / INTEGERLITERAL / FLITERAL / STRINGLITERAL / CHARLITERAL | 697 | /// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL |
| 691 | /// / LPAREN Expr RPAREN | 698 | /// / LPAREN Expr RPAREN |
| 692 | /// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN | 699 | /// / 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 {} |
| 715 | 722 | ||
| 716 | /// Designator | 723 | /// Designator |
| 717 | /// <- LBRACKET Initializers RBRACKET | 724 | /// <- LBRACKET ConstExpr RBRACKET |
| 718 | /// / PERIOD IDENTIFIER | 725 | /// / PERIOD IDENTIFIER |
| 719 | fn designator(parser: *Parser) !*Node {} | 726 | fn designator(parser: *Parser) !*Node {} |
| 720 | 727 |