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 }