79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
STAMP_FORMAT = "20060102-150405"
|
|
)
|
|
|
|
func checkUsage(debugFlag string, args []string) {
|
|
if debugFlag != "" && debugFlag != "lexer" && debugFlag != "parser" && debugFlag != "search" {
|
|
fmt.Fprintln(os.Stderr, "invalid value for 'debug'")
|
|
os.Exit(1)
|
|
}
|
|
if len(args) != 1 {
|
|
fmt.Fprintln(os.Stderr, "USAGE:", os.Args[0], "FILE")
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func outfile(infile string) *os.File {
|
|
basename := path.Base(infile)
|
|
extension := path.Ext(basename)
|
|
basename = strings.TrimSuffix(basename, extension)
|
|
name := basename + "-" + time.Now().Format(STAMP_FORMAT) + ".txt"
|
|
f, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, 0644)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println(name)
|
|
return f
|
|
}
|
|
|
|
func main() {
|
|
var debug string
|
|
var stdout bool
|
|
flag.StringVar(&debug, "debug", "", "debug output of 'lexer', 'parser' or 'search'")
|
|
flag.BoolVar(&stdout, "stdout", false, "use stdout instead of file output")
|
|
flag.Parse()
|
|
args := flag.Args()
|
|
checkUsage(debug, args)
|
|
filename := args[0]
|
|
bytes, err := ioutil.ReadFile(filename)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
} else {
|
|
input := []rune(string(bytes))
|
|
switch debug {
|
|
case "lexer":
|
|
DebugLexer(input, os.Stdout)
|
|
case "parser":
|
|
DebugParser(input, os.Stdout)
|
|
case "search":
|
|
DebugSearch(input)
|
|
default:
|
|
parsed := NewParser(input).Parse()
|
|
var writer io.Writer
|
|
if stdout {
|
|
writer = os.Stdout
|
|
} else {
|
|
out := outfile(filename)
|
|
defer out.Close()
|
|
writer = out
|
|
}
|
|
generator := NewStdGenerator(writer)
|
|
generator.Generate(parsed)
|
|
}
|
|
}
|
|
}
|