mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
std-c parse pointer
This commit is contained in:
parent
5feeff7123
commit
d5d52af26e
@ -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);
|
||||
};
|
||||
};
|
||||
|
||||
@ -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 {}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user