diff options
| author | Marc Vertes <mvertes@free.fr> | 2023-08-25 09:40:52 +0200 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2023-08-25 09:40:52 +0200 |
| commit | 706ca65800dfab293a0210b56602e1e9f8076fcc (patch) | |
| tree | 0b5bdc341800a7556f4b613a0c8c3edcc33f57c0 | |
| parent | 9fdef50606a2942389189cd61397e17c0a0ccfd7 (diff) | |
gint: simplify
| -rw-r--r-- | cmd/gint/main.go | 41 | ||||
| -rw-r--r-- | vm0/vm.go | 19 |
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) -} @@ -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 } } |
