varaq-interpreter-go/main.go

66 lines
981 B
Go
Raw Normal View History

2022-09-03 23:15:35 -04:00
package main
import (
"bufio"
"fmt"
"io/ioutil"
"os"
"varaq/varaq"
)
func main() {
argsCount := len(os.Args[1:])
if argsCount >= 1 {
runFile(os.Args[1])
} else {
repl()
}
os.Exit(0)
}
func repl() {
scanner := bufio.NewScanner(os.Stdin)
2023-02-19 11:07:46 -05:00
fmt.Print("> ")
2022-09-03 23:15:35 -04:00
for scanner.Scan() {
line := scanner.Text()
if len(line) == 0 {
return
}
err := interpret(line)
if err != nil {
fmt.Printf("%v\n", err)
}
2023-02-19 11:07:46 -05:00
fmt.Print("> ")
2022-09-03 23:15:35 -04:00
}
}
func runFile(path string) {
code, err := ioutil.ReadFile(path) // the file is inside the local directory
if err != nil {
fmt.Printf("%v\n", err)
os.Exit(65)
}
err = interpret(string(code))
if err != nil {
fmt.Printf("%v\n", err)
os.Exit(65)
}
}
func interpret(src string) error {
tokens, err := varaq.Tokenize(src)
if err != nil {
return fmt.Errorf("%v", err)
}
code := varaq.Parse(tokens)
err = varaq.Interpret(code, os.Args[1:])
if err != nil {
fmt.Printf("%v\n", err)
return err
}
return nil
}