mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -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
|
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.
|
// NewFunctionCall is a convenience function to create a new AST function-call node.
|
||||||
func NewFunctionCall(name string, args []ast.Node) (ast.Node, error) {
|
func NewFunctionCall(name string, args []ast.Node) (ast.Node, error) {
|
||||||
function, err := ast.GetFunction(name)
|
function, err := ast.GetFunction(name)
|
||||||
|
|
|
@ -55,7 +55,7 @@ L [a-zA-Z_]
|
||||||
M [a-zA-Z_:]
|
M [a-zA-Z_:]
|
||||||
U [smhdwy]
|
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]+
|
EXPONENT [eE][-+]?[0-9]+
|
||||||
|
|
||||||
STR \"(\\.|[^\\"])*\"|\'(\\.|[^\\'])*\'
|
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 }
|
if err != nil { yylex.Error(err.Error()); return 1 }
|
||||||
}
|
}
|
||||||
| NUMBER
|
| NUMBER
|
||||||
{ $$ = ast.NewScalarLiteral($1)}
|
{ $$ = NewScalarLiteral($1, "+")}
|
||||||
|
| ADDITIVE_OP NUMBER
|
||||||
|
{ $$ = NewScalarLiteral($2, $1)}
|
||||||
;
|
;
|
||||||
|
|
||||||
extra_labels_opts : /* empty */
|
extra_labels_opts : /* empty */
|
||||||
|
|
|
@ -82,7 +82,7 @@ const yyEofCode = 1
|
||||||
const yyErrCode = 2
|
const yyErrCode = 2
|
||||||
const yyMaxDepth = 200
|
const yyMaxDepth = 200
|
||||||
|
|
||||||
//line parser.y:279
|
//line parser.y:281
|
||||||
|
|
||||||
//line yacctab:1
|
//line yacctab:1
|
||||||
var yyExca = []int{
|
var yyExca = []int{
|
||||||
|
@ -94,53 +94,53 @@ var yyExca = []int{
|
||||||
-2, 10,
|
-2, 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
const yyNprod = 55
|
const yyNprod = 56
|
||||||
const yyPrivate = 57344
|
const yyPrivate = 57344
|
||||||
|
|
||||||
var yyTokenNames []string
|
var yyTokenNames []string
|
||||||
var yyStates []string
|
var yyStates []string
|
||||||
|
|
||||||
const yyLast = 155
|
const yyLast = 159
|
||||||
|
|
||||||
var yyAct = []int{
|
var yyAct = []int{
|
||||||
|
|
||||||
76, 59, 81, 56, 53, 52, 30, 46, 6, 24,
|
78, 61, 83, 58, 55, 54, 31, 48, 6, 25,
|
||||||
10, 54, 22, 13, 12, 21, 19, 20, 19, 20,
|
20, 21, 23, 21, 10, 56, 64, 14, 12, 10,
|
||||||
11, 62, 21, 19, 20, 20, 18, 90, 96, 111,
|
56, 19, 14, 12, 11, 19, 13, 19, 92, 11,
|
||||||
99, 18, 8, 18, 55, 7, 51, 60, 18, 18,
|
113, 13, 22, 20, 21, 57, 8, 32, 109, 7,
|
||||||
90, 63, 97, 65, 66, 21, 19, 20, 107, 75,
|
53, 8, 77, 65, 7, 67, 68, 101, 19, 22,
|
||||||
68, 67, 10, 54, 64, 13, 12, 21, 19, 20,
|
20, 21, 70, 69, 10, 98, 30, 14, 12, 22,
|
||||||
74, 18, 11, 31, 58, 85, 83, 90, 94, 89,
|
20, 21, 94, 95, 11, 19, 13, 87, 85, 92,
|
||||||
84, 27, 40, 18, 8, 28, 23, 7, 112, 86,
|
96, 99, 86, 84, 76, 19, 8, 66, 60, 7,
|
||||||
88, 87, 29, 91, 21, 19, 20, 82, 73, 10,
|
29, 88, 90, 89, 24, 93, 22, 20, 21, 22,
|
||||||
72, 98, 13, 12, 92, 93, 101, 71, 41, 11,
|
20, 21, 92, 100, 91, 75, 82, 74, 103, 73,
|
||||||
18, 42, 41, 25, 49, 106, 45, 78, 109, 108,
|
43, 42, 19, 44, 43, 19, 26, 108, 62, 47,
|
||||||
80, 8, 103, 36, 7, 61, 44, 17, 105, 37,
|
111, 28, 80, 51, 114, 110, 38, 105, 63, 46,
|
||||||
9, 47, 57, 31, 104, 33, 48, 16, 13, 70,
|
18, 107, 39, 9, 49, 59, 32, 33, 35, 50,
|
||||||
35, 113, 110, 102, 38, 39, 32, 69, 77, 82,
|
17, 14, 106, 72, 37, 115, 112, 104, 40, 41,
|
||||||
100, 25, 34, 2, 3, 14, 5, 4, 1, 43,
|
34, 71, 79, 84, 102, 26, 36, 2, 3, 15,
|
||||||
95, 15, 26, 79, 50,
|
5, 4, 1, 45, 97, 16, 27, 81, 52,
|
||||||
}
|
}
|
||||||
var yyPact = []int{
|
var yyPact = []int{
|
||||||
|
|
||||||
139, -1000, -1000, 83, 106, -1000, 67, 83, 135, 43,
|
143, -1000, -1000, 48, 109, -1000, 72, 48, 139, 83,
|
||||||
44, 51, -1000, -1000, -1000, 119, 136, -1000, 122, 104,
|
49, 25, -1000, 117, -1000, -1000, 122, 140, -1000, 126,
|
||||||
104, 104, 40, 72, -1000, 89, 107, 97, 4, 83,
|
107, 107, 107, 69, 74, -1000, 92, 110, 100, 8,
|
||||||
109, 33, 9, -1000, 93, -13, 83, 23, 83, 83,
|
48, 112, 47, -1000, 80, -1000, 96, -18, 48, 46,
|
||||||
-1000, 135, 107, 130, -1000, -1000, -1000, 121, -1000, 68,
|
48, 48, -1000, 139, 110, 134, -1000, -1000, -1000, 125,
|
||||||
58, -1000, -1000, 67, -1000, 28, 18, -1000, 132, 80,
|
-1000, 70, 65, -1000, -1000, 72, -1000, 42, 11, -1000,
|
||||||
81, 83, 107, 6, 132, -7, 0, -1000, -1000, -1000,
|
136, 85, 67, 48, 110, -6, 136, -12, -8, -1000,
|
||||||
-1000, -1000, -1000, 46, 111, 83, 37, -1000, 83, 65,
|
-1000, -1000, -1000, -1000, -1000, 13, 114, 48, 62, -1000,
|
||||||
-1000, -1000, 41, 5, -1000, 10, -1000, 109, -2, -1000,
|
48, 33, -1000, -1000, 43, 32, -1000, 39, -1000, 112,
|
||||||
134, 67, -1000, 133, 126, 88, 116, 98, -1000, -1000,
|
15, -1000, 138, 72, -1000, 137, 130, 93, 124, 101,
|
||||||
-1000, -1000, -1000, 9, -1000, 17, 84, 132, 125, -3,
|
-1000, -1000, -1000, -1000, -1000, 80, -1000, 7, 90, 136,
|
||||||
52, -1000, 124, -1000,
|
129, -2, 88, -1000, 128, -1000,
|
||||||
}
|
}
|
||||||
var yyPgo = []int{
|
var yyPgo = []int{
|
||||||
|
|
||||||
0, 154, 0, 6, 2, 153, 1, 9, 76, 152,
|
0, 158, 0, 6, 2, 157, 1, 9, 84, 156,
|
||||||
113, 4, 5, 151, 3, 150, 120, 149, 7, 148,
|
116, 4, 5, 155, 3, 154, 123, 153, 7, 152,
|
||||||
147, 146, 145,
|
151, 150, 149,
|
||||||
}
|
}
|
||||||
var yyR1 = []int{
|
var yyR1 = []int{
|
||||||
|
|
||||||
|
@ -148,8 +148,8 @@ var yyR1 = []int{
|
||||||
13, 13, 16, 16, 6, 6, 6, 5, 5, 4,
|
13, 13, 16, 16, 6, 6, 6, 5, 5, 4,
|
||||||
9, 9, 9, 8, 8, 7, 17, 17, 18, 18,
|
9, 9, 9, 8, 8, 7, 17, 17, 18, 18,
|
||||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||||
11, 11, 14, 14, 10, 10, 10, 3, 3, 2,
|
11, 11, 11, 14, 14, 10, 10, 10, 3, 3,
|
||||||
2, 1, 1, 12, 12,
|
2, 2, 1, 1, 12, 12,
|
||||||
}
|
}
|
||||||
var yyR2 = []int{
|
var yyR2 = []int{
|
||||||
|
|
||||||
|
@ -157,38 +157,38 @@ var yyR2 = []int{
|
||||||
0, 1, 1, 1, 0, 3, 2, 1, 3, 3,
|
0, 1, 1, 1, 0, 3, 2, 1, 3, 3,
|
||||||
0, 2, 3, 1, 3, 3, 1, 1, 0, 2,
|
0, 2, 3, 1, 3, 3, 1, 1, 0, 2,
|
||||||
3, 4, 3, 4, 3, 5, 6, 6, 4, 4,
|
3, 4, 3, 4, 3, 5, 6, 6, 4, 4,
|
||||||
4, 1, 0, 1, 0, 4, 8, 0, 4, 1,
|
4, 1, 2, 0, 1, 0, 4, 8, 0, 4,
|
||||||
3, 1, 3, 1, 1,
|
1, 3, 1, 3, 1, 1,
|
||||||
}
|
}
|
||||||
var yyChk = []int{
|
var yyChk = []int{
|
||||||
|
|
||||||
-1000, -19, 4, 5, -20, -21, -11, 31, 28, -16,
|
-1000, -19, 4, 5, -20, -21, -11, 31, 28, -16,
|
||||||
6, 16, 10, 9, -22, -13, 21, 11, 33, 18,
|
6, 16, 10, 18, 9, -22, -13, 21, 11, 33,
|
||||||
19, 17, -11, -8, -7, 6, -9, 28, 31, 31,
|
18, 19, 17, -11, -8, -7, 6, -9, 28, 31,
|
||||||
-3, 12, -16, 6, 6, 8, -10, 15, -10, -10,
|
31, -3, 12, 10, -16, 6, 6, 8, -10, 15,
|
||||||
32, 30, 29, -17, 27, 17, -18, 14, 29, -8,
|
-10, -10, 32, 30, 29, -17, 27, 17, -18, 14,
|
||||||
-1, 32, -12, -11, 7, -11, -14, 13, 31, -6,
|
29, -8, -1, 32, -12, -11, 7, -11, -14, 13,
|
||||||
28, 22, 34, -11, 31, -11, -11, -7, -18, 7,
|
31, -6, 28, 22, 34, -11, 31, -11, -11, -7,
|
||||||
8, 29, 32, 30, 32, 31, -2, 6, 27, -5,
|
-18, 7, 8, 29, 32, 30, 32, 31, -2, 6,
|
||||||
29, -4, 6, -11, -18, -2, -12, -3, -11, 32,
|
27, -5, 29, -4, 6, -11, -18, -2, -12, -3,
|
||||||
30, -11, 29, 30, 27, -15, 23, 32, -14, 32,
|
-11, 32, 30, -11, 29, 30, 27, -15, 23, 32,
|
||||||
6, -4, 7, 24, 8, 20, -6, 31, 25, -2,
|
-14, 32, 6, -4, 7, 24, 8, 20, -6, 31,
|
||||||
7, 32, 26, 7,
|
25, -2, 7, 32, 26, 7,
|
||||||
}
|
}
|
||||||
var yyDef = []int{
|
var yyDef = []int{
|
||||||
|
|
||||||
0, -2, 3, 0, -2, 2, 5, 0, 0, 20,
|
0, -2, 3, 0, -2, 2, 5, 0, 0, 20,
|
||||||
13, 47, 41, 12, 4, 0, 0, 11, 0, 44,
|
13, 48, 41, 0, 12, 4, 0, 0, 11, 0,
|
||||||
44, 44, 0, 0, 23, 0, 28, 0, 0, 0,
|
45, 45, 45, 0, 0, 23, 0, 28, 0, 0,
|
||||||
42, 0, 14, 13, 0, 0, 0, 0, 0, 0,
|
0, 43, 0, 42, 14, 13, 0, 0, 0, 0,
|
||||||
30, 0, 28, 0, 26, 27, 32, 0, 21, 0,
|
0, 0, 30, 0, 28, 0, 26, 27, 32, 0,
|
||||||
0, 34, 51, 53, 54, 0, 0, 43, 0, 0,
|
21, 0, 0, 34, 52, 54, 55, 0, 0, 44,
|
||||||
0, 0, 28, 38, 0, 39, 40, 24, 31, 25,
|
0, 0, 0, 0, 28, 38, 0, 39, 40, 24,
|
||||||
29, 22, 33, 0, 47, 0, 0, 49, 0, 0,
|
31, 25, 29, 22, 33, 0, 48, 0, 0, 50,
|
||||||
16, 17, 0, 8, 35, 0, 52, 42, 0, 48,
|
0, 0, 16, 17, 0, 8, 35, 0, 53, 43,
|
||||||
0, 6, 15, 0, 0, 0, 0, 45, 36, 37,
|
0, 49, 0, 6, 15, 0, 0, 0, 0, 46,
|
||||||
50, 18, 19, 14, 9, 0, 0, 0, 0, 0,
|
36, 37, 51, 18, 19, 14, 9, 0, 0, 0,
|
||||||
0, 46, 0, 7,
|
0, 0, 0, 47, 0, 7,
|
||||||
}
|
}
|
||||||
var yyTok1 = []int{
|
var yyTok1 = []int{
|
||||||
|
|
||||||
|
@ -697,25 +697,30 @@ yydefault:
|
||||||
case 41:
|
case 41:
|
||||||
//line parser.y:231
|
//line parser.y:231
|
||||||
{
|
{
|
||||||
yyVAL.ruleNode = ast.NewScalarLiteral(yyS[yypt-0].num)
|
yyVAL.ruleNode = NewScalarLiteral(yyS[yypt-0].num, "+")
|
||||||
}
|
}
|
||||||
case 42:
|
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:
|
case 43:
|
||||||
//line parser.y:237
|
//line parser.y:237
|
||||||
{
|
{
|
||||||
yyVAL.boolean = true
|
yyVAL.boolean = false
|
||||||
}
|
}
|
||||||
case 44:
|
case 44:
|
||||||
//line parser.y:241
|
//line parser.y:239
|
||||||
{
|
{
|
||||||
yyVAL.vectorMatching = nil
|
yyVAL.boolean = true
|
||||||
}
|
}
|
||||||
case 45:
|
case 45:
|
||||||
//line parser.y:243
|
//line parser.y:243
|
||||||
|
{
|
||||||
|
yyVAL.vectorMatching = nil
|
||||||
|
}
|
||||||
|
case 46:
|
||||||
|
//line parser.y:245
|
||||||
{
|
{
|
||||||
var err error
|
var err error
|
||||||
yyVAL.vectorMatching, err = newVectorMatching("", yyS[yypt-1].labelNameSlice, nil)
|
yyVAL.vectorMatching, err = newVectorMatching("", yyS[yypt-1].labelNameSlice, nil)
|
||||||
|
@ -724,8 +729,8 @@ yydefault:
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 46:
|
case 47:
|
||||||
//line parser.y:249
|
//line parser.y:251
|
||||||
{
|
{
|
||||||
var err error
|
var err error
|
||||||
yyVAL.vectorMatching, err = newVectorMatching(yyS[yypt-3].str, yyS[yypt-5].labelNameSlice, yyS[yypt-1].labelNameSlice)
|
yyVAL.vectorMatching, err = newVectorMatching(yyS[yypt-3].str, yyS[yypt-5].labelNameSlice, yyS[yypt-1].labelNameSlice)
|
||||||
|
@ -734,43 +739,43 @@ yydefault:
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 47:
|
|
||||||
//line parser.y:257
|
|
||||||
{
|
|
||||||
yyVAL.labelNameSlice = clientmodel.LabelNames{}
|
|
||||||
}
|
|
||||||
case 48:
|
case 48:
|
||||||
//line parser.y:259
|
//line parser.y:259
|
||||||
{
|
{
|
||||||
yyVAL.labelNameSlice = yyS[yypt-1].labelNameSlice
|
yyVAL.labelNameSlice = clientmodel.LabelNames{}
|
||||||
}
|
}
|
||||||
case 49:
|
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:
|
case 50:
|
||||||
//line parser.y:265
|
//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:
|
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:
|
case 52:
|
||||||
//line parser.y:271
|
//line parser.y:271
|
||||||
{
|
{
|
||||||
yyVAL.ruleNodeSlice = append(yyVAL.ruleNodeSlice, yyS[yypt-0].ruleNode)
|
yyVAL.ruleNodeSlice = []ast.Node{yyS[yypt-0].ruleNode}
|
||||||
}
|
}
|
||||||
case 53:
|
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:
|
case 54:
|
||||||
//line parser.y:277
|
//line parser.y:277
|
||||||
|
{
|
||||||
|
yyVAL.ruleNode = yyS[yypt-0].ruleNode
|
||||||
|
}
|
||||||
|
case 55:
|
||||||
|
//line parser.y:279
|
||||||
{
|
{
|
||||||
yyVAL.ruleNode = ast.NewStringLiteral(yyS[yypt-0].str)
|
yyVAL.ruleNode = ast.NewStringLiteral(yyS[yypt-0].str)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1105,6 +1105,18 @@ func TestExpressions(t *testing.T) {
|
||||||
expr: `12.34e-6`,
|
expr: `12.34e-6`,
|
||||||
output: []string{`scalar: 0.00001234 @[%v]`},
|
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`,
|
expr: `.2`,
|
||||||
output: []string{`scalar: 0.2 @[%v]`},
|
output: []string{`scalar: 0.2 @[%v]`},
|
||||||
|
|
Loading…
Reference in a new issue