75 lines
1.1 KiB
Go
75 lines
1.1 KiB
Go
|
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)
|
||
|
}
|