github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/logql/log/pattern/lexer.go (about)

     1  package pattern
     2  
     3  type lexer struct {
     4  	data        []byte
     5  	p, pe, cs   int
     6  	ts, te, act int
     7  
     8  	lastnewline int
     9  	curline     int
    10  
    11  	errs []parseError
    12  	expr []node
    13  }
    14  
    15  func newLexer() *lexer {
    16  	lex := &lexer{}
    17  	lex.init()
    18  	return lex
    19  }
    20  
    21  func (lex *lexer) setData(data []byte) {
    22  	lex.data = data
    23  	lex.pe = len(data)
    24  	lex.lastnewline = -1
    25  	lex.curline = 1
    26  }
    27  
    28  // Error implements exprLexer interface generated by yacc (yyLexer)
    29  func (lex *lexer) Error(e string) {
    30  	lex.errs = append(lex.errs, newParseError(e, lex.curline, lex.curcol()))
    31  }
    32  
    33  // curcol calculates the current token's start column based on the last newline position
    34  // returns a 1-indexed value
    35  func (lex *lexer) curcol() int {
    36  	return (lex.ts + 1 /* 1-indexed columns */) - (lex.lastnewline + 1 /* next after newline */)
    37  }
    38  
    39  func (lex *lexer) handle(token int, err error) int {
    40  	if err != nil {
    41  		lex.Error(err.Error())
    42  		return LEXER_ERROR
    43  	}
    44  	return token
    45  }
    46  
    47  func (lex *lexer) token() string {
    48  	return string(lex.data[lex.ts:lex.te])
    49  }
    50  
    51  // nolint
    52  func (lex *lexer) identifier(out *exprSymType) (int, error) {
    53  	t := lex.token()
    54  	out.str = t[1 : len(t)-1]
    55  	return IDENTIFIER, nil
    56  }
    57  
    58  // nolint
    59  func (lex *lexer) literal(out *exprSymType) (int, error) {
    60  	out.literal = rune(lex.data[lex.ts])
    61  	return LITERAL, nil
    62  }