aboutsummaryrefslogtreecommitdiff
path: root/pkg/interpreter/interpreter.go
diff options
context:
space:
mode:
authorJulien Dessaux2021-09-23 00:24:53 +0200
committerJulien Dessaux2021-09-23 00:24:53 +0200
commite3bc1251e8cb20b30d0c5a27cd1da8f147a82de7 (patch)
treeffaaee42eedb2a380d45b6710f43a6c1350a080d /pkg/interpreter/interpreter.go
parentFixed test order mistake between expected value and got value (diff)
downloadgofunge98-e3bc1251e8cb20b30d0c5a27cd1da8f147a82de7.tar.gz
gofunge98-e3bc1251e8cb20b30d0c5a27cd1da8f147a82de7.tar.bz2
gofunge98-e3bc1251e8cb20b30d0c5a27cd1da8f147a82de7.zip
Began coding the interpreter (only manages the minimal example for now!)
Diffstat (limited to '')
-rw-r--r--pkg/interpreter/interpreter.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/pkg/interpreter/interpreter.go b/pkg/interpreter/interpreter.go
new file mode 100644
index 0000000..ce2499d
--- /dev/null
+++ b/pkg/interpreter/interpreter.go
@@ -0,0 +1,40 @@
+package interpreter
+
+import (
+ "log"
+
+ "git.adyxax.org/adyxax/gofunge/pkg/field"
+ "git.adyxax.org/adyxax/gofunge/pkg/pointer"
+)
+
+type Interpreter struct {
+ f *field.Field
+ p *pointer.Pointer
+}
+
+func NewInterpreter(f *field.Field, p *pointer.Pointer) *Interpreter {
+ return &Interpreter{f: f, p: p}
+}
+
+func (i *Interpreter) Run() {
+ for i.p != nil {
+ i.Step()
+ }
+}
+
+func (i *Interpreter) Step() {
+ var prev *pointer.Pointer = nil
+ for p := i.p; p != nil; p = p.Next {
+ switch p.Get(*i.f) {
+ case '@':
+ if prev == nil {
+ i.p = p.Next
+ } else {
+ prev.Next = p.Next
+ }
+ break
+ default:
+ log.Fatalf("Non implemented instruction code %d : %c", p.Get(*i.f), p.Get(*i.f))
+ }
+ }
+}