std-c parse pointer

This commit is contained in:
Vexu 2020-01-06 00:06:33 +02:00
parent 5feeff7123
commit d5d52af26e
No known key found for this signature in database
GPG Key ID: 59AEB8936E16A6AC
2 changed files with 93 additions and 12 deletions

View File

@ -126,7 +126,9 @@ pub const Node = struct {
CompoundStmt,
IfStmt,
StaticAssert,
FnDef,
Fn,
Typedef,
Var,
};
pub const Root = struct {
@ -274,13 +276,85 @@ pub const Node = struct {
semicolon: TokenIndex,
};
pub const FnDef = struct {
base: Node = Node{ .id = .FnDef },
pub const Declarator = struct {
pointer: *Pointer,
identifier: ?TokenIndex,
kind: union(enum) {
Simple,
Complex: struct {
lparen: TokenIndex,
inner: *Declarator,
rparen: TokenIndex,
},
Fn: ParamList,
Array: ArrayList,
},
pub const ArrayList = std.SegmentedList(*Array, 2);
pub const ParamList = std.SegmentedList(*Param, 4);
};
pub const Array = union(enum) {
Unspecified,
Variable: TokenIndex,
Known: *Expr,
};
pub const Pointer = struct {
asterisk: TokenIndex,
qual: TypeQual,
pointer: ?*Pointer,
};
pub const Param = struct {
kind: union(enum) {
Variable,
Old: TokenIndex,
Normal: struct {
decl_spec: *DeclSpec,
declarator: *Declarator,
},
},
};
pub const Fn = struct {
base: Node = Node{ .id = .Fn },
decl_spec: DeclSpec,
declarator: *Node,
declarator: *Declarator,
old_decls: OldDeclList,
body: *CompoundStmt,
body: ?*CompoundStmt,
pub const OldDeclList = SegmentedList(*Node, 0);
};
pub const Typedef = struct {
base: Node = Node{ .id = .Typedef },
decl_spec: DeclSpec,
declarators: DeclaratorList,
pub const DeclaratorList = std.SegmentedList(*Declarator, 2);
};
pub const Var = struct {
base: Node = Node{ .id = .Var },
decl_spec: DeclSpec,
initializers: Initializers,
pub const Initializers = std.SegmentedList(*Initialized, 2);
};
pub const Initialized = struct {
declarator: *Declarator,
eq: TokenIndex,
init: Initializer,
};
pub const Initializer = union(enum) {
list: struct {
initializers: InitializerList,
rbrace: TokenIndex,
},
expr: *Expr,
pub const InitializerList = std.SegmentedList(*Initializer, 4);
};
};

View File

@ -588,12 +588,19 @@ const Parser = struct {
/// RecordDeclarator <- Declarator? (COLON ConstExpr)?
fn recordDeclarator(parser: *Parser) !*Node {}
/// Declarator <- Pointer? DirectDeclarator
fn declarator(parser: *Parser) !*Node {}
/// Pointer <- ASTERISK TypeQual* Pointer?
fn pointer(parser: *Parser) !*Node {}
fn pointer(parser: *Parser) !?*Node.Pointer {
const asterisk = parser.eatToken(.Asterisk) orelse return null;
const node = try parser.arena.create(Node.Pointer);
node.* = .{
.asterisk = asterisk,
.qual = .{},
.pointer = null,
};
while (try parser.typeQual(&node.qual)) {}
node.pointer = try parser.pointer();
return node;
}
/// DirectDeclarator
/// <- IDENTIFIER
/// / LPAREN Declarator RPAREN
@ -687,7 +694,7 @@ const Parser = struct {
/// PrimaryExpr
/// <- IDENTIFIER
/// / INTEGERLITERAL / FLITERAL / STRINGLITERAL / CHARLITERAL
/// / INTEGERLITERAL / FLOATLITERAL / STRINGLITERAL / CHARLITERAL
/// / LPAREN Expr RPAREN
/// / Keyword_generic LPAREN AssignmentExpr (COMMA Generic)+ RPAREN
fn primaryExpr(parser: *Parser) !*Node {}
@ -714,7 +721,7 @@ const Parser = struct {
fn initializer(parser: *Parser) !*Node {}
/// Designator
/// <- LBRACKET Initializers RBRACKET
/// <- LBRACKET ConstExpr RBRACKET
/// / PERIOD IDENTIFIER
fn designator(parser: *Parser) !*Node {}