summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Node.zig19
-rw-r--r--src/Parser.zig16
-rw-r--r--src/main.zig2
-rw-r--r--test.o72
4 files changed, 29 insertions, 10 deletions
diff --git a/src/Node.zig b/src/Node.zig
index a5aa0d0..32e0643 100644
--- a/src/Node.zig
+++ b/src/Node.zig
@@ -4,6 +4,7 @@ const Token = @import("Token.zig");
const Self = @This();
+allocator: std.mem.Allocator,
left: ?*Self = null,
right: ?*Self = null,
tag: Tag,
@@ -11,25 +12,31 @@ token: Token,
const Tag = enum {
fndef,
+ fnsign,
+ type,
number,
add,
sub,
};
-pub const stub = Self{ .tag = undefined, .token = undefined };
+pub const stub = Self{
+ .allocator = undefined,
+ .tag = undefined,
+ .token = undefined,
+};
pub fn init(allocator: std.mem.Allocator, tag: Tag, token: Token) !*Self {
const self = try allocator.create(Self);
- self.* = .{ .tag = tag, .token = token };
+ self.* = .{ .allocator = allocator, .tag = tag, .token = token };
return self;
}
-pub fn deinit(self: *Self, allocator: std.mem.Allocator) void {
+pub fn deinit(self: *Self) void {
if (self.left != null)
- self.left.?.deinit(allocator);
+ self.left.?.deinit();
if (self.right != null)
- self.right.?.deinit(allocator);
- allocator.destroy(self);
+ self.right.?.deinit();
+ self.allocator.destroy(self);
}
pub fn chainLeft(self: *Self, left: *Self) *Self {
diff --git a/src/Parser.zig b/src/Parser.zig
index 43741e3..0062781 100644
--- a/src/Parser.zig
+++ b/src/Parser.zig
@@ -36,6 +36,11 @@ pub fn expect(self: *Self, tag: Token.Tag) !void {
try (try self.lexer.peek()).expect(tag);
}
+fn @"type"(self: *Self) !*Node {
+ try self.expect(.word);
+ return try Node.init(self.allocator, .type, try self.lexer.pop());
+}
+
fn expr(self: *Self) !*Node {
try self.expect(.number);
return try Node.init(self.allocator, .number, try self.lexer.pop());
@@ -46,13 +51,20 @@ fn function(self: *Self) !*Node {
try self.expect(.word);
const node = try Node.init(self.allocator, .fndef, try self.lexer.pop());
- errdefer node.deinit(self.allocator);
+ errdefer node.deinit();
+
+ const sign = try Node.init(self.allocator, .fnsign, try self.lexer.peek());
+ errdefer sign.deinit();
+ node.left = sign;
try self.skip("(");
- node.left = null;
+ sign.left = null;
try self.skip(")");
+ sign.right = try self.type();
+
node.right = try self.expr();
+ errdefer node.right.?.deinit();
try self.skip(";");
return node;
}
diff --git a/src/main.zig b/src/main.zig
index 88054bb..94480c9 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -33,7 +33,7 @@ pub fn main() !void {
var parser = Parser.init(arena.allocator(), &lexer);
defer parser.deinit();
if (try parser.parse()) |ast| {
- defer ast.deinit(arena.allocator());
+ defer ast.deinit();
std.log.debug("{}", .{ast.*});
} else return Error.EmptyAST;
}
diff --git a/test.o7 b/test.o7
index 6c06e3c..a7ea242 100644
--- a/test.o7
+++ b/test.o7
@@ -1 +1 @@
-fn main() 0;
+fn main() i32 0;