aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-09-18 21:25:48 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-09-18 23:48:51 +0900
commit7be1d273429765907af0abad182666d77eb557e4 (patch)
tree1dcb0d68d8d65e4a8f847a6790eed5c7c0854401 /cmd
parentGenerate constant values representing mode IDs, mode names, kind IDs, and kin... (diff)
downloadtre-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.go29
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) {