diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-09-18 21:25:48 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-09-18 23:48:51 +0900 |
commit | 7be1d273429765907af0abad182666d77eb557e4 (patch) | |
tree | 1dcb0d68d8d65e4a8f847a6790eed5c7c0854401 /cmd | |
parent | Generate constant values representing mode IDs, mode names, kind IDs, and kin... (diff) | |
download | tre-7be1d273429765907af0abad182666d77eb557e4.tar.gz tre-7be1d273429765907af0abad182666d77eb557e4.tar.xz |
Add name field to the lexical specification
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/maleeni-go/generate.go | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/cmd/maleeni-go/generate.go b/cmd/maleeni-go/generate.go index d37defd..d31daed 100644 --- a/cmd/maleeni-go/generate.go +++ b/cmd/maleeni-go/generate.go @@ -24,13 +24,14 @@ func Execute() error { var generateFlags = struct { pkgName *string + output *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`, + Example: ` maleeni-go clexspec.json`, Args: cobra.ExactArgs(1), RunE: runGenerate, SilenceErrors: true, @@ -39,6 +40,7 @@ var generateCmd = &cobra.Command{ func init() { generateFlags.pkgName = generateCmd.Flags().StringP("package", "p", "main", "package name") + generateFlags.output = generateCmd.Flags().StringP("output", "o", "", "output file path") } func runGenerate(cmd *cobra.Command, args []string) (retErr error) { @@ -47,7 +49,30 @@ func runGenerate(cmd *cobra.Command, args []string) (retErr error) { return fmt.Errorf("Cannot read a compiled lexical specification: %w", err) } - return driver.GenLexer(clspec, *generateFlags.pkgName) + b, err := driver.GenLexer(clspec, *generateFlags.pkgName) + if err != nil { + return fmt.Errorf("Failed to generate a lexer: %v", err) + } + + var filePath string + if *generateFlags.output != "" { + filePath = *generateFlags.output + } else { + filePath = fmt.Sprintf("%v_lexer.go", clspec.Name) + } + + f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return fmt.Errorf("Failed to create an output file: %v", err) + } + defer f.Close() + + _, err = f.Write(b) + if err != nil { + return fmt.Errorf("Failed to write lexer source code: %v", err) + } + + return nil } func readCompiledLexSpec(path string) (*spec.CompiledLexSpec, error) { |