diff --git a/src/common-structures.zig b/src/common-structures.zig index 0db30f1..01c54fe 100644 --- a/src/common-structures.zig +++ b/src/common-structures.zig @@ -97,7 +97,7 @@ fn print_node(node: Node) void { print_properties(node.properties); } -fn print_tree(tree: Tree) void { +pub fn print_tree(tree: Tree) void { say("\ntree.definitions:\n"); var it = tree.definitions.iterator(); while(it.next()) |kv| { diff --git a/src/parse.zig b/src/parse.zig index 930a72e..5ec2332 100644 --- a/src/parse.zig +++ b/src/parse.zig @@ -83,7 +83,7 @@ pub fn parse(gpa: *Allocator, source: []const u8) Allocator.Error!cs.Tree { // Create a parsing Tree, with the nodes parsed early on. // toOwnedSlice: free the memory and return the list. Arrays are empty, // allocator can be free, arrays are owned by a different allocator. - const tree = try parser.parseTree(); + var tree = try parser.parseTree(); return tree; } @@ -106,23 +106,25 @@ const Parser = struct { // parseTree: create a cs.Tree with all its content. fn parseTree(p: *Parser) Allocator.Error!cs.Tree { + + // Create a tree. + var tree = try cs.Tree.create(&p.arena.allocator); + // Parse the content. - const decls = try parseTopLevel(p, true); - defer p.gpa.free(decls); + try parseTopLevel(p, &tree); // parseTopLevel will try to skip as much // invalid tokens as it can so this can only be the EOF // eatToken returns next token or null (if current token id isn't parameter). // If current token is .Eof, next token is actually the first. const eof_token = p.eatToken(.Eof).?; - const tree = try cs.Tree.create(&p.arena.allocator, decls_len, eof_token); return tree; } // parseTopLevel: actual parsing code starts here. - fn parseTopLevel(p: *Parser, top_level: bool) ![]*Node { - // std.debug.print("parseTopLevel: is top? {}\n", .{top_level}); + fn parseTopLevel(p: *Parser, tree: *cs.Tree) !void { + // list: all nodes in the ast. var list = std.ArrayList(*Node).init(p.gpa); defer list.deinit(); @@ -178,8 +180,6 @@ const Parser = struct { }, } } - - return list.toOwnedSlice(); } fn say(p: *Parser, comptime fmt: []const u8, args: anytype) void { diff --git a/src/parser_test.zig b/src/parser_test.zig index 95ffa56..ac29805 100644 --- a/src/parser_test.zig +++ b/src/parser_test.zig @@ -1,13 +1,3 @@ -// test "recovery: invalid parameter" { -// try testError( -// \\fn main() void { -// \\ a(comptime T: type) -// \\} -// , &[_]Error{ -// .ExpectedToken, -// }); -// } - const std = @import("std"); const mem = std.mem; const warn = std.debug.warn; @@ -23,34 +13,34 @@ const own_parser = @import("./parse.zig"); fn testParse(source: []const u8, allocator: *mem.Allocator) !void { const stderr = io.getStdErr().outStream(); - const tree = try own_parser.parse(allocator, source); + var tree = try own_parser.parse(allocator, source); defer tree.deinit(); - for (tree.errors) |*parse_error| { - const token = tree.token_locs[parse_error.loc()]; - const loc = tree.tokenLocation(0, parse_error.loc()); - try stderr.print("(memory buffer):{}:{}: error: ", .{ loc.line + 1, loc.column + 1 }); - try tree.renderError(parse_error, stderr); - try stderr.print("\n{}\n", .{source[loc.line_start..loc.line_end]}); - { - var i: usize = 0; - while (i < loc.column) : (i += 1) { - try stderr.writeAll(" "); - } - } - { - const caret_count = token.end - token.start; - var i: usize = 0; - while (i < caret_count) : (i += 1) { - try stderr.writeAll("~"); - } - } - try stderr.writeAll("\n"); - } + // for (tree.errors) |*parse_error| { + // const token = tree.token_locs[parse_error.loc()]; + // const loc = tree.tokenLocation(0, parse_error.loc()); + // try stderr.print("(memory buffer):{}:{}: error: ", .{ loc.line + 1, loc.column + 1 }); + // try tree.renderError(parse_error, stderr); + // try stderr.print("\n{}\n", .{source[loc.line_start..loc.line_end]}); + // { + // var i: usize = 0; + // while (i < loc.column) : (i += 1) { + // try stderr.writeAll(" "); + // } + // } + // { + // const caret_count = token.end - token.start; + // var i: usize = 0; + // while (i < caret_count) : (i += 1) { + // try stderr.writeAll("~"); + // } + // } + // try stderr.writeAll("\n"); + // } - if (tree.errors.len != 0) { - return error.ParseError; - } + // if (tree.errors.len != 0) { + // return error.ParseError; + // } } const Error = @TagType(ast.Error);