flexer.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. import "os"
  3. import "io"
  4. import "path/filepath"
  5. import "fmt"
  6. import "flag"
  7. import "strings"
  8. import "src.eruta.nl/beoran/ll1/flexer"
  9. func help() {
  10. fmt.Printf("flexer usage: flexer [-o output.go] input.flex\n")
  11. fmt.Printf("\nGenerates a lexer in Go language.\n")
  12. os.Exit(1)
  13. }
  14. func showError(in string, err interface{}) {
  15. fmt.Fprintf(os.Stderr, "%s: error: %s\n", in, err)
  16. }
  17. func fatal(err error, code int) {
  18. fmt.Fprintf(os.Stderr, "flexer: error: %s\n", err)
  19. os.Exit(code)
  20. }
  21. func main() {
  22. outPtr := flag.String("o", "", "")
  23. flag.Parse()
  24. if flag.NArg() < 1 {
  25. help()
  26. }
  27. inName := flag.Arg(0)
  28. inFile, err := os.Open(inName)
  29. if err != nil {
  30. fatal(err, 1)
  31. }
  32. defer inFile.Close()
  33. buf, err := io.ReadAll(inFile)
  34. if err != nil {
  35. fatal(err, 2)
  36. }
  37. outName := inName + ".go"
  38. if outPtr != nil && *outPtr != "" {
  39. outName = *outPtr
  40. }
  41. abs, err := filepath.Abs(outName)
  42. if err != nil {
  43. fatal(err, 3)
  44. }
  45. parts := filepath.SplitList(abs)
  46. pkg := strings.TrimSuffix(filepath.Base(inName), filepath.Ext(inName))
  47. if len(parts) > 2 {
  48. pkg = parts[len(parts)-1]
  49. }
  50. tokens := flexer.LexFlexerInputString(inName, string(buf))
  51. fmt.Printf("package %s\n\n", pkg)
  52. for _, tok := range tokens {
  53. fmt.Printf("tok: %v\n", tok)
  54. }
  55. }