From 7ba140dd736f1da3ed0d13f01ccfcd69e8e6cea6 Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 23 Aug 2019 15:42:50 -0300 Subject: [PATCH 1/2] add better ast printing --- src/ast.zig | 25 +++++++++++++++++++++++++ src/parser.zig | 6 ++++++ src/runner.zig | 5 ++--- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/ast.zig b/src/ast.zig index 52f25a9..310ce44 100644 --- a/src/ast.zig +++ b/src/ast.zig @@ -43,3 +43,28 @@ pub fn mkRoot(allocator: *std.mem.Allocator) !*Node { node.* = Node{ .Root = NodeList.init(allocator) }; return node; } + +fn print(ident: usize, comptime fmt: []const u8, args: ...) void { + var i: usize = 0; + while (i < ident) : (i += 1) { + std.debug.warn("\t"); + } + + std.debug.warn(fmt, args); +} + +pub fn printNode(node: *Node, ident: usize) void { + switch (node.*) { + .FnDecl => |proto| { + print(ident, "FnDecl name='{}'\n", proto.func_name.lexeme); + }, + .Root => { + for (node.Root.toSlice()) |child| { + printNode(child, ident + 1); + } + }, + else => { + print(ident, "unknown node: {}\n", node); + }, + } +} diff --git a/src/parser.zig b/src/parser.zig index f07ebc3..9ee366d 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -233,6 +233,12 @@ pub const Parser = struct { .Fn => blk: { _ = try self.consumeSingle(.Fn); var name = try self.consumeSingle(.Identifier); + _ = try self.consumeSingle(.LeftParen); + // TODO paramlist + _ = try self.consumeSingle(.RightParen); + _ = try self.consumeSingle(.LeftBrace); + // TODO block + _ = try self.consumeSingle(.RightBrace); std.debug.warn("!fn name: {}\n", name); break :blk try self.mkFnDecl( name, diff --git a/src/runner.zig b/src/runner.zig index e0f6493..34d81d0 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -48,9 +48,8 @@ pub const Runner = struct { var it = root.Root.iterator(); - while (it.next()) |node| { - std.debug.warn("{}\n", node.*); - } + std.debug.warn("parse tree\n"); + ast.printNode(root, 0); return Result.Ok; } From 89e386d2d4cddcc6c07c92905d7238695f992b1a Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 23 Aug 2019 15:52:04 -0300 Subject: [PATCH 2/2] add basic param parsing --- examples/hello.v | 2 +- src/ast.zig | 19 ++++++++++++++----- src/parser.zig | 20 +++++++++++++++----- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/examples/hello.v b/examples/hello.v index f328e4d..a20f831 100644 --- a/examples/hello.v +++ b/examples/hello.v @@ -1 +1 @@ -fn main() {} +fn main( a int) {} diff --git a/src/ast.zig b/src/ast.zig index 310ce44..5e20aa6 100644 --- a/src/ast.zig +++ b/src/ast.zig @@ -3,7 +3,7 @@ const tokens = @import("tokens.zig"); const Token = tokens.Token; pub const NodeList = std.ArrayList(*Node); -pub const ParamList = std.ArrayList(*ParamDecl); +pub const ParamList = std.ArrayList(ParamDecl); // TODO convert FnCall to something like PrefixOp / InfixOp / SuffixOp pub const NodeType = enum { @@ -14,10 +14,10 @@ pub const NodeType = enum { }; pub const ParamDecl = struct { - param_name: Token, + name: Token, // TODO types - param_type: Token, + typ: Token, }; pub const FnDecl = struct { @@ -55,8 +55,17 @@ fn print(ident: usize, comptime fmt: []const u8, args: ...) void { pub fn printNode(node: *Node, ident: usize) void { switch (node.*) { - .FnDecl => |proto| { - print(ident, "FnDecl name='{}'\n", proto.func_name.lexeme); + .FnDecl => |decl| { + print(ident, "FnDecl name='{}'\n", decl.func_name.lexeme); + + for (decl.params.toSlice()) |param| { + print( + ident + 1, + "param: '{}' {}\n", + param.name.lexeme, + param.typ.lexeme, + ); + } }, .Root => { for (node.Root.toSlice()) |child| { diff --git a/src/parser.zig b/src/parser.zig index 9ee366d..e45d404 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -231,19 +231,29 @@ pub const Parser = struct { fn topDecl(self: *@This()) !?*Node { return switch (self.peek().ttype) { .Fn => blk: { + var param_list = ast.ParamList.init(self.allocator); + errdefer param_list.deinit(); + _ = try self.consumeSingle(.Fn); var name = try self.consumeSingle(.Identifier); + _ = try self.consumeSingle(.LeftParen); - // TODO paramlist + + while (self.peek().ttype != .RightParen) { + const param_name = try self.consumeSingle(.Identifier); + const param_type = try self.consumeSingle(.Identifier); + + try param_list.append(ast.ParamDecl{ .name = param_name, .typ = param_type }); + } + _ = try self.consumeSingle(.RightParen); + _ = try self.consumeSingle(.LeftBrace); // TODO block _ = try self.consumeSingle(.RightBrace); + std.debug.warn("!fn name: {}\n", name); - break :blk try self.mkFnDecl( - name, - ast.ParamList.init(self.allocator), - ); + break :blk try self.mkFnDecl(name, param_list); }, else => |ttype| blk: { self.doError("expected fn, got {}\n", ttype);