summaryrefslogtreecommitdiff
path: root/codegen
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
parentec8eb9defc7cd68fcd3afa0058773bcbc33ecd63 (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.go38
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()
+}