|
|
@@ -5,6 +5,7 @@ import (
|
|
|
"fmt"
|
|
|
"github/runnignwater/monkey/compiler"
|
|
|
"github/runnignwater/monkey/lexer"
|
|
|
+ "github/runnignwater/monkey/object"
|
|
|
"github/runnignwater/monkey/parser"
|
|
|
"github/runnignwater/monkey/vm"
|
|
|
"io"
|
|
|
@@ -24,6 +25,10 @@ func Start(in io.Reader, out io.Writer) {
|
|
|
scanner := bufio.NewScanner(in)
|
|
|
// env := object.NewEnvironment()
|
|
|
|
|
|
+ var constants []object.Object
|
|
|
+ globals := make([]object.Object, vm.GlobalSize)
|
|
|
+ symbolTable := compiler.NewSymbolTable()
|
|
|
+
|
|
|
for {
|
|
|
fmt.Printf(PROMPT)
|
|
|
scan := scanner.Scan()
|
|
|
@@ -50,7 +55,7 @@ func Start(in io.Reader, out io.Writer) {
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
- comp := compiler.New()
|
|
|
+ comp := compiler.NewWithState(symbolTable, constants)
|
|
|
err := comp.Compile(program)
|
|
|
if err != nil {
|
|
|
_, err := fmt.Fprintf(out, "Woops! Compilation failed:\n %s\n", err)
|
|
|
@@ -60,7 +65,10 @@ func Start(in io.Reader, out io.Writer) {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- machine := vm.New(comp.ByteCode())
|
|
|
+ code := comp.ByteCode()
|
|
|
+ constants = code.Constants
|
|
|
+
|
|
|
+ machine := vm.NewWithGlobalsStore(code, globals)
|
|
|
err = machine.Run()
|
|
|
if err != nil {
|
|
|
_, err := fmt.Fprintf(out, "Woops! Executing bytecode failed:\n %s\n", err)
|