mirror of https://github.com/prometheus/prometheus
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.pull/572/head
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 New Issue