github.com/mithrandie/csvq@v1.18.1/lib/json/query_lexer.go (about) 1 package json 2 3 import "fmt" 4 5 type QueryLexer struct { 6 QueryScanner 7 query QueryExpression 8 token QueryToken 9 err error 10 } 11 12 func (l *QueryLexer) Lex(lval *jqSymType) int { 13 tok, err := l.Scan() 14 lval.token = tok 15 l.token = lval.token 16 17 if err != nil { 18 l.Error(err.Error()) 19 } 20 21 return lval.token.Token 22 } 23 24 func (l *QueryLexer) Error(e string) { 25 if e == "syntax error" { 26 if l.token.Token == EOF { 27 l.err = NewQuerySyntaxError(fmt.Sprintf("column %d: unexpected termination", l.token.Column), l.token) 28 } else { 29 l.err = NewQuerySyntaxError(fmt.Sprintf("column %d: unexpected token %q", l.token.Column, l.token.Literal), l.token) 30 } 31 } else { 32 l.err = NewQuerySyntaxError(fmt.Sprintf("column %d: %s", l.token.Column, e), l.token) 33 } 34 } 35 36 type QueryToken struct { 37 Token int 38 Literal string 39 Column int 40 } 41 42 type QuerySyntaxError struct { 43 Char int 44 Message string 45 } 46 47 func (e QuerySyntaxError) Error() string { 48 return e.Message 49 } 50 51 func NewQuerySyntaxError(message string, token QueryToken) error { 52 return &QuerySyntaxError{ 53 Char: token.Column, 54 Message: message, 55 } 56 }