diff options
-rw-r--r-- | spec/lexer.go | 21 | ||||
-rw-r--r-- | spec/lexer_test.go | 16 |
2 files changed, 31 insertions, 6 deletions
diff --git a/spec/lexer.go b/spec/lexer.go index b19a771..3a5a914 100644 --- a/spec/lexer.go +++ b/spec/lexer.go @@ -12,6 +12,7 @@ import ( mldriver "github.com/nihei9/maleeni/driver" mlspec "github.com/nihei9/maleeni/spec" + verr "github.com/nihei9/vartan/error" ) type tokenKind string @@ -180,7 +181,10 @@ func (l *lexer) lexAndSkipWSs() (*token, error) { return newSymbolToken(tokenKindKWFragment, newPosition(l.row)), nil case "identifier": if strings.HasPrefix(tok.Text(), "_") { - return nil, synErrAutoGenID + return nil, &verr.SpecError{ + Cause: synErrAutoGenID, + Row: l.row, + } } return newIDToken(tok.Text(), newPosition(l.row)), nil case "terminal_open": @@ -191,14 +195,20 @@ func (l *lexer) lexAndSkipWSs() (*token, error) { return nil, err } if tok.EOF { - return nil, synErrUnclosedTerminal + return nil, &verr.SpecError{ + Cause: synErrUnclosedTerminal, + Row: l.row, + } } switch tok.KindName { case "pattern": // Remove '\' character. fmt.Fprintf(&b, strings.ReplaceAll(tok.Text(), `\"`, `"`)) case "escape_symbol": - return nil, synErrIncompletedEscSeq + return nil, &verr.SpecError{ + Cause: synErrIncompletedEscSeq, + Row: l.row, + } case "terminal_close": return newTerminalPatternToken(b.String(), newPosition(l.row)), nil } @@ -222,7 +232,10 @@ func (l *lexer) lexAndSkipWSs() (*token, error) { return nil, err } if num == 0 { - return nil, synErrZeroPos + return nil, &verr.SpecError{ + Cause: synErrZeroPos, + Row: l.row, + } } return newPositionToken(num, newPosition(l.row)), nil case "expansion": diff --git a/spec/lexer_test.go b/spec/lexer_test.go index a5de136..89553d0 100644 --- a/spec/lexer_test.go +++ b/spec/lexer_test.go @@ -3,6 +3,8 @@ package spec import ( "strings" "testing" + + verr "github.com/nihei9/vartan/error" ) func TestLexer_Run(t *testing.T) { @@ -155,8 +157,18 @@ bar // This is the fourth comment. break } } - if err != tt.err { - t.Fatalf("unexpected error; want: %v, got: %v", tt.err, err) + if tt.err != nil { + synErr, ok := err.(*verr.SpecError) + if !ok { + t.Fatalf("unexpected error; want: %v, got: %v", tt.err, err) + } + if tt.err != synErr.Cause { + t.Fatalf("unexpected error; want: %v, got: %v", tt.err, synErr.Cause) + } + } else { + if err != nil { + t.Fatalf("unexpected error; want: %v, got: %v", tt.err, err) + } } }) } |