2017-01-14 07:39:04 -08:00
|
|
|
%{
|
2017-04-19 05:43:09 -07:00
|
|
|
// Copyright 2017 The Prometheus Authors
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2017-01-14 07:39:04 -08:00
|
|
|
package textparse
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math"
|
|
|
|
"strconv"
|
2017-04-13 02:33:08 -07:00
|
|
|
|
|
|
|
"github.com/prometheus/prometheus/pkg/value"
|
2017-01-14 07:39:04 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 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
|
2017-04-27 08:02:07 -07:00
|
|
|
lstateTimestamp
|
2017-01-14 07:39:04 -08:00
|
|
|
lstateLabels
|
|
|
|
lstateLName
|
|
|
|
lstateLValue
|
|
|
|
)
|
|
|
|
s := lstateInit
|
|
|
|
|
|
|
|
if l.i >= len(l.b) {
|
|
|
|
return eof
|
|
|
|
}
|
|
|
|
c := l.b[l.i]
|
2017-01-14 10:30:19 -08:00
|
|
|
|
2017-04-27 08:02:07 -07:00
|
|
|
l.ts = nil
|
|
|
|
l.mstart = l.nextMstart
|
2017-01-14 10:30:19 -08:00
|
|
|
l.offsets = l.offsets[:0]
|
2017-01-14 07:39:04 -08:00
|
|
|
%}
|
|
|
|
|
|
|
|
D [0-9]
|
2017-05-09 03:21:19 -07:00
|
|
|
S [a-zA-Z]
|
2017-01-14 07:39:04 -08:00
|
|
|
L [a-zA-Z_]
|
|
|
|
M [a-zA-Z_:]
|
|
|
|
|
2017-04-27 08:02:07 -07:00
|
|
|
%x lstateValue lstateTimestamp lstateLabels lstateLName lstateLValue
|
2017-01-14 07:39:04 -08:00
|
|
|
|
|
|
|
|
|
|
|
%yyc c
|
|
|
|
%yyn c = l.next()
|
|
|
|
%yyt s
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
2017-01-15 04:55:53 -08:00
|
|
|
\0 return eof
|
|
|
|
#[^\r\n]*\n l.mstart = l.i
|
|
|
|
[\r\n \t]+ l.mstart = l.i
|
2017-01-14 07:39:04 -08:00
|
|
|
|
2017-05-09 03:21:19 -07:00
|
|
|
{S}({M}|{D})*\{ s = lstateLabels
|
2017-01-15 04:55:53 -08:00
|
|
|
l.offsets = append(l.offsets, l.i-1)
|
2017-05-09 03:21:19 -07:00
|
|
|
{S}({M}|{D})* s = lstateValue
|
2017-01-15 04:55:53 -08:00
|
|
|
l.mend = l.i
|
|
|
|
l.offsets = append(l.offsets, l.i)
|
2017-01-14 07:39:04 -08:00
|
|
|
|
|
|
|
<lstateLabels>[ \t]+
|
2017-05-22 02:15:40 -07:00
|
|
|
<lstateLabels>,?\} s = lstateValue
|
2017-01-15 04:55:53 -08:00
|
|
|
l.mend = l.i
|
|
|
|
<lstateLabels>,? s = lstateLName
|
|
|
|
l.offsets = append(l.offsets, l.i)
|
2017-01-14 07:39:04 -08:00
|
|
|
|
2017-05-09 03:21:19 -07:00
|
|
|
<lstateLName>{S}({L}|{D})*= s = lstateLValue
|
2017-01-15 04:55:53 -08:00
|
|
|
l.offsets = append(l.offsets, l.i-1)
|
2017-01-14 07:39:04 -08:00
|
|
|
|
2017-05-24 05:52:46 -07:00
|
|
|
<lstateLValue>\"(\\.|[^\\"]|\0)*\" s = lstateLabels
|
2017-01-14 10:30:19 -08:00
|
|
|
l.offsets = append(l.offsets, l.i-1)
|
2017-05-24 05:52:46 -07:00
|
|
|
<lstateLValue>\'(\\.|[^\\']|\0)*\' s = lstateLabels
|
2017-01-14 10:30:19 -08:00
|
|
|
l.offsets = append(l.offsets, l.i-1)
|
2017-01-14 07:39:04 -08:00
|
|
|
|
2017-01-15 04:55:53 -08:00
|
|
|
<lstateValue>[ \t]+ l.vstart = l.i
|
2017-04-13 02:33:08 -07:00
|
|
|
<lstateValue>(NaN) l.val = math.Float64frombits(value.NormalNaN)
|
2017-04-27 08:02:07 -07:00
|
|
|
s = lstateTimestamp
|
2017-04-13 02:33:08 -07:00
|
|
|
|
2017-01-15 04:55:53 -08:00
|
|
|
<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
|
|
|
|
}
|
2017-04-27 08:02:07 -07:00
|
|
|
s = lstateTimestamp
|
|
|
|
|
|
|
|
<lstateTimestamp>[ \t]+ l.tstart = l.i
|
|
|
|
<lstateTimestamp>{D}+ ts, err := strconv.ParseInt(yoloString(l.b[l.tstart:l.i]), 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
l.err = err
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
l.ts = &ts
|
|
|
|
<lstateTimestamp>[\r\n]+ l.nextMstart = l.i
|
2017-01-15 04:55:53 -08:00
|
|
|
return 1
|
2017-04-27 08:02:07 -07:00
|
|
|
<lstateTimestamp>\0 return 1
|
2017-01-14 07:39:04 -08:00
|
|
|
|
|
|
|
%%
|
2017-04-27 08:02:07 -07:00
|
|
|
l.err = fmt.Errorf("no token found")
|
2017-01-14 07:39:04 -08:00
|
|
|
return -1
|
2017-04-19 05:43:09 -07:00
|
|
|
}
|