summaryrefslogtreecommitdiff
path: root/codegen/interpreter.go
diff options
context:
space:
mode:
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()
+}