aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/maleeni-go/generate.go68
-rw-r--r--cmd/maleeni-go/main.go12
2 files changed, 80 insertions, 0 deletions
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
+}
diff --git a/cmd/maleeni-go/main.go b/cmd/maleeni-go/main.go
new file mode 100644
index 0000000..701f02f
--- /dev/null
+++ b/cmd/maleeni-go/main.go
@@ -0,0 +1,12 @@
+package main
+
+import (
+ "os"
+)
+
+func main() {
+ err := Execute()
+ if err != nil {
+ os.Exit(1)
+ }
+}