authorgravatar for 14938807+xackus@users.noreply.github.comxackus <14938807+xackus@users.noreply.github.com> 2020-01-10 22:48:51+01:00
committergravatar for 14938807+xackus@users.noreply.github.comxackus <14938807+xackus@users.noreply.github.com> 2020-01-10 22:48:51+01:00
log5880eb3a75b41d8ac26faa0185a83e001197a6e4
treef1384393129fd63a70ca5eb60223ebfda04b9c6b
parentf81529fab17fe1a7ded4f1aae959159563f09efb

stage2 parser: document undefined and clean up


3 files changed, 30 insertions(+), 26 deletions(-)

lib/std/zig/ast.zig+2-1
......@@ -10,6 +10,7 @@ pub const TokenIndex = usize;
1010pub const Tree = struct {
1111 source: []const u8,
1212 tokens: TokenList,
13 /// undefined on parse error (errors not empty)
1314 root_node: *Node.Root,
1415 arena_allocator: std.heap.ArenaAllocator,
1516 errors: ErrorList,
......@@ -612,7 +613,7 @@ pub const Node = struct {
612613 visib_token: ?TokenIndex,
613614 thread_local_token: ?TokenIndex,
614615 name_token: TokenIndex,
615 eq_token: TokenIndex,
616 eq_token: ?TokenIndex,
616617 mut_token: TokenIndex,
617618 comptime_token: ?TokenIndex,
618619 extern_export_token: ?TokenIndex,
lib/std/zig/parse.zig+27-24
......@@ -13,7 +13,7 @@ pub const Error = error{ParseError} || Allocator.Error;
1313
1414/// Result should be freed with tree.deinit() when there are
1515/// no more references to any of the tokens or nodes.
16pub fn parse(allocator: *Allocator, source: []const u8) !*Tree {
16pub fn parse(allocator: *Allocator, source: []const u8) Allocator.Error!*Tree {
1717 const tree = blk: {
1818 // This block looks unnecessary, but is a "foot-shield" to prevent the SegmentedLists
1919 // from being initialized with a pointer to this `arena`, which is created on
......@@ -48,29 +48,32 @@ pub fn parse(allocator: *Allocator, source: []const u8) !*Tree {
4848
4949 while (it.peek().?.id == .LineComment) _ = it.next();
5050
51 tree.root_node = try parseRoot(arena, &it, tree);
51 tree.root_node = parseRoot(arena, &it, tree) catch |err| blk: {
52 switch (err) {
53 error.ParseError => {
54 assert(tree.errors.len != 0);
55 break :blk undefined;
56 },
57 error.OutOfMemory => {
58 return error.OutOfMemory;
59 },
60 }
61 };
62
5263 return tree;
5364}
5465
5566/// Root <- skip ContainerMembers eof
56fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error!*Node.Root {
67fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!*Node.Root {
5768 const node = try arena.create(Node.Root);
5869 node.* = Node.Root{
59 .decls = undefined,
60 .eof_token = undefined,
61 };
62 node.decls = parseContainerMembers(arena, it, tree) catch |err| {
63 // TODO: Switch on the error type
64 // https://github.com/ziglang/zig/issues/2473
65 if (err == error.ParseError) return node;
66 assert(err == Allocator.Error.OutOfMemory);
67 return Allocator.Error.OutOfMemory;
68 };
69 node.eof_token = eatToken(it, .Eof) orelse {
70 try tree.errors.push(AstError{
71 .ExpectedContainerMembers = AstError.ExpectedContainerMembers{ .token = it.index },
72 });
73 return node;
70 .decls = try parseContainerMembers(arena, it, tree),
71 .eof_token = eatToken(it, .Eof) orelse {
72 try tree.errors.push(AstError{
73 .ExpectedContainerMembers = .{ .token = it.index },
74 });
75 return error.ParseError;
76 },
7477 };
7578 return node;
7679}
......@@ -400,7 +403,7 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
400403 .visib_token = null,
401404 .thread_local_token = null,
402405 .name_token = name_token,
403 .eq_token = eq_token orelse undefined,
406 .eq_token = eq_token,
404407 .mut_token = mut_token,
405408 .comptime_token = null,
406409 .extern_export_token = null,
......@@ -2187,7 +2190,7 @@ fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
21872190 node.* = Node.PrefixOp{
21882191 .op_token = token.index,
21892192 .op = op,
2190 .rhs = undefined,
2193 .rhs = undefined, // set by caller
21912194 };
21922195 return &node.base;
21932196}
......@@ -2829,8 +2832,8 @@ fn parseUse(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
28292832 .doc_comments = null,
28302833 .visib_token = null,
28312834 .use_token = token,
2832 .expr = undefined,
2833 .semicolon_token = undefined,
2835 .expr = undefined, // set by caller
2836 .semicolon_token = undefined, // set by caller
28342837 };
28352838 return &node.base;
28362839}
......@@ -2989,9 +2992,9 @@ fn createInfixOp(arena: *Allocator, index: TokenIndex, op: Node.InfixOp.Op) !*No
29892992 const node = try arena.create(Node.InfixOp);
29902993 node.* = Node.InfixOp{
29912994 .op_token = index,
2992 .lhs = undefined,
2995 .lhs = undefined, // set by caller
29932996 .op = op,
2994 .rhs = undefined,
2997 .rhs = undefined, // set by caller
29952998 };
29962999 return &node.base;
29973000}
lib/std/zig/render.zig+1-1
......@@ -2020,7 +2020,7 @@ fn renderVarDecl(
20202020
20212021 if (var_decl.init_node) |init_node| {
20222022 const s = if (init_node.id == .MultilineStringLiteral) Space.None else Space.Space;
2023 try renderToken(tree, stream, var_decl.eq_token, indent, start_col, s); // =
2023 try renderToken(tree, stream, var_decl.eq_token.?, indent, start_col, s); // =
20242024 try renderExpression(allocator, stream, tree, indent, start_col, init_node, Space.None);
20252025 }
20262026