diff options
author | kdx <kikoodx@paranoici.org> | 2024-03-15 01:10:47 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2024-03-15 01:10:47 +0100 |
commit | ffea8259f2cda681c3c14bbb4b09f6d0a39b291f (patch) | |
tree | bb7dd11c36abf2fa498b5dd38505bcf075cb118b | |
parent | b9807c5f25b062246dd587917e271522b38eeed5 (diff) | |
download | o7z-ffea8259f2cda681c3c14bbb4b09f6d0a39b291f.tar.gz |
dummy node
-rw-r--r-- | src/Lexer.zig | 18 | ||||
-rw-r--r-- | src/Node.zig | 31 | ||||
-rw-r--r-- | src/Parser.zig | 34 | ||||
-rw-r--r-- | src/main.zig | 25 | ||||
-rw-r--r-- | test.o7 | 1 |
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; } } @@ -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(); |