You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
|
|
|
func input() io.ReadCloser {
|
|
|
|
if flag.Arg(1) == "" {
|
|
|
|
return os.Stdin
|
|
|
|
} else {
|
|
|
|
f, err := os.Open(flag.Arg(1))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "error: %s\n", err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func check() {
|
|
|
|
r := input()
|
|
|
|
defer r.Close()
|
|
|
|
|
|
|
|
_, err := parse(r)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "%s\n", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func lexx() {
|
|
|
|
r := input()
|
|
|
|
defer r.Close()
|
|
|
|
|
|
|
|
c := lex(r)
|
|
|
|
for t := range c {
|
|
|
|
fmt.Println(t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func parsse() {
|
|
|
|
r := input()
|
|
|
|
defer r.Close()
|
|
|
|
|
|
|
|
n, err := parse(r)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "error: %s", err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
if err := n.pretty(os.Stdout, ""); err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "error: %s\n", err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
flag.Parse()
|
|
|
|
switch flag.Arg(0) {
|
|
|
|
case "check":
|
|
|
|
check()
|
|
|
|
case "lex":
|
|
|
|
lexx()
|
|
|
|
case "parse":
|
|
|
|
parsse()
|
|
|
|
case "":
|
|
|
|
fmt.Fprintf(os.Stderr, "specify an action (check)\n")
|
|
|
|
os.Exit(1)
|
|
|
|
default:
|
|
|
|
fmt.Fprintf(os.Stderr, "no such action: %s\n", flag.Arg(0))
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|