From f691b5cb74492b97cc4adc9d02bf39633e768503 Mon Sep 17 00:00:00 2001 From: Ryo Nihei Date: Mon, 13 Sep 2021 00:40:02 +0900 Subject: Add maleeni-go command maleeni-go generates a lexer that recognizes a specific lexical specification. --- cmd/maleeni-go/generate.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 cmd/maleeni-go/generate.go (limited to 'cmd/maleeni-go/generate.go') diff --git a/cmd/maleeni-go/generate.go b/cmd/maleeni-go/generate.go new file mode 100644 index 0000000..d37defd --- /dev/null +++ b/cmd/maleeni-go/generate.go @@ -0,0 +1,68 @@ +package main + +import ( + _ "embed" + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/nihei9/maleeni/driver" + "github.com/nihei9/maleeni/spec" + "github.com/spf13/cobra" +) + +func Execute() error { + err := generateCmd.Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + return err + } + + return nil +} + +var generateFlags = struct { + pkgName *string +}{} + +var generateCmd = &cobra.Command{ + Use: "maleeni-go", + Short: "Generate a lexer for Go", + Long: `maleeni-go generates a lexer for Go. The lexer recognizes the lexical specification specified as the argument.`, + Example: ` maleeni-go clexspec.json > lexer.go`, + Args: cobra.ExactArgs(1), + RunE: runGenerate, + SilenceErrors: true, + SilenceUsage: true, +} + +func init() { + generateFlags.pkgName = generateCmd.Flags().StringP("package", "p", "main", "package name") +} + +func runGenerate(cmd *cobra.Command, args []string) (retErr error) { + clspec, err := readCompiledLexSpec(args[0]) + if err != nil { + return fmt.Errorf("Cannot read a compiled lexical specification: %w", err) + } + + return driver.GenLexer(clspec, *generateFlags.pkgName) +} + +func readCompiledLexSpec(path string) (*spec.CompiledLexSpec, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + data, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + clspec := &spec.CompiledLexSpec{} + err = json.Unmarshal(data, clspec) + if err != nil { + return nil, err + } + return clspec, nil +} -- cgit v1.2.3