summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2024-03-15 01:10:47 +0100
committerkdx <kikoodx@paranoici.org>2024-03-15 01:10:47 +0100
commitffea8259f2cda681c3c14bbb4b09f6d0a39b291f (patch)
treebb7dd11c36abf2fa498b5dd38505bcf075cb118b
parentb9807c5f25b062246dd587917e271522b38eeed5 (diff)
downloado7z-ffea8259f2cda681c3c14bbb4b09f6d0a39b291f.tar.gz
dummy node
-rw-r--r--src/Lexer.zig18
-rw-r--r--src/Node.zig31
-rw-r--r--src/Parser.zig34
-rw-r--r--src/main.zig25
-rw-r--r--test.o71
5 files changed, 101 insertions, 8 deletions
diff --git a/src/Lexer.zig b/src/Lexer.zig
index 422f67a..4e428d9 100644
--- a/src/Lexer.zig
+++ b/src/Lexer.zig
@@ -5,6 +5,7 @@ const Self = @This();
allocator: std.mem.Allocator,
tokens: std.ArrayList(Token),
+consumed_tokens: usize = 0,
s: []const u8,
line: usize = 0,
line_start: usize = 0,
@@ -19,6 +20,7 @@ const punct = "(){}[]=+-*/%.,;:|&^\\~$";
pub const Error = error{
UnclosedCharLitteral,
UnclosedStringLitteral,
+ OutOfTokens,
};
pub fn init(
@@ -121,6 +123,22 @@ pub fn lex(self: *Self) !void {
}
}
+pub fn empty(self: Self) bool {
+ return self.consumed_tokens >= self.tokens.items.len;
+}
+
+pub fn pop(self: *Self) !Token {
+ const tok = try self.peek();
+ self.consumed_tokens += 1;
+ return tok;
+}
+
+pub fn peek(self: *Self) !Token {
+ if (self.empty())
+ return Error.OutOfTokens;
+ return self.tokens.items[self.consumed_tokens];
+}
+
fn newToken(self: *Self, i: usize, len: usize, tag: Token.Tag) !void {
return self.tokens.append(Token.init(
tag,
diff --git a/src/Node.zig b/src/Node.zig
new file mode 100644
index 0000000..358cd46
--- /dev/null
+++ b/src/Node.zig
@@ -0,0 +1,31 @@
+const std = @import("std");
+const Lexer = @import("Lexer.zig");
+const Token = @import("Token.zig");
+
+const Self = @This();
+
+next: ?*Self = null,
+token: Token,
+
+pub fn init(allocator: std.mem.Allocator, lexer: *Lexer) !*Self {
+ const self = try allocator.create(Self);
+ self.* = .{ .token = try lexer.pop() };
+ return self;
+}
+
+pub fn deinit(self: *Self, allocator: std.mem.Allocator) void {
+ if (self.next != null)
+ self.next.?.deinit(allocator);
+ allocator.destroy(self);
+}
+
+pub fn format(
+ self: Self,
+ comptime _: []const u8,
+ _: std.fmt.FormatOptions,
+ writer: std.io.AnyWriter,
+) !void {
+ try writer.print("Node{{ .token = {} }}\n", .{self.token});
+ if (self.next != null)
+ try self.next.?.format("", .{}, writer);
+}
diff --git a/src/Parser.zig b/src/Parser.zig
new file mode 100644
index 0000000..27a0163
--- /dev/null
+++ b/src/Parser.zig
@@ -0,0 +1,34 @@
+const std = @import("std");
+const Node = @import("Node.zig");
+const Lexer = @import("Lexer.zig");
+
+const Self = @This();
+
+allocator: std.mem.Allocator,
+root: ?*Node,
+lexer: *Lexer,
+
+pub fn init(
+ allocator: std.mem.Allocator,
+ lexer: *Lexer,
+) Self {
+ return Self{
+ .allocator = allocator,
+ .root = null,
+ .lexer = lexer,
+ };
+}
+
+pub fn deinit(_: Self) void {}
+
+pub fn parse(self: *Self) !?*Node {
+ var root = Node{ .token = undefined };
+ var cur = &root.next;
+
+ while (!self.lexer.empty()) {
+ cur.* = try Node.init(self.allocator, self.lexer);
+ cur = &cur.*.?.next;
+ }
+
+ return root.next;
+}
diff --git a/src/main.zig b/src/main.zig
index 9e08fd5..88054bb 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,5 +1,11 @@
const std = @import("std");
const Lexer = @import("Lexer.zig");
+const Parser = @import("Parser.zig");
+
+const Error = error{
+ InvalidArgumentCount,
+ EmptyAST,
+};
pub fn main() !void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
@@ -21,18 +27,21 @@ pub fn main() !void {
defer lexer.deinit();
try lexer.lex();
- std.log.debug("{}", .{lexer});
- try lexer.minimized(std.io.getStdOut().writer().any());
-}
+ // std.log.debug("{}", .{lexer});
+ // try lexer.minimized(std.io.getStdOut().writer().any());
-const ArgError = error{
- InvalidArgumentCount,
-};
+ var parser = Parser.init(arena.allocator(), &lexer);
+ defer parser.deinit();
+ if (try parser.parse()) |ast| {
+ defer ast.deinit(arena.allocator());
+ std.log.debug("{}", .{ast.*});
+ } else return Error.EmptyAST;
+}
-fn validateArgv() ArgError!void {
+fn validateArgv() Error!void {
if (std.os.argv.len < 2) {
std.log.err("usage: {s} <file>", .{std.os.argv[0]});
- return ArgError.InvalidArgumentCount;
+ return Error.InvalidArgumentCount;
}
}
diff --git a/test.o7 b/test.o7
index e3fc844..cb95ab4 100644
--- a/test.o7
+++ b/test.o7
@@ -6,6 +6,7 @@ let zied = golem("large");
let doc = @as(Prof, zied);
pub fn main(argv: [][]u8) i32 {
+ var lol: i32 = 5 + 2;
std~io~puts $ "Hello, World!";
let file = std~io~open $ "file.txt", "rb";
defer file:std~io~close();