Repl uses VM

This commit is contained in:
Chuck Smith
2024-01-25 14:23:23 -05:00
parent ca263209a4
commit e34991c081

View File

@@ -4,17 +4,16 @@ import (
"bufio" "bufio"
"fmt" "fmt"
"io" "io"
"monkey/evaluator" "monkey/compiler"
"monkey/lexer" "monkey/lexer"
"monkey/object"
"monkey/parser" "monkey/parser"
"monkey/vm"
) )
const PROMPT = ">> " const PROMPT = ">> "
func Start(in io.Reader, out io.Writer) { func Start(in io.Reader, out io.Writer) {
scanner := bufio.NewScanner(in) scanner := bufio.NewScanner(in)
env := object.NewEnvironment()
for { for {
fmt.Fprintf(out, PROMPT) fmt.Fprintf(out, PROMPT)
@@ -33,11 +32,23 @@ func Start(in io.Reader, out io.Writer) {
continue continue
} }
evaluated := evaluator.Eval(program, env) comp := compiler.New()
if evaluated != nil { err := comp.Compile(program)
io.WriteString(out, evaluated.Inspect()) if err != nil {
io.WriteString(out, "\n") fmt.Fprintf(out, "Woops! Compilation failed:\n %s\n", err)
continue
} }
machine := vm.New(comp.Bytecode())
err = machine.Run()
if err != nil {
fmt.Fprintf(out, "Woops! Executing bytecode failed:\n %s\n", err)
continue
}
stackTop := machine.StackTop()
io.WriteString(out, stackTop.Inspect())
io.WriteString(out, "\n")
} }
} }