aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2022-05-13 01:26:20 +0900
committerRyo Nihei <nihei.dev@gmail.com>2022-05-15 20:42:24 +0900
commitacc2df9107e6531529460c7a77da07166d2d45bb (patch)
tree8cd5b0d9e30c36e63747bb398dd0350b3300562c
parentUpdate CHANGELOG (diff)
downloadurubu-acc2df9107e6531529460c7a77da07166d2d45bb.tar.gz
urubu-acc2df9107e6531529460c7a77da07166d2d45bb.tar.xz
Stop handling panic to print a stack trace
-rw-r--r--cmd/vartan-go/generate.go35
-rw-r--r--cmd/vartan-go/main.go2
-rw-r--r--cmd/vartan/compile.go21
-rw-r--r--cmd/vartan/main.go2
-rw-r--r--cmd/vartan/parse.go89
-rw-r--r--cmd/vartan/show.go27
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