aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--cmd/vartan-go/generate.go40
-rw-r--r--cmd/vartan-go/main.go2
-rw-r--r--cmd/vartan/compile.go20
-rw-r--r--cmd/vartan/parse.go119
-rw-r--r--cmd/vartan/root.go14
-rw-r--r--cmd/vartan/show.go13
-rw-r--r--cmd/vartan/test.go13
8 files changed, 34 insertions, 189 deletions
diff --git a/Makefile b/Makefile
index b5643ed..5fa873a 100644
--- a/Makefile
+++ b/Makefile
@@ -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])