mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-09 23:24:05 -08:00
Fix unary +/- expressions.
Unary expressions cause parsing errors if they are done in the lexer by tokenizing them into the number. This fix moves unary expressions to the parser.
This commit is contained in:
parent
0b5dd24fd2
commit
182de6b99f
|
@ -50,6 +50,15 @@ func CreateAlertingRule(name string, expr ast.Node, holdDurationStr string, labe
|
|||
return NewAlertingRule(name, expr.(ast.VectorNode), holdDuration, labels, summary, description), nil
|
||||
}
|
||||
|
||||
// NewScalarLiteral returns a ScalarLiteral with the given value. If sign is "-"
|
||||
// the value is negated.
|
||||
func NewScalarLiteral(value clientmodel.SampleValue, sign string) *ast.ScalarLiteral {
|
||||
if sign == "-" {
|
||||
value = -value
|
||||
}
|
||||
return ast.NewScalarLiteral(value)
|
||||
}
|
||||
|
||||
// NewFunctionCall is a convenience function to create a new AST function-call node.
|
||||
func NewFunctionCall(name string, args []ast.Node) (ast.Node, error) {
|
||||
function, err := ast.GetFunction(name)
|
||||
|
|
|
@ -55,7 +55,7 @@ L [a-zA-Z_]
|
|||
M [a-zA-Z_:]
|
||||
U [smhdwy]
|
||||
|
||||
FLOAT [-+]?({D}*\.?{D}+|{D}+\.?{D}*){EXPONENT}?|[+-]?[iI][nN][fF]|[nN][aA][nN]
|
||||
FLOAT ({D}*\.?{D}+|{D}+\.?{D}*){EXPONENT}?|[+-]?[iI][nN][fF]|[nN][aA][nN]
|
||||
EXPONENT [eE][-+]?[0-9]+
|
||||
|
||||
STR \"(\\.|[^\\"])*\"|\'(\\.|[^\\'])*\'
|
||||
|
|
1687
rules/lexer.l.go
1687
rules/lexer.l.go
File diff suppressed because it is too large
Load diff
|
@ -228,7 +228,9 @@ rule_expr : '(' rule_expr ')'
|
|||
if err != nil { yylex.Error(err.Error()); return 1 }
|
||||
}
|
||||
| NUMBER
|
||||
{ $$ = ast.NewScalarLiteral($1)}
|
||||
{ $$ = NewScalarLiteral($1, "+")}
|
||||
| ADDITIVE_OP NUMBER
|
||||
{ $$ = NewScalarLiteral($2, $1)}
|
||||
;
|
||||
|
||||
extra_labels_opts : /* empty */
|
||||
|
|
|
@ -82,7 +82,7 @@ const yyEofCode = 1
|
|||
const yyErrCode = 2
|
||||
const yyMaxDepth = 200
|
||||
|
||||
//line parser.y:279
|
||||
//line parser.y:281
|
||||
|
||||
//line yacctab:1
|
||||
var yyExca = []int{
|
||||
|
@ -94,53 +94,53 @@ var yyExca = []int{
|
|||
-2, 10,
|
||||
}
|
||||
|
||||
const yyNprod = 55
|
||||
const yyNprod = 56
|
||||
const yyPrivate = 57344
|
||||
|
||||
var yyTokenNames []string
|
||||
var yyStates []string
|
||||
|
||||
const yyLast = 155
|
||||
const yyLast = 159
|
||||
|
||||
var yyAct = []int{
|
||||
|
||||
76, 59, 81, 56, 53, 52, 30, 46, 6, 24,
|
||||
10, 54, 22, 13, 12, 21, 19, 20, 19, 20,
|
||||
11, 62, 21, 19, 20, 20, 18, 90, 96, 111,
|
||||
99, 18, 8, 18, 55, 7, 51, 60, 18, 18,
|
||||
90, 63, 97, 65, 66, 21, 19, 20, 107, 75,
|
||||
68, 67, 10, 54, 64, 13, 12, 21, 19, 20,
|
||||
74, 18, 11, 31, 58, 85, 83, 90, 94, 89,
|
||||
84, 27, 40, 18, 8, 28, 23, 7, 112, 86,
|
||||
88, 87, 29, 91, 21, 19, 20, 82, 73, 10,
|
||||
72, 98, 13, 12, 92, 93, 101, 71, 41, 11,
|
||||
18, 42, 41, 25, 49, 106, 45, 78, 109, 108,
|
||||
80, 8, 103, 36, 7, 61, 44, 17, 105, 37,
|
||||
9, 47, 57, 31, 104, 33, 48, 16, 13, 70,
|
||||
35, 113, 110, 102, 38, 39, 32, 69, 77, 82,
|
||||
100, 25, 34, 2, 3, 14, 5, 4, 1, 43,
|
||||
95, 15, 26, 79, 50,
|
||||
78, 61, 83, 58, 55, 54, 31, 48, 6, 25,
|
||||
20, 21, 23, 21, 10, 56, 64, 14, 12, 10,
|
||||
56, 19, 14, 12, 11, 19, 13, 19, 92, 11,
|
||||
113, 13, 22, 20, 21, 57, 8, 32, 109, 7,
|
||||
53, 8, 77, 65, 7, 67, 68, 101, 19, 22,
|
||||
20, 21, 70, 69, 10, 98, 30, 14, 12, 22,
|
||||
20, 21, 94, 95, 11, 19, 13, 87, 85, 92,
|
||||
96, 99, 86, 84, 76, 19, 8, 66, 60, 7,
|
||||
29, 88, 90, 89, 24, 93, 22, 20, 21, 22,
|
||||
20, 21, 92, 100, 91, 75, 82, 74, 103, 73,
|
||||
43, 42, 19, 44, 43, 19, 26, 108, 62, 47,
|
||||
111, 28, 80, 51, 114, 110, 38, 105, 63, 46,
|
||||
18, 107, 39, 9, 49, 59, 32, 33, 35, 50,
|
||||
17, 14, 106, 72, 37, 115, 112, 104, 40, 41,
|
||||
34, 71, 79, 84, 102, 26, 36, 2, 3, 15,
|
||||
5, 4, 1, 45, 97, 16, 27, 81, 52,
|
||||
}
|
||||
var yyPact = []int{
|
||||
|
||||
139, -1000, -1000, 83, 106, -1000, 67, 83, 135, 43,
|
||||
44, 51, -1000, -1000, -1000, 119, 136, -1000, 122, 104,
|
||||
104, 104, 40, 72, -1000, 89, 107, 97, 4, 83,
|
||||
109, 33, 9, -1000, 93, -13, 83, 23, 83, 83,
|
||||
-1000, 135, 107, 130, -1000, -1000, -1000, 121, -1000, 68,
|
||||
58, -1000, -1000, 67, -1000, 28, 18, -1000, 132, 80,
|
||||
81, 83, 107, 6, 132, -7, 0, -1000, -1000, -1000,
|
||||
-1000, -1000, -1000, 46, 111, 83, 37, -1000, 83, 65,
|
||||
-1000, -1000, 41, 5, -1000, 10, -1000, 109, -2, -1000,
|
||||
134, 67, -1000, 133, 126, 88, 116, 98, -1000, -1000,
|
||||
-1000, -1000, -1000, 9, -1000, 17, 84, 132, 125, -3,
|
||||
52, -1000, 124, -1000,
|
||||
143, -1000, -1000, 48, 109, -1000, 72, 48, 139, 83,
|
||||
49, 25, -1000, 117, -1000, -1000, 122, 140, -1000, 126,
|
||||
107, 107, 107, 69, 74, -1000, 92, 110, 100, 8,
|
||||
48, 112, 47, -1000, 80, -1000, 96, -18, 48, 46,
|
||||
48, 48, -1000, 139, 110, 134, -1000, -1000, -1000, 125,
|
||||
-1000, 70, 65, -1000, -1000, 72, -1000, 42, 11, -1000,
|
||||
136, 85, 67, 48, 110, -6, 136, -12, -8, -1000,
|
||||
-1000, -1000, -1000, -1000, -1000, 13, 114, 48, 62, -1000,
|
||||
48, 33, -1000, -1000, 43, 32, -1000, 39, -1000, 112,
|
||||
15, -1000, 138, 72, -1000, 137, 130, 93, 124, 101,
|
||||
-1000, -1000, -1000, -1000, -1000, 80, -1000, 7, 90, 136,
|
||||
129, -2, 88, -1000, 128, -1000,
|
||||
}
|
||||
var yyPgo = []int{
|
||||
|
||||
0, 154, 0, 6, 2, 153, 1, 9, 76, 152,
|
||||
113, 4, 5, 151, 3, 150, 120, 149, 7, 148,
|
||||
147, 146, 145,
|
||||
0, 158, 0, 6, 2, 157, 1, 9, 84, 156,
|
||||
116, 4, 5, 155, 3, 154, 123, 153, 7, 152,
|
||||
151, 150, 149,
|
||||
}
|
||||
var yyR1 = []int{
|
||||
|
||||
|
@ -148,8 +148,8 @@ var yyR1 = []int{
|
|||
13, 13, 16, 16, 6, 6, 6, 5, 5, 4,
|
||||
9, 9, 9, 8, 8, 7, 17, 17, 18, 18,
|
||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||
11, 11, 14, 14, 10, 10, 10, 3, 3, 2,
|
||||
2, 1, 1, 12, 12,
|
||||
11, 11, 11, 14, 14, 10, 10, 10, 3, 3,
|
||||
2, 2, 1, 1, 12, 12,
|
||||
}
|
||||
var yyR2 = []int{
|
||||
|
||||
|
@ -157,38 +157,38 @@ var yyR2 = []int{
|
|||
0, 1, 1, 1, 0, 3, 2, 1, 3, 3,
|
||||
0, 2, 3, 1, 3, 3, 1, 1, 0, 2,
|
||||
3, 4, 3, 4, 3, 5, 6, 6, 4, 4,
|
||||
4, 1, 0, 1, 0, 4, 8, 0, 4, 1,
|
||||
3, 1, 3, 1, 1,
|
||||
4, 1, 2, 0, 1, 0, 4, 8, 0, 4,
|
||||
1, 3, 1, 3, 1, 1,
|
||||
}
|
||||
var yyChk = []int{
|
||||
|
||||
-1000, -19, 4, 5, -20, -21, -11, 31, 28, -16,
|
||||
6, 16, 10, 9, -22, -13, 21, 11, 33, 18,
|
||||
19, 17, -11, -8, -7, 6, -9, 28, 31, 31,
|
||||
-3, 12, -16, 6, 6, 8, -10, 15, -10, -10,
|
||||
32, 30, 29, -17, 27, 17, -18, 14, 29, -8,
|
||||
-1, 32, -12, -11, 7, -11, -14, 13, 31, -6,
|
||||
28, 22, 34, -11, 31, -11, -11, -7, -18, 7,
|
||||
8, 29, 32, 30, 32, 31, -2, 6, 27, -5,
|
||||
29, -4, 6, -11, -18, -2, -12, -3, -11, 32,
|
||||
30, -11, 29, 30, 27, -15, 23, 32, -14, 32,
|
||||
6, -4, 7, 24, 8, 20, -6, 31, 25, -2,
|
||||
7, 32, 26, 7,
|
||||
6, 16, 10, 18, 9, -22, -13, 21, 11, 33,
|
||||
18, 19, 17, -11, -8, -7, 6, -9, 28, 31,
|
||||
31, -3, 12, 10, -16, 6, 6, 8, -10, 15,
|
||||
-10, -10, 32, 30, 29, -17, 27, 17, -18, 14,
|
||||
29, -8, -1, 32, -12, -11, 7, -11, -14, 13,
|
||||
31, -6, 28, 22, 34, -11, 31, -11, -11, -7,
|
||||
-18, 7, 8, 29, 32, 30, 32, 31, -2, 6,
|
||||
27, -5, 29, -4, 6, -11, -18, -2, -12, -3,
|
||||
-11, 32, 30, -11, 29, 30, 27, -15, 23, 32,
|
||||
-14, 32, 6, -4, 7, 24, 8, 20, -6, 31,
|
||||
25, -2, 7, 32, 26, 7,
|
||||
}
|
||||
var yyDef = []int{
|
||||
|
||||
0, -2, 3, 0, -2, 2, 5, 0, 0, 20,
|
||||
13, 47, 41, 12, 4, 0, 0, 11, 0, 44,
|
||||
44, 44, 0, 0, 23, 0, 28, 0, 0, 0,
|
||||
42, 0, 14, 13, 0, 0, 0, 0, 0, 0,
|
||||
30, 0, 28, 0, 26, 27, 32, 0, 21, 0,
|
||||
0, 34, 51, 53, 54, 0, 0, 43, 0, 0,
|
||||
0, 0, 28, 38, 0, 39, 40, 24, 31, 25,
|
||||
29, 22, 33, 0, 47, 0, 0, 49, 0, 0,
|
||||
16, 17, 0, 8, 35, 0, 52, 42, 0, 48,
|
||||
0, 6, 15, 0, 0, 0, 0, 45, 36, 37,
|
||||
50, 18, 19, 14, 9, 0, 0, 0, 0, 0,
|
||||
0, 46, 0, 7,
|
||||
13, 48, 41, 0, 12, 4, 0, 0, 11, 0,
|
||||
45, 45, 45, 0, 0, 23, 0, 28, 0, 0,
|
||||
0, 43, 0, 42, 14, 13, 0, 0, 0, 0,
|
||||
0, 0, 30, 0, 28, 0, 26, 27, 32, 0,
|
||||
21, 0, 0, 34, 52, 54, 55, 0, 0, 44,
|
||||
0, 0, 0, 0, 28, 38, 0, 39, 40, 24,
|
||||
31, 25, 29, 22, 33, 0, 48, 0, 0, 50,
|
||||
0, 0, 16, 17, 0, 8, 35, 0, 53, 43,
|
||||
0, 49, 0, 6, 15, 0, 0, 0, 0, 46,
|
||||
36, 37, 51, 18, 19, 14, 9, 0, 0, 0,
|
||||
0, 0, 0, 47, 0, 7,
|
||||
}
|
||||
var yyTok1 = []int{
|
||||
|
||||
|
@ -697,25 +697,30 @@ yydefault:
|
|||
case 41:
|
||||
//line parser.y:231
|
||||
{
|
||||
yyVAL.ruleNode = ast.NewScalarLiteral(yyS[yypt-0].num)
|
||||
yyVAL.ruleNode = NewScalarLiteral(yyS[yypt-0].num, "+")
|
||||
}
|
||||
case 42:
|
||||
//line parser.y:235
|
||||
//line parser.y:233
|
||||
{
|
||||
yyVAL.boolean = false
|
||||
yyVAL.ruleNode = NewScalarLiteral(yyS[yypt-0].num, yyS[yypt-1].str)
|
||||
}
|
||||
case 43:
|
||||
//line parser.y:237
|
||||
{
|
||||
yyVAL.boolean = true
|
||||
yyVAL.boolean = false
|
||||
}
|
||||
case 44:
|
||||
//line parser.y:241
|
||||
//line parser.y:239
|
||||
{
|
||||
yyVAL.vectorMatching = nil
|
||||
yyVAL.boolean = true
|
||||
}
|
||||
case 45:
|
||||
//line parser.y:243
|
||||
{
|
||||
yyVAL.vectorMatching = nil
|
||||
}
|
||||
case 46:
|
||||
//line parser.y:245
|
||||
{
|
||||
var err error
|
||||
yyVAL.vectorMatching, err = newVectorMatching("", yyS[yypt-1].labelNameSlice, nil)
|
||||
|
@ -724,8 +729,8 @@ yydefault:
|
|||
return 1
|
||||
}
|
||||
}
|
||||
case 46:
|
||||
//line parser.y:249
|
||||
case 47:
|
||||
//line parser.y:251
|
||||
{
|
||||
var err error
|
||||
yyVAL.vectorMatching, err = newVectorMatching(yyS[yypt-3].str, yyS[yypt-5].labelNameSlice, yyS[yypt-1].labelNameSlice)
|
||||
|
@ -734,43 +739,43 @@ yydefault:
|
|||
return 1
|
||||
}
|
||||
}
|
||||
case 47:
|
||||
//line parser.y:257
|
||||
{
|
||||
yyVAL.labelNameSlice = clientmodel.LabelNames{}
|
||||
}
|
||||
case 48:
|
||||
//line parser.y:259
|
||||
{
|
||||
yyVAL.labelNameSlice = yyS[yypt-1].labelNameSlice
|
||||
yyVAL.labelNameSlice = clientmodel.LabelNames{}
|
||||
}
|
||||
case 49:
|
||||
//line parser.y:263
|
||||
//line parser.y:261
|
||||
{
|
||||
yyVAL.labelNameSlice = clientmodel.LabelNames{clientmodel.LabelName(yyS[yypt-0].str)}
|
||||
yyVAL.labelNameSlice = yyS[yypt-1].labelNameSlice
|
||||
}
|
||||
case 50:
|
||||
//line parser.y:265
|
||||
{
|
||||
yyVAL.labelNameSlice = append(yyVAL.labelNameSlice, clientmodel.LabelName(yyS[yypt-0].str))
|
||||
yyVAL.labelNameSlice = clientmodel.LabelNames{clientmodel.LabelName(yyS[yypt-0].str)}
|
||||
}
|
||||
case 51:
|
||||
//line parser.y:269
|
||||
//line parser.y:267
|
||||
{
|
||||
yyVAL.ruleNodeSlice = []ast.Node{yyS[yypt-0].ruleNode}
|
||||
yyVAL.labelNameSlice = append(yyVAL.labelNameSlice, clientmodel.LabelName(yyS[yypt-0].str))
|
||||
}
|
||||
case 52:
|
||||
//line parser.y:271
|
||||
{
|
||||
yyVAL.ruleNodeSlice = append(yyVAL.ruleNodeSlice, yyS[yypt-0].ruleNode)
|
||||
yyVAL.ruleNodeSlice = []ast.Node{yyS[yypt-0].ruleNode}
|
||||
}
|
||||
case 53:
|
||||
//line parser.y:275
|
||||
//line parser.y:273
|
||||
{
|
||||
yyVAL.ruleNode = yyS[yypt-0].ruleNode
|
||||
yyVAL.ruleNodeSlice = append(yyVAL.ruleNodeSlice, yyS[yypt-0].ruleNode)
|
||||
}
|
||||
case 54:
|
||||
//line parser.y:277
|
||||
{
|
||||
yyVAL.ruleNode = yyS[yypt-0].ruleNode
|
||||
}
|
||||
case 55:
|
||||
//line parser.y:279
|
||||
{
|
||||
yyVAL.ruleNode = ast.NewStringLiteral(yyS[yypt-0].str)
|
||||
}
|
||||
|
|
|
@ -1105,6 +1105,18 @@ func TestExpressions(t *testing.T) {
|
|||
expr: `12.34e-6`,
|
||||
output: []string{`scalar: 0.00001234 @[%v]`},
|
||||
},
|
||||
{
|
||||
expr: `1+1`,
|
||||
output: []string{`scalar: 2 @[%v]`},
|
||||
},
|
||||
{
|
||||
expr: `1-1`,
|
||||
output: []string{`scalar: 0 @[%v]`},
|
||||
},
|
||||
{
|
||||
expr: `1 - -1`,
|
||||
output: []string{`scalar: 2 @[%v]`},
|
||||
},
|
||||
{
|
||||
expr: `.2`,
|
||||
output: []string{`scalar: 0.2 @[%v]`},
|
||||
|
|
Loading…
Reference in a new issue