diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-08-26 23:16:09 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-08-26 23:18:49 +0900 |
commit | 7271e46bbcb11acf860c91eddfe12dd7eed5ccad (patch) | |
tree | fafbf797ca806ff1e4cc68acaaaa6db66aec632d /cmd/vartan/parse.go | |
parent | Update CHANGELOG (diff) | |
download | urubu-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.go | 26 |
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() |