| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- package main
- import (
- "flag"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "strings"
- )
- var outFilename string
- var nfadotFile, dfadotFile string
- var autorun, standalone, customError bool
- var prefix string
- var prefixReplacer *strings.Replacer
- func init() {
- prefixReplacer = strings.NewReplacer()
- }
- func main() {
- flag.StringVar(&prefix, "p", "yy", "name prefix to use in generated code")
- flag.StringVar(&outFilename, "o", "", `output file`)
- flag.BoolVar(&standalone, "s", false, `standalone code; NN_FUN macro substitution, no Lex() method`)
- flag.BoolVar(&customError, "e", false, `custom error func; no Error() method`)
- flag.BoolVar(&autorun, "r", false, `run generated program`)
- flag.StringVar(&nfadotFile, "nfadot", "", `show NFA graph in DOT format`)
- flag.StringVar(&dfadotFile, "dfadot", "", `show DFA graph in DOT format`)
- flag.Parse()
- if len(prefix) > 0 {
- prefixReplacer = strings.NewReplacer("yy", prefix)
- }
- nfadot = createDotFile(nfadotFile)
- dfadot = createDotFile(dfadotFile)
- defer func() {
- if nfadot != nil {
- dieErr(nfadot.Close(), "Close")
- }
- if dfadot != nil {
- dieErr(dfadot.Close(), "Close")
- }
- }()
- infile, outfile := os.Stdin, os.Stdout
- var err error
- if flag.NArg() > 0 {
- dieIf(flag.NArg() > 1, "nex: extraneous arguments after", flag.Arg(0))
- dieIf(strings.HasSuffix(flag.Arg(0), ".go"), "nex: input filename ends with .go:", flag.Arg(0))
- basename := flag.Arg(0)
- n := strings.LastIndex(basename, ".")
- if n >= 0 {
- basename = basename[:n]
- }
- infile, err = os.Open(flag.Arg(0))
- dieErr(err, "nex")
- defer infile.Close()
- if !autorun {
- if outFilename == "" {
- outFilename = basename + ".nn.go"
- outfile, err = os.Create(outFilename)
- } else {
- outfile, err = os.Create(outFilename)
- }
- dieErr(err, "nex")
- defer outfile.Close()
- }
- }
- if autorun {
- tmpdir, err := ioutil.TempDir("", "nex")
- dieIf(err != nil, "tempdir:", err)
- defer func() {
- dieErr(os.RemoveAll(tmpdir), "RemoveAll")
- }()
- outfile, err = os.Create(tmpdir + "/lets.go")
- dieErr(err, "nex")
- defer outfile.Close()
- }
- err = process(outfile, infile)
- if err != nil {
- log.Fatal(err)
- }
- if autorun {
- c := exec.Command("go", "run", outfile.Name())
- c.Stdin, c.Stdout, c.Stderr = os.Stdin, os.Stdout, os.Stderr
- dieErr(c.Run(), "go run")
- }
- }
|