From 22b020225ae77ca1cf9f9984817df9b7fd1aaa12 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 27 Nov 2025 14:50:07 +0100 Subject: fix: improve parser, compiler and interpreter APIs Pass a language spec as an argument when create a new parser, compiler or interpreter. Also move the REPL code in interpreter package. --- interpreter/repl.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 interpreter/repl.go (limited to 'interpreter/repl.go') diff --git a/interpreter/repl.go b/interpreter/repl.go new file mode 100644 index 0000000..73af8a7 --- /dev/null +++ b/interpreter/repl.go @@ -0,0 +1,35 @@ +package interpreter + +import ( + "bufio" + "errors" + "fmt" + "io" + + "github.com/mvertes/parscan/scanner" +) + +// Repl executes an interactive line oriented Read Eval Print Loop (REPL). +func (i *Interp) Repl(in io.Reader) (err error) { + liner := bufio.NewScanner(in) + text, prompt := "", "> " + fmt.Print(prompt) + for liner.Scan() { + text += liner.Text() + res, err := i.Eval(text + "\n") + switch { + case err == nil: + if res.IsValid() { + fmt.Println(": ", res) + } + text, prompt = "", "> " + case errors.Is(err, scanner.ErrBlock): + prompt = ">> " + default: + fmt.Println("Error:", err) + text, prompt = "", "> " + } + fmt.Print(prompt) + } + return err +} -- cgit v1.2.3