summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/gint/main.go41
-rw-r--r--vm0/vm.go19
2 files changed, 21 insertions, 39 deletions
diff --git a/cmd/gint/main.go b/cmd/gint/main.go
index 15a79b0..3ddddc8 100644
--- a/cmd/gint/main.go
+++ b/cmd/gint/main.go
@@ -10,45 +10,22 @@ import (
"github.com/gnolang/parscan/vm0"
)
+type Interpreter interface {
+ Eval(string) error
+}
+
func main() {
log.SetFlags(log.Lshortfile)
buf, err := os.ReadFile("/dev/stdin")
if err != nil {
log.Fatal(err)
}
- run := run0
- if len(os.Args) > 1 {
- v := "vm" + os.Args[1]
- switch v {
- case "vm0":
- case "vm1":
- run = run1
- default:
- log.Fatal("invalid argument", os.Args[1])
- }
+ var interp Interpreter = vm0.New(golang.GoParser)
+ if len(os.Args) > 1 && os.Args[1] == "1" {
+ interp = codegen.NewInterpreter(golang.GoParser)
+ interp.(*codegen.Interpreter).AddSym(fmt.Println, "println", false)
}
- if err := run(string(buf)); err != nil {
+ if err := interp.Eval(string(buf)); err != nil {
log.Fatal(err)
}
}
-
-func run0(src string) error {
- i := vm0.New(golang.GoParser)
- nodes, err := i.Parse(src)
- if err != nil {
- return err
- }
- i.Adot(nodes, os.Getenv("DOT"))
- for _, n := range nodes {
- if _, err := i.Run(n, ""); err != nil {
- return err
- }
- }
- return nil
-}
-
-func run1(src string) (err error) {
- i := codegen.NewInterpreter(golang.GoParser)
- i.AddSym(fmt.Println, "println", false)
- return i.Eval(src)
-}
diff --git a/vm0/vm.go b/vm0/vm.go
index 3e589ed..8d0b49e 100644
--- a/vm0/vm.go
+++ b/vm0/vm.go
@@ -2,11 +2,14 @@ package vm0
import (
"fmt"
+ "os"
"strings"
"github.com/gnolang/parscan/parser"
)
+const debug = true
+
type Interp struct {
*parser.Parser
stack []any // stack memory space
@@ -20,14 +23,16 @@ func New(p *parser.Parser) (i *Interp) {
return i
}
-func (i *Interp) Eval(src string) (r []any, err error) {
- n, err := i.Parse(src)
- if err != nil {
- return nil, err
+func (i *Interp) Eval(src string) (err error) {
+ n := &parser.Node{}
+ if n.Child, err = i.Parse(src); err != nil {
+ return
+ }
+ if debug {
+ n.Dot(os.Getenv("DOT"), "")
}
- for _, nod := range n {
- r, err = i.Run(nod, "")
- if err != nil {
+ for _, nod := range n.Child {
+ if _, err = i.Run(nod, ""); err != nil {
break
}
}