|
|
@@ -3,10 +3,10 @@ package repl
|
|
|
import (
|
|
|
"bufio"
|
|
|
"fmt"
|
|
|
- "github/runnignwater/monkey/evaluator"
|
|
|
+ "github/runnignwater/monkey/compiler"
|
|
|
"github/runnignwater/monkey/lexer"
|
|
|
- "github/runnignwater/monkey/object"
|
|
|
"github/runnignwater/monkey/parser"
|
|
|
+ "github/runnignwater/monkey/vm"
|
|
|
"io"
|
|
|
"log"
|
|
|
)
|
|
|
@@ -22,7 +22,7 @@ const PROMPT = ">>> "
|
|
|
|
|
|
func Start(in io.Reader, out io.Writer) {
|
|
|
scanner := bufio.NewScanner(in)
|
|
|
- env := object.NewEnvironment()
|
|
|
+ // env := object.NewEnvironment()
|
|
|
|
|
|
for {
|
|
|
fmt.Printf(PROMPT)
|
|
|
@@ -40,14 +40,44 @@ func Start(in io.Reader, out io.Writer) {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- evaluated := evaluator.Eval(program, env)
|
|
|
- if evaluated != nil {
|
|
|
- if _, err := io.WriteString(out, evaluated.Inspect()); err != nil {
|
|
|
- panic(err)
|
|
|
+ // evaluated := evaluator.Eval(program, env)
|
|
|
+ // if evaluated != nil {
|
|
|
+ // if _, err := io.WriteString(out, evaluated.Inspect()); err != nil {
|
|
|
+ // panic(err)
|
|
|
+ // }
|
|
|
+ // if _, err := io.WriteString(out, "\n"); err != nil {
|
|
|
+ // panic(err)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ comp := compiler.New()
|
|
|
+ err := comp.Compile(program)
|
|
|
+ if err != nil {
|
|
|
+ _, err := fmt.Fprintf(out, "Woops! Compilation failed:\n %s\n", err)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
- if _, err := io.WriteString(out, "\n"); err != nil {
|
|
|
- panic(err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ machine := vm.New(comp.ByteCode())
|
|
|
+ err = machine.Run()
|
|
|
+ if err != nil {
|
|
|
+ _, err := fmt.Fprintf(out, "Woops! Executing bytecode failed:\n %s\n", err)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ stackTop := machine.StackTop()
|
|
|
+ _, err = io.WriteString(out, stackTop.Inspect())
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _, err = io.WriteString(out, "\n")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
}
|