Procházet zdrojové kódy

Hooking up the REPL

runningwater před 3 roky
rodič
revize
1d727fd42a
1 změnil soubory, kde provedl 39 přidání a 9 odebrání
  1. 39 9
      repl/repl.go

+ 39 - 9
repl/repl.go

@@ -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
 		}
 	}
 }