2024-11-25 22:53:29 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
|
2024-11-25 22:53:29 +01:00
|
|
|
"git.bonsai.cool/kayprish/pj1/pj1-go/lexer"
|
|
|
|
"git.bonsai.cool/kayprish/pj1/pj1-go/util"
|
2024-11-25 22:53:29 +01:00
|
|
|
)
|
|
|
|
|
2025-01-15 21:09:56 +01:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
}
|
2024-11-25 22:53:29 +01:00
|
|
|
|
|
|
|
func runFile(path string) {
|
|
|
|
bytes, err := ioutil.ReadFile(path)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
run(string(bytes[:]))
|
|
|
|
|
2024-11-25 22:53:29 +01:00
|
|
|
if util.HadError {
|
2024-11-25 22:53:29 +01:00
|
|
|
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)
|
|
|
|
|
2024-11-25 22:53:29 +01:00
|
|
|
util.HadError = false
|
2024-11-25 22:53:29 +01:00
|
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
|
|
fmt.Fprintln(os.Stderr, "reading standard input:", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func run(source string) {
|
2024-11-25 22:53:29 +01:00
|
|
|
l := lexer.NewLexer(source)
|
|
|
|
l.ScanTokens()
|
|
|
|
var tokens []lexer.Token = l.Tokens
|
2024-11-25 22:53:29 +01:00
|
|
|
|
|
|
|
for _, token := range tokens {
|
|
|
|
fmt.Println(token)
|
|
|
|
}
|
|
|
|
}
|