package main import ( "bufio" "fmt" "io/ioutil" "os" ) var ( hadError bool = false ) func main() { if len(os.Args) > 2 { fmt.Println("Usage: pj1-go [script]") os.Exit(64) } else if len(os.Args) == 2 { runFile(os.Args[0]) } else { runPrompt() } } func runFile(path string) { bytes, err := ioutil.ReadFile(path) if err != nil { fmt.Println(err) return } run(string(bytes[:])) if hadError { os.Exit(65) } } func runPrompt() { scanner := bufio.NewScanner(os.Stdin) for { fmt.Print("> ") if !scanner.Scan() { break } line := scanner.Text() fmt.Println(line) run(line) hadError = false } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading standard input:", err) } } func run(source string) { lexer := NewLexer(source) lexer.ScanTokens() var tokens []Token = lexer.tokens for _, token := range tokens { fmt.Println(token) } } // TODO: might have to rename func error(line int, msg string) { report(line, "", msg) hadError = true } func report(line int, where string, msg string) { fmt.Fprintln(os.Stderr, "[line "+fmt.Sprint(line)+"] Error"+where+": "+msg) }