summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go59
1 files changed, 13 insertions, 46 deletions
diff --git a/main.go b/main.go
index 99652ad..b0ca700 100644
--- a/main.go
+++ b/main.go
@@ -1,25 +1,17 @@
package main
import (
- "bufio"
- "errors"
"flag"
"fmt"
"io"
"log"
"os"
- "reflect"
"strings"
"github.com/mvertes/parscan/interpreter"
"github.com/mvertes/parscan/lang/golang"
- "github.com/mvertes/parscan/scanner"
)
-type Interpreter interface {
- Eval(string) (reflect.Value, error)
-}
-
func main() {
log.SetFlags(log.Lshortfile)
if err := run(os.Args[1:]); err != nil {
@@ -27,41 +19,6 @@ func main() {
}
}
-// isatty returns true if the input stream is a tty (i.e. a character device).
-func isatty(in io.Reader) bool {
- s, ok := in.(interface{ Stat() (os.FileInfo, error) })
- if !ok {
- return false
- }
- stat, err := s.Stat()
- return err == nil && stat.Mode()&os.ModeCharDevice != 0
-}
-
-// repl executes an interactive line oriented Read Eval Print Loop (REPL).
-func repl(interp Interpreter, in io.Reader) (err error) {
- liner := bufio.NewScanner(in)
- text, prompt := "", "> "
- fmt.Print(prompt)
- for liner.Scan() {
- text += liner.Text()
- res, err := interp.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
-}
-
func run(arg []string) (err error) {
var str string
rflag := flag.NewFlagSet("run", flag.ContinueOnError)
@@ -76,7 +33,7 @@ func run(arg []string) (err error) {
}
args := rflag.Args()
- intpr := interpreter.NewInterpreter(scanner.NewScanner(golang.GoSpec))
+ interp := interpreter.NewInterpreter(golang.GoSpec)
var in io.Reader
if str != "" {
@@ -94,13 +51,23 @@ func run(arg []string) (err error) {
}
if isatty(in) {
- return repl(intpr, in)
+ return interp.Repl(in)
}
buf, err := io.ReadAll(in)
if err != nil {
return err
}
- _, err = intpr.Eval(string(buf))
+ _, err = interp.Eval(string(buf))
return err
}
+
+// isatty returns true if the input stream is a tty (i.e. a character device).
+func isatty(in io.Reader) bool {
+ s, ok := in.(interface{ Stat() (os.FileInfo, error) })
+ if !ok {
+ return false
+ }
+ stat, err := s.Stat()
+ return err == nil && stat.Mode()&os.ModeCharDevice != 0
+}