summaryrefslogtreecommitdiff
path: root/codegen/interpreter.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-08-24 17:16:39 +0200
committerMarc Vertes <mvertes@free.fr>2023-08-24 17:16:39 +0200
commit9fdef50606a2942389189cd61397e17c0a0ccfd7 (patch)
treee89a4aa3a61a6ab41abb4b6533ec9a2d9d7e2ce9 /codegen/interpreter.go
parentec8eb9defc7cd68fcd3afa0058773bcbc33ecd63 (diff)
codegen: add Interpreter struct
This makes the code easier to use.
Diffstat (limited to 'codegen/interpreter.go')
-rw-r--r--codegen/interpreter.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/codegen/interpreter.go b/codegen/interpreter.go
new file mode 100644
index 0000000..8527631
--- /dev/null
+++ b/codegen/interpreter.go
@@ -0,0 +1,38 @@
+package codegen
+
+import (
+ "os"
+
+ "github.com/gnolang/parscan/parser"
+ "github.com/gnolang/parscan/vm1"
+)
+
+const debug = true
+
+type Interpreter struct {
+ *parser.Parser
+ *Compiler
+ *vm1.Machine
+}
+
+func NewInterpreter(p *parser.Parser) *Interpreter {
+ return &Interpreter{p, NewCompiler(), &vm1.Machine{}}
+}
+
+func (i *Interpreter) Eval(src string) (err error) {
+ n := &parser.Node{}
+ if n.Child, err = i.Parse(src); err != nil {
+ return err
+ }
+ if debug {
+ n.Dot(os.Getenv("DOT"), "")
+ }
+ if err = i.CodeGen(n); err != nil {
+ return err
+ }
+ i.Emit(n, vm1.Exit)
+ i.Push(i.Data...)
+ i.PushCode(i.Code)
+ i.SetIP(i.Entry)
+ return i.Run()
+}