commit 5539fb8d1c088e517344b55c7fa221f9c0667516
parent 5519e71d3d80c86abed101e1a8a1a937af92f9a2
Author: Walther Chen <walther.chen@gmail.com>
Date: Sun, 6 Nov 2022 19:11:47 -0500
working interpreter
Diffstat:
M | src/main.zig | | | 54 | ++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 52 insertions(+), 2 deletions(-)
diff --git a/src/main.zig b/src/main.zig
@@ -1,7 +1,7 @@
const std = @import("std");
const ArrayList = std.ArrayList;
-const MEMORY_SIZE = 10; //30000;
+const MEMORY_SIZE = 30000;
pub fn main() anyerror!void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
@@ -22,6 +22,9 @@ pub fn main() anyerror!void {
}
fn interpret(src: []const u8) !void {
+ const stdin = std.io.getStdIn();
+ const stdout = std.io.getStdOut();
+
var memory = [_]u8{0} ** MEMORY_SIZE;
var pc: usize = 0;
@@ -35,9 +38,56 @@ fn interpret(src: []const u8) !void {
'<' => dataptr -= 1,
'+' => memory[dataptr] += 1,
'-' => memory[dataptr] -= 1,
+ ',' => memory[dataptr] = try stdin.reader().readByte(),
+ '.' => try stdout.writer().writeByte(memory[dataptr]),
+ // jumps to next matching ']' if curr_data == 0
+ '[' => blk: {
+ if (memory[dataptr] != 0) {
+ break :blk;
+ }
+
+ var bracket_nesting: usize = 1;
+ var saved_pc = pc; // used for error message only
+
+ while (bracket_nesting != 0 and pc < src.len - 1) {
+ pc += 1;
+
+ if (src[pc] == ']') {
+ bracket_nesting -= 1;
+ } else if (src[pc] == '[') {
+ bracket_nesting += 1;
+ }
+ }
+
+ if (bracket_nesting != 0) {
+ std.debug.print("unmatched '[' at pc={}", .{saved_pc});
+ }
+ },
+ // jumps to previous matching ']' if curr data != 0
+ ']' => blk: {
+ if (memory[dataptr] == 0) {
+ break :blk;
+ }
+
+ var bracket_nesting: usize = 1;
+ var saved_pc = pc; // used for error message only
+
+ while (bracket_nesting != 0 and pc > 0) {
+ pc -= 1;
+
+ if (src[pc] == '[') {
+ bracket_nesting -= 1;
+ } else if (src[pc] == ']') {
+ bracket_nesting += 1;
+ }
+ }
+
+ if (bracket_nesting != 0) {
+ std.debug.print("unmatched ']' at pc={}", .{saved_pc});
+ }
+ },
else => {},
}
- std.debug.print("{any}\n", .{memory});
pc += 1;
}