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 | |
| parent | ec8eb9defc7cd68fcd3afa0058773bcbc33ecd63 (diff) | |
codegen: add Interpreter struct
This makes the code easier to use.
Diffstat (limited to 'codegen')
| -rw-r--r-- | codegen/compiler.go (renamed from codegen/codegen.go) | 2 | ||||
| -rw-r--r-- | codegen/compiler_test.go (renamed from codegen/codegen_test.go) | 2 | ||||
| -rw-r--r-- | codegen/interpreter.go | 38 |
3 files changed, 40 insertions, 2 deletions
diff --git a/codegen/codegen.go b/codegen/compiler.go index d7702cd..e0e97ab 100644 --- a/codegen/codegen.go +++ b/codegen/compiler.go @@ -21,7 +21,7 @@ type Compiler struct { symbols map[string]symbol } -func New() *Compiler { return &Compiler{symbols: map[string]symbol{}, Entry: -1} } +func NewCompiler() *Compiler { return &Compiler{symbols: map[string]symbol{}, Entry: -1} } type nodedata struct { ipstart, ipend, symind, fsp int // CFG and symbol node annotations diff --git a/codegen/codegen_test.go b/codegen/compiler_test.go index 7262ddc..5989210 100644 --- a/codegen/codegen_test.go +++ b/codegen/compiler_test.go @@ -15,7 +15,7 @@ func TestCodeGen(t *testing.T) { for _, test := range tests { test := test t.Run("", func(t *testing.T) { - c := New() + c := NewCompiler() c.AddSym(fmt.Println, "println", false) n := &parser.Node{} var err error 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() +} |
