diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | cmd/vartan-go/generate.go | 40 | ||||
-rw-r--r-- | cmd/vartan-go/main.go | 2 | ||||
-rw-r--r-- | cmd/vartan/compile.go | 20 | ||||
-rw-r--r-- | cmd/vartan/parse.go | 119 | ||||
-rw-r--r-- | cmd/vartan/root.go | 14 | ||||
-rw-r--r-- | cmd/vartan/show.go | 13 | ||||
-rw-r--r-- | cmd/vartan/test.go | 13 |
8 files changed, 34 insertions, 189 deletions
@@ -107,7 +107,7 @@ $(libs.a): src/$(NAME).go src/version.go $(existing.a): - go tool compile -I . -o $@ -p $* $*/*.go + go tool compile -I . -o $@ -p $* `find $*/*.go | grep -v _test` $(xmains.a): go tool compile -I . -o $@ -p main $*/*.go diff --git a/cmd/vartan-go/generate.go b/cmd/vartan-go/generate.go index 7d84da9..0355558 100644 --- a/cmd/vartan-go/generate.go +++ b/cmd/vartan-go/generate.go @@ -2,48 +2,23 @@ package main import ( "encoding/json" - // "fmt" + "fmt" "io" "os" - // "driver/lexer" - // "driver/parser" + "driver/lexer" + "driver/parser" spec "spec/grammar" ) -func Execute() error { - // return generateCmd.Execute() - return nil -} - -var generateFlags = struct { - pkgName *string -}{} - -/* -var generateCmd = &cobra.Command{ - Use: "vartan-go", - Short: "Generate a parser for Go", - Long: `vartan-go generates a parser for Go.`, - Example: ` vartan-go grammar.json`, - 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) error { +func runGenerate(args []string) error { cgram, err := readCompiledGrammar(args[0]) if err != nil { return fmt.Errorf("Cannot read a compiled grammar: %w", err) } { - b, err := lexer.GenLexer(cgram.Lexical, *generateFlags.pkgName) + b, err := lexer.GenLexer(cgram.Lexical, "main") if err != nil { return fmt.Errorf("Failed to generate a lexer: %w", err) } @@ -63,7 +38,7 @@ func runGenerate(cmd *cobra.Command, args []string) error { } { - b, err := parser.GenParser(cgram, *generateFlags.pkgName) + b, err := parser.GenParser(cgram, "main") if err != nil { return fmt.Errorf("Failed to generate a parser: %w", err) } @@ -83,7 +58,7 @@ func runGenerate(cmd *cobra.Command, args []string) error { } { - b, err := parser.GenSemanticAction(*generateFlags.pkgName) + b, err := parser.GenSemanticAction("main") if err != nil { return fmt.Errorf("Failed to generate a semantic action set: %w", err) } @@ -104,7 +79,6 @@ func runGenerate(cmd *cobra.Command, args []string) error { return nil } -*/ func readCompiledGrammar(path string) (*spec.CompiledGrammar, error) { f, err := os.Open(path) diff --git a/cmd/vartan-go/main.go b/cmd/vartan-go/main.go index 98f98e1..315e7b3 100644 --- a/cmd/vartan-go/main.go +++ b/cmd/vartan-go/main.go @@ -6,7 +6,7 @@ import ( ) func main() { - err := Execute() + err := runGenerate(os.Args[1:]) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/cmd/vartan/compile.go b/cmd/vartan/compile.go index 0755456..95a4c58 100644 --- a/cmd/vartan/compile.go +++ b/cmd/vartan/compile.go @@ -13,23 +13,7 @@ import ( "spec/grammar/parser" ) -var compileFlags = struct { - output *string -}{} - -/* -func init() { - cmd := &cobra.Command{ - Use: "compile", - Short: "Compile grammar you defined into a parsing table", - Example: ` vartan compile grammar.vartan -o grammar.json`, - Args: cobra.MaximumNArgs(1), - RunE: runCompile, - } - compileFlags.output = cmd.Flags().StringP("output", "o", "", "output file path (default stdout)") - rootCmd.AddCommand(cmd) -} -*/ + func runCompile(args []string) (retErr error) { var tmpDirPath string @@ -85,7 +69,7 @@ func runCompile(args []string) (retErr error) { return err } - err = writeCompiledGrammarAndReport(gram, report, *compileFlags.output) + err = writeCompiledGrammarAndReport(gram, report, "") if err != nil { return fmt.Errorf("Cannot write an output files: %w", err) } diff --git a/cmd/vartan/parse.go b/cmd/vartan/parse.go index 50d867e..c876c09 100644 --- a/cmd/vartan/parse.go +++ b/cmd/vartan/parse.go @@ -9,100 +9,33 @@ import ( driver "driver/parser" spec "spec/grammar" - "tester" ) -var parseFlags = struct { - source *string - onlyParse *bool - cst *bool - disableLAC *bool - format *string -}{} - -const ( - outputFormatText = "text" - outputFormatTree = "tree" - outputFormatJSON = "json" -) -/* -func init() { - cmd := &cobra.Command{ - Use: "parse <grammar file path>", - Short: "Parse a text stream", - Example: ` cat src | vartan parse grammar.json`, - Args: cobra.ExactArgs(1), - RunE: runParse, - } - parseFlags.source = cmd.Flags().StringP("source", "s", "", "source file path (default stdin)") - parseFlags.onlyParse = cmd.Flags().Bool("only-parse", false, "when this option is enabled, the parser performs only parse and doesn't semantic actions") - parseFlags.cst = cmd.Flags().Bool("cst", false, "when this option is enabled, the parser generates a CST") - parseFlags.disableLAC = cmd.Flags().Bool("disable-lac", false, "disable LAC (lookahead correction)") - parseFlags.format = cmd.Flags().StringP("format", "f", "text", "output format: one of text|tree|json") - rootCmd.AddCommand(cmd) -} -*/ func runParse(args []string) error { - if *parseFlags.onlyParse && *parseFlags.cst { - return fmt.Errorf("You cannot enable --only-parse and --cst at the same time") - } - if *parseFlags.format != outputFormatText && - *parseFlags.format != outputFormatTree && - *parseFlags.format != outputFormatJSON { - return fmt.Errorf("invalid output format: %v", *parseFlags.format) - } - cg, err := readCompiledGrammar(args[0]) if err != nil { return fmt.Errorf("Cannot read a compiled grammar: %w", err) } - var p *driver.Parser - var treeAct *driver.SyntaxTreeActionSet - var tb *driver.DefaultSyntaxTreeBuilder - { - src := os.Stdin - if *parseFlags.source != "" { - f, err := os.Open(*parseFlags.source) - if err != nil { - return fmt.Errorf("Cannot open the source file %s: %w", *parseFlags.source, err) - } - defer f.Close() - src = f - } + src := os.Stdin + gram := driver.NewGrammar(cg) - gram := driver.NewGrammar(cg) - - var opts []driver.ParserOption - { - switch { - case *parseFlags.cst: - tb = driver.NewDefaultSyntaxTreeBuilder() - treeAct = driver.NewCSTActionSet(gram, tb) - case !*parseFlags.onlyParse: - tb = driver.NewDefaultSyntaxTreeBuilder() - treeAct = driver.NewASTActionSet(gram, tb) - } - if treeAct != nil { - opts = append(opts, driver.SemanticAction(treeAct)) - } - - if *parseFlags.disableLAC { - opts = append(opts, driver.DisableLAC()) - } - } + tb := driver.NewDefaultSyntaxTreeBuilder() + treeAct := driver.NewCSTActionSet(gram, tb) - toks, err := driver.NewTokenStream(cg, src) - if err != nil { - return err - } + opts := []driver.ParserOption{} + opts = append(opts, driver.SemanticAction(treeAct)) - p, err = driver.NewParser(toks, gram, opts...) - if err != nil { - return err - } + toks, err := driver.NewTokenStream(cg, src) + if err != nil { + return err + } + + p, err := driver.NewParser(toks, gram, opts...) + if err != nil { + return err } err = p.Parse() @@ -110,24 +43,14 @@ func runParse(args []string) error { return err } - if !*parseFlags.onlyParse { - // A parser can construct a parse tree even if syntax errors occur. - // When therer is a parse tree, print it. - if tree := tb.Tree(); tree != nil { - switch *parseFlags.format { - case "tree": - b := tester.ConvertSyntaxTreeToTestableTree(tree).Format() - fmt.Fprintln(os.Stdout, string(b)) - case "json": - b, err := json.Marshal(tree) - if err != nil { - return err - } - fmt.Fprintln(os.Stdout, string(b)) - default: - driver.PrintTree(os.Stdout, tree) - } + // A parser can construct a parse tree even if syntax errors occur. + // When therer is a parse tree, print it. + if tree := tb.Tree(); tree != nil { + b, err := json.Marshal(tree) + if err != nil { + return err } + fmt.Fprintln(os.Stdout, string(b)) } if len(p.SyntaxErrors()) > 0 { diff --git a/cmd/vartan/root.go b/cmd/vartan/root.go index 32eb3c3..3dda70c 100644 --- a/cmd/vartan/root.go +++ b/cmd/vartan/root.go @@ -4,21 +4,7 @@ import ( "os" ) -/* -var rootCmd = &cobra.Command{ - Use: "vartan", - Short: "Generate a portable LALR(1) parsing table from grammar you defined", - Long: `vartan provides two features: -- Generate a portable LALR(1) parsing table from grammar you defined. -- Parse a text stream according to the grammar.`, - SilenceErrors: true, - SilenceUsage: true, -} -*/ - func Execute() error { - // return rootCmd.Execute() - cmd := os.Args[1] args := os.Args[2:] diff --git a/cmd/vartan/show.go b/cmd/vartan/show.go index c56be1f..397ac7f 100644 --- a/cmd/vartan/show.go +++ b/cmd/vartan/show.go @@ -12,18 +12,7 @@ import ( spec "spec/grammar" ) -/* -func init() { - cmd := &cobra.Command{ - Use: "show", - Short: "Print a report in a readable format", - Example: ` vartan show grammar-report.json`, - Args: cobra.ExactArgs(1), - RunE: runShow, - } - rootCmd.AddCommand(cmd) -} -*/ + func runShow(args []string) error { report, err := readReport(args[0]) diff --git a/cmd/vartan/test.go b/cmd/vartan/test.go index 73949e0..25bd27f 100644 --- a/cmd/vartan/test.go +++ b/cmd/vartan/test.go @@ -8,18 +8,7 @@ import ( "tester" ) -/* -func init() { - cmd := &cobra.Command{ - Use: "test <grammar file path> <test file path>|<test directory path>", - Short: "Test a grammar", - Example: ` vartan test grammar.vartan test`, - Args: cobra.ExactArgs(2), - RunE: runTest, - } - rootCmd.AddCommand(cmd) -} -*/ + func runTest(args []string) error { gram, _, err := readGrammar(args[0]) |