diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2022-05-13 01:26:20 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2022-05-15 20:42:24 +0900 |
commit | acc2df9107e6531529460c7a77da07166d2d45bb (patch) | |
tree | 8cd5b0d9e30c36e63747bb398dd0350b3300562c | |
parent | Update CHANGELOG (diff) | |
download | urubu-acc2df9107e6531529460c7a77da07166d2d45bb.tar.gz urubu-acc2df9107e6531529460c7a77da07166d2d45bb.tar.xz |
Stop handling panic to print a stack trace
-rw-r--r-- | cmd/vartan-go/generate.go | 35 | ||||
-rw-r--r-- | cmd/vartan-go/main.go | 2 | ||||
-rw-r--r-- | cmd/vartan/compile.go | 21 | ||||
-rw-r--r-- | cmd/vartan/main.go | 2 | ||||
-rw-r--r-- | cmd/vartan/parse.go | 89 | ||||
-rw-r--r-- | cmd/vartan/show.go | 27 |
6 files changed, 41 insertions, 135 deletions
diff --git a/cmd/vartan-go/generate.go b/cmd/vartan-go/generate.go index 27f7236..1aabb26 100644 --- a/cmd/vartan-go/generate.go +++ b/cmd/vartan-go/generate.go @@ -5,7 +5,6 @@ import ( "fmt" "io/ioutil" "os" - "runtime/debug" mldriver "github.com/nihei9/maleeni/driver" "github.com/nihei9/vartan/driver" @@ -14,13 +13,7 @@ import ( ) func Execute() error { - err := generateCmd.Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - return err - } - - return nil + return generateCmd.Execute() } var generateFlags = struct { @@ -42,31 +35,7 @@ func init() { generateFlags.pkgName = generateCmd.Flags().StringP("package", "p", "main", "package name") } -func runGenerate(cmd *cobra.Command, args []string) (retErr error) { - defer func() { - panicked := false - v := recover() - if v != nil { - err, ok := v.(error) - if !ok { - retErr = fmt.Errorf("an unexpected error occurred: %v", v) - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - return - } - - retErr = err - panicked = true - } - - if retErr != nil { - if panicked { - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - } else { - fmt.Fprintf(os.Stderr, "%v\n", retErr) - } - } - }() - +func runGenerate(cmd *cobra.Command, args []string) error { cgram, err := readCompiledGrammar(args[0]) if err != nil { return fmt.Errorf("Cannot read a compiled grammar: %w", err) diff --git a/cmd/vartan-go/main.go b/cmd/vartan-go/main.go index 701f02f..98f98e1 100644 --- a/cmd/vartan-go/main.go +++ b/cmd/vartan-go/main.go @@ -1,12 +1,14 @@ package main import ( + "fmt" "os" ) func main() { err := Execute() if err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } } diff --git a/cmd/vartan/compile.go b/cmd/vartan/compile.go index 70d01b2..e2b5f56 100644 --- a/cmd/vartan/compile.go +++ b/cmd/vartan/compile.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "os" "path/filepath" - "runtime/debug" "strings" verr "github.com/nihei9/vartan/error" @@ -47,20 +46,6 @@ func runCompile(cmd *cobra.Command, args []string) (retErr error) { grmPath = args[0] } defer func() { - panicked := false - v := recover() - if v != nil { - err, ok := v.(error) - if !ok { - retErr = fmt.Errorf("an unexpected error occurred: %v", v) - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - return - } - - retErr = err - panicked = true - } - if retErr != nil { specErrs, ok := retErr.(verr.SpecErrors) if ok { @@ -74,12 +59,6 @@ func runCompile(cmd *cobra.Command, args []string) (retErr error) { } } } - - if panicked { - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - } else { - fmt.Fprintf(os.Stderr, "%v\n", retErr) - } } }() diff --git a/cmd/vartan/main.go b/cmd/vartan/main.go index 701f02f..98f98e1 100644 --- a/cmd/vartan/main.go +++ b/cmd/vartan/main.go @@ -1,12 +1,14 @@ package main import ( + "fmt" "os" ) func main() { err := Execute() if err != nil { + fmt.Fprintln(os.Stderr, err) os.Exit(1) } } diff --git a/cmd/vartan/parse.go b/cmd/vartan/parse.go index 77bb9f0..192a9ab 100644 --- a/cmd/vartan/parse.go +++ b/cmd/vartan/parse.go @@ -5,7 +5,7 @@ import ( "fmt" "io/ioutil" "os" - "runtime/debug" + "strings" "github.com/nihei9/vartan/driver" "github.com/nihei9/vartan/spec" @@ -36,31 +36,7 @@ func init() { rootCmd.AddCommand(cmd) } -func runParse(cmd *cobra.Command, args []string) (retErr error) { - defer func() { - panicked := false - v := recover() - if v != nil { - err, ok := v.(error) - if !ok { - retErr = fmt.Errorf("an unexpected error occurred: %v", v) - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - return - } - - retErr = err - panicked = true - } - - if retErr != nil { - if panicked { - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - } else { - fmt.Fprintf(os.Stderr, "%v\n", retErr) - } - } - }() - +func runParse(cmd *cobra.Command, args []string) error { if *parseFlags.onlyParse && *parseFlags.cst { return fmt.Errorf("You cannot enable --only-parse and --cst at the same time") } @@ -121,31 +97,6 @@ func runParse(cmd *cobra.Command, args []string) (retErr error) { return err } - synErrs := p.SyntaxErrors() - for _, synErr := range synErrs { - tok := synErr.Token - - var msg string - switch { - case tok.EOF(): - msg = "<eof>" - case tok.Invalid(): - msg = fmt.Sprintf("'%v' (<invalid>)", string(tok.Lexeme())) - default: - t := cg.ParsingTable.Terminals[tok.TerminalID()] - msg = fmt.Sprintf("'%v' (%v)", string(tok.Lexeme()), t) - } - - fmt.Fprintf(os.Stderr, "%v:%v: %v: %v", synErr.Row+1, synErr.Col+1, synErr.Message, msg) - if len(synErrs) > 0 { - fmt.Fprintf(os.Stderr, "; expected: %v", synErr.ExpectedTerminals[0]) - for _, t := range synErr.ExpectedTerminals[1:] { - fmt.Fprintf(os.Stderr, ", %v", t) - } - } - fmt.Fprintf(os.Stderr, "\n") - } - if !*parseFlags.onlyParse { // A parser can construct a parse tree even if syntax errors occur. // When therer is a parse tree, print it. @@ -157,10 +108,6 @@ func runParse(cmd *cobra.Command, args []string) (retErr error) { tree = tb.Tree() } if tree != nil { - if len(synErrs) > 0 { - fmt.Println("") - } - if *parseFlags.json { b, err := json.Marshal(tree) if err != nil { @@ -173,6 +120,19 @@ func runParse(cmd *cobra.Command, args []string) (retErr error) { } } + if len(p.SyntaxErrors()) > 0 { + var b strings.Builder + synErrs := p.SyntaxErrors() + writeSyntaxErrorMessage(&b, cg, synErrs[0]) + for _, synErr := range synErrs[1:] { + fmt.Fprintf(&b, "\n") + writeSyntaxErrorMessage(&b, cg, synErr) + } + if b.Len() > 0 { + return fmt.Errorf(b.String()) + } + } + return nil } @@ -192,3 +152,22 @@ func readCompiledGrammar(path string) (*spec.CompiledGrammar, error) { } return cg, nil } + +func writeSyntaxErrorMessage(b *strings.Builder, cgram *spec.CompiledGrammar, synErr *driver.SyntaxError) { + fmt.Fprintf(b, "%v:%v: %v: ", synErr.Row+1, synErr.Col+1, synErr.Message) + + tok := synErr.Token + switch { + case tok.EOF(): + fmt.Fprintf(b, "<eof>") + case tok.Invalid(): + fmt.Fprintf(b, "'%v' (<invalid>)", string(tok.Lexeme())) + default: + fmt.Fprintf(b, "'%v' (%v)", string(tok.Lexeme()), cgram.ParsingTable.Terminals[tok.TerminalID()]) + } + + fmt.Fprintf(b, "; expected: %v", synErr.ExpectedTerminals[0]) + for _, t := range synErr.ExpectedTerminals[1:] { + fmt.Fprintf(b, ", %v", t) + } +} diff --git a/cmd/vartan/show.go b/cmd/vartan/show.go index 8094515..7b112d9 100644 --- a/cmd/vartan/show.go +++ b/cmd/vartan/show.go @@ -6,7 +6,6 @@ import ( "io" "io/ioutil" "os" - "runtime/debug" "strings" "text/template" @@ -26,31 +25,7 @@ func init() { rootCmd.AddCommand(cmd) } -func runShow(cmd *cobra.Command, args []string) (retErr error) { - defer func() { - panicked := false - v := recover() - if v != nil { - err, ok := v.(error) - if !ok { - retErr = fmt.Errorf("an unexpected error occurred: %v", v) - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - return - } - - retErr = err - panicked = true - } - - if retErr != nil { - if panicked { - fmt.Fprintf(os.Stderr, "%v:\n%v", retErr, string(debug.Stack())) - } else { - fmt.Fprintf(os.Stderr, "%v\n", retErr) - } - } - }() - +func runShow(cmd *cobra.Command, args []string) error { report, err := readReport(args[0]) if err != nil { return err |