aboutsummaryrefslogtreecommitdiff
path: root/cmd/vartan/parse.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-08-26 23:16:09 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-08-26 23:18:49 +0900
commit7271e46bbcb11acf860c91eddfe12dd7eed5ccad (patch)
treefafbf797ca806ff1e4cc68acaaaa6db66aec632d /cmd/vartan/parse.go
parentUpdate CHANGELOG (diff)
downloadurubu-7271e46bbcb11acf860c91eddfe12dd7eed5ccad.tar.gz
urubu-7271e46bbcb11acf860c91eddfe12dd7eed5ccad.tar.xz
Add error symbol and #recover directive to recover from an error state
Diffstat (limited to 'cmd/vartan/parse.go')
-rw-r--r--cmd/vartan/parse.go26
1 files changed, 25 insertions, 1 deletions
diff --git a/cmd/vartan/parse.go b/cmd/vartan/parse.go
index 89de6f0..36401e1 100644
--- a/cmd/vartan/parse.go
+++ b/cmd/vartan/parse.go
@@ -96,7 +96,31 @@ func runParse(cmd *cobra.Command, args []string) (retErr error) {
return err
}
- if !*parseFlags.onlyParse {
+ 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>)", tok.Text())
+ default:
+ msg = fmt.Sprintf("'%v' (%v)", tok.Text(), tok.KindName)
+ }
+
+ 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 len(synErrs) == 0 && !*parseFlags.onlyParse {
var tree *driver.Node
if *parseFlags.cst {
tree = p.CST()