123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package main
- import "os"
- import "io"
- import "path/filepath"
- import "fmt"
- import "flag"
- import "strings"
- import "src.eruta.nl/beoran/ll1/flexer"
- func help() {
- fmt.Printf("flexer usage: flexer [-o output.go] input.flex\n")
- fmt.Printf("\nGenerates a lexer in Go language.\n")
- os.Exit(1)
- }
- func showError(in string, err interface{}) {
- fmt.Fprintf(os.Stderr, "%s: error: %s\n", in, err)
- }
- func fatal(err error, code int) {
- fmt.Fprintf(os.Stderr, "flexer: error: %s\n", err)
- os.Exit(code)
- }
- func main() {
- outPtr := flag.String("o", "", "")
- flag.Parse()
- if flag.NArg() < 1 {
- help()
- }
- inName := flag.Arg(0)
- inFile, err := os.Open(inName)
- if err != nil {
- fatal(err, 1)
- }
- defer inFile.Close()
- buf, err := io.ReadAll(inFile)
- if err != nil {
- fatal(err, 2)
- }
- outName := inName + ".go"
- if outPtr != nil && *outPtr != "" {
- outName = *outPtr
- }
- abs, err := filepath.Abs(outName)
- if err != nil {
- fatal(err, 3)
- }
- parts := filepath.SplitList(abs)
- pkg := strings.TrimSuffix(filepath.Base(inName), filepath.Ext(inName))
- if len(parts) > 2 {
- pkg = parts[len(parts)-1]
- }
- tokens := flexer.LexFlexerInputString(inName, string(buf))
- fmt.Printf("package %s\n\n", pkg)
- for _, tok := range tokens {
- fmt.Printf("tok: %v\n", tok)
- }
- }
|