prometheus/pkg/textparse/lex.l

77 lines
1.7 KiB
Plaintext

%{
package textparse
import (
"fmt"
"math"
"strconv"
)
//type lstate int
// Lex is called by the parser generated by "go tool yacc" to obtain each
// token. The method is opened before the matching rules block and closed at
// the end of the file.
func (l *lexer) Lex() int {
const (
lstateInit = iota
lstateValue
lstateLabels
lstateLName
lstateLValue
)
s := lstateInit
if l.i >= len(l.b) {
return eof
}
c := l.b[l.i]
%}
D [0-9]
L [a-zA-Z_]
M [a-zA-Z_:]
%x lstateValue lstateLabels lstateLName lstateLValue
%yyc c
%yyn c = l.next()
%yyt s
%%
\0 return 0
#[^\r\n]*\n l.mstart = l.i
[\r\n \t]+ l.mstart = l.i
{L}({L}|{D})*\{ s = lstateLName
{L}({L}|{D})* s = lstateValue
l.mend = l.i
<lstateLabels>[ \t]+
<lstateLabels>\} s = lstateValue
l.mend = l.i
<lstateLabels>,? s = lstateLName
<lstateLName>{M}({M}|{D})*= s = lstateLValue
<lstateLValue>\"(\\.|[^\\"])*\" s = lstateLabels
<lstateLValue>\'(\\.|[^\\'])*\' s = lstateLabels
<lstateValue>[ \t]+ l.vstart = l.i
<lstateValue>(NaN) l.val = math.NaN()
return 1
<lstateValue>[^\n \t\r]+ // We don't parse strictly correct floats as the conversion
// repeats the effort anyway.
l.val, l.err = strconv.ParseFloat(yoloString(l.b[l.vstart:l.i]), 64)
if l.err != nil {
return -1
}
return 1
%%
return -1
}