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  }