diff options
| author | Marc Vertes <mvertes@free.fr> | 2023-08-24 17:16:39 +0200 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2023-08-24 17:16:39 +0200 |
| commit | 9fdef50606a2942389189cd61397e17c0a0ccfd7 (patch) | |
| tree | e89a4aa3a61a6ab41abb4b6533ec9a2d9d7e2ce9 /codegen/interpreter.go | |
| parent | ec8eb9defc7cd68fcd3afa0058773bcbc33ecd63 (diff) | |
codegen: add Interpreter struct
This makes the code easier to use.
Diffstat (limited to 'codegen/interpreter.go')
| -rw-r--r-- | codegen/interpreter.go | 38 |
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() +} |
