From e8bfcfcf1a6e0e084574851c135b46cbfd479a8b Mon Sep 17 00:00:00 2001 From: sujal shah Date: Thu, 27 Mar 2025 04:24:18 +0530 Subject: [PATCH] promql: Implement / operators for trimming native histograms. This implements the TRIM_UPPER (/) operators that allow removing observations below or above a threshold from a histogram. The implementation zeros out buckets outside the desired range. It also recalculates the sum, including only bucket counts within the specified threshold range. Fixes #14651. Signed-off-by: sujal shah --- promql/engine.go | 309 +++- promql/parser/generated_parser.y | 6 +- promql/parser/generated_parser.y.go | 1395 +++++++++-------- promql/parser/lex.go | 38 +- .../testdata/native_histograms.test | 55 + web/ui/mantine-ui/src/promql/ast.ts | 2 + web/ui/mantine-ui/src/promql/utils.ts | 2 + .../codemirror-promql/src/complete/hybrid.ts | 6 +- .../src/complete/promql.terms.ts | 2 + .../codemirror-promql/src/parser/parser.ts | 20 +- web/ui/module/lezer-promql/src/promql.grammar | 4 + .../module/lezer-promql/test/expression.txt | 28 + 12 files changed, 1156 insertions(+), 711 deletions(-) diff --git a/promql/engine.go b/promql/engine.go index b609dc4f0a..749352c23d 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -3140,6 +3140,301 @@ func scalarBinop(op parser.ItemType, lhs, rhs float64) float64 { panic(fmt.Errorf("operator %q not allowed for Scalar operations", op)) } +// processCustomBucket handles custom bucket processing for histogram trimming. +// It returns the count to keep and the bucket midpoint for sum calculations. +func processCustomBucket( + bucket histogram.Bucket[float64], + rhs float64, + op parser.ItemType, +) (keepCount, bucketMidpoint float64) { + // Midpoint calculation + switch { + case math.IsInf(bucket.Lower, -1): + // First bucket: no lower bound, assume midpoint is near upper bound. + bucketMidpoint = bucket.Upper + case math.IsInf(bucket.Upper, 1): + bucketMidpoint = bucket.Lower + default: + bucketMidpoint = (bucket.Lower + bucket.Upper) / 2 + } + + // Fractional keepCount calculation + switch op { + case parser.TRIM_UPPER: + switch { + case math.IsInf(bucket.Lower, -1): + // Special case for -Inf lower bound + if rhs >= bucket.Upper { + // Trim point is above bucket upper bound, keep all + keepCount = bucket.Count + } else { + // Trim point is within bucket or below, keep none + keepCount = 0 + } + case math.IsInf(bucket.Upper, 1): + // Special case for +Inf upper bound + if rhs <= bucket.Lower { + // Trim point is below bucket lower bound, keep none + keepCount = 0 + } else { + // Trim point is within the bucket, keep a portion + // Since we can't interpolate with +Inf, assume keep half for simplicity + // Another approach would be to use a different interpolation scheme + keepCount = bucket.Count * 0.5 + } + default: + // Normal case - finite bounds + switch { + case bucket.Upper <= rhs: + // Bucket entirely below trim point - keep all + keepCount = bucket.Count + case bucket.Lower < rhs: + // Bucket contains trim point - interpolate + fraction := (rhs - bucket.Lower) / (bucket.Upper - bucket.Lower) + keepCount = bucket.Count * fraction + default: + // Bucket entirely above trim point - discard + keepCount = 0 + } + } + + case parser.TRIM_LOWER: + switch { + case math.IsInf(bucket.Upper, 1): + // Special case for +Inf upper bound + if rhs <= bucket.Lower { + keepCount = bucket.Count + } else { + keepCount = 0 + } + case math.IsInf(bucket.Lower, -1): + // Special case for -Inf lower bound + if rhs >= bucket.Upper { + keepCount = 0 + } else { + keepCount = bucket.Count * 0.5 + } + default: + switch { + case bucket.Lower >= rhs: + keepCount = bucket.Count + case bucket.Upper > rhs: + fraction := (bucket.Upper - rhs) / (bucket.Upper - bucket.Lower) + keepCount = bucket.Count * fraction + default: + keepCount = 0 + } + } + } + + return keepCount, bucketMidpoint +} + +func computeBucketTrim(op parser.ItemType, bucket histogram.Bucket[float64], rhs float64, isPostive, isCustomBucket bool) (float64, float64) { + if isCustomBucket { + return processCustomBucket(bucket, rhs, op) + } + return computeExponentialTrim(bucket, rhs, isPostive, op) +} + +// Helper function to trim native histogram buckets. +func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, op parser.ItemType) { + updatedCount := 0.0 + origSum := trimmedHist.Sum + removedSum := 0.0 + hasPositive, hasNegative := false, false + isCustomBucket := trimmedHist.UsesCustomBuckets() + + // Calculate the fraction to keep for buckets that contain the trim value + // For TRIM_UPPER, we keep observations below the trim point (rhs) + switch op { + case parser.TRIM_UPPER: + for i, iter := 0, trimmedHist.PositiveBucketIterator(); iter.Next(); i++ { + hasPositive = true + bucket := iter.At() + var keepCount, bucketMidpoint float64 + keepCount, bucketMidpoint = computeBucketTrim(op, bucket, rhs, true, isCustomBucket) + + // Bucket is entirely below the trim point - keep all + switch { + case bucket.Upper <= rhs: + updatedCount += bucket.Count + case bucket.Lower < rhs: + // Bucket contains the trim point - interpolate + removedCount := bucket.Count - keepCount + removedMid := bucketMidpoint + removedSum += removedCount * removedMid + + updatedCount += keepCount + trimmedHist.PositiveBuckets[i] = keepCount + default: + if !isCustomBucket { + bucketMidpoint = math.Sqrt(bucket.Lower * bucket.Upper) + } + removedSum += bucket.Count * bucketMidpoint + // Bucket is entirely above the trim point - discard + trimmedHist.PositiveBuckets[i] = 0 + } + } + + for i, iter := 0, trimmedHist.NegativeBucketIterator(); iter.Next(); i++ { + hasNegative = true + bucket := iter.At() + var keepCount, bucketMidpoint float64 + keepCount, bucketMidpoint = computeBucketTrim(op, bucket, rhs, false, isCustomBucket) + + switch { + case bucket.Upper <= rhs: + updatedCount += bucket.Count + case bucket.Lower < rhs: + removedCount := bucket.Count - keepCount + removedMid := bucketMidpoint + removedSum += removedCount * removedMid + + trimmedHist.NegativeBuckets[i] = keepCount + updatedCount += keepCount + default: + bucketMidpoint = math.Sqrt(bucket.Lower * bucket.Upper) + removedSum += bucket.Count * bucketMidpoint + trimmedHist.NegativeBuckets[i] = 0 + } + } + + // For TRIM_LOWER, we keep observations above the trim point (rhs) + case parser.TRIM_LOWER: + for i, iter := 0, trimmedHist.PositiveBucketIterator(); iter.Next(); i++ { + hasPositive = true + bucket := iter.At() + var keepCount, bucketMidpoint float64 + keepCount, bucketMidpoint = computeBucketTrim(op, bucket, rhs, true, isCustomBucket) + + switch { + case bucket.Lower >= rhs: + updatedCount += bucket.Count + case bucket.Upper > rhs: + removedCount := bucket.Count - keepCount + removedMid := bucketMidpoint + removedSum += removedCount * removedMid + + trimmedHist.PositiveBuckets[i] = keepCount + updatedCount += keepCount + default: + if !isCustomBucket { + bucketMidpoint = math.Sqrt(bucket.Lower * bucket.Upper) + } + removedSum += bucket.Count * bucketMidpoint + trimmedHist.PositiveBuckets[i] = 0 + } + } + + for i, iter := 0, trimmedHist.NegativeBucketIterator(); iter.Next(); i++ { + hasNegative = true + bucket := iter.At() + var keepCount, bucketMidpoint float64 + keepCount, bucketMidpoint = computeBucketTrim(op, bucket, rhs, false, isCustomBucket) + switch { + case bucket.Lower >= rhs: + updatedCount += bucket.Count + case bucket.Upper > rhs: + removedCount := bucket.Count - keepCount + removedMid := bucketMidpoint + removedSum += removedCount * removedMid + + trimmedHist.NegativeBuckets[i] = keepCount + updatedCount += keepCount + default: + bucketMidpoint = math.Sqrt(bucket.Lower * bucket.Upper) + removedSum += bucket.Count * bucketMidpoint + trimmedHist.NegativeBuckets[i] = 0 + } + } + } + + // Handle the zero count bucket + if trimmedHist.ZeroCount > 0 { + zeroBucket := trimmedHist.ZeroBucket() + zLower := zeroBucket.Lower + zUpper := zeroBucket.Upper + + switch op { + case parser.TRIM_UPPER: + switch { + case rhs < zLower: + trimmedHist.ZeroCount = 0 + case rhs > zUpper: + updatedCount += trimmedHist.ZeroCount + default: + fraction := (rhs - zLower) / (zUpper - zLower) + keepCount := trimmedHist.ZeroCount * fraction + trimmedHist.ZeroCount = keepCount + updatedCount += keepCount + } + + case parser.TRIM_LOWER: + switch { + case rhs > zUpper: + trimmedHist.ZeroCount = 0 + case rhs < zLower: + updatedCount += trimmedHist.ZeroCount + default: + fraction := (zUpper - rhs) / (zUpper - zLower) + keepCount := trimmedHist.ZeroCount * fraction + trimmedHist.ZeroCount = keepCount + updatedCount += keepCount + } + } + } + + // Apply new sum + newSum := origSum - removedSum + + // Clamp correction + if !hasNegative && newSum < 0 { + newSum = 0 + } + if !hasPositive && newSum > 0 { + newSum = 0 + } + + // Update the histogram's count and sum + trimmedHist.Count = updatedCount + trimmedHist.Sum = newSum + + trimmedHist.Compact(0) +} + +func computeExponentialTrim(bucket histogram.Bucket[float64], rhs float64, isPositive bool, op parser.ItemType) (float64, float64) { + var fraction, bucketMidpoint, keepCount float64 + + logLower := math.Log2(math.Abs(bucket.Lower)) + logUpper := math.Log2(math.Abs(bucket.Upper)) + logRHS := math.Log2(math.Abs(rhs)) + + switch op { + case parser.TRIM_UPPER: + if isPositive { + fraction = (logRHS - logLower) / (logUpper - logLower) + bucketMidpoint = math.Sqrt(bucket.Lower * rhs) + } else { + fraction = 1 - ((logRHS - logUpper) / (logLower - logUpper)) + bucketMidpoint = -math.Sqrt(math.Abs(bucket.Lower) * math.Abs(rhs)) + } + + case parser.TRIM_LOWER: + if isPositive { + fraction = (logUpper - logRHS) / (logUpper - logLower) + bucketMidpoint = math.Sqrt(rhs * bucket.Upper) + } else { + fraction = (logRHS - logUpper) / (logLower - logUpper) + bucketMidpoint = -math.Sqrt(math.Abs(rhs) * math.Abs(bucket.Upper)) + } + } + + keepCount = bucket.Count * fraction + + return keepCount, bucketMidpoint +} + // vectorElemBinop evaluates a binary operation between two Vector elements. func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram.FloatHistogram, pos posrange.PositionRange) (res float64, resH *histogram.FloatHistogram, keep bool, info, err error) { switch { @@ -3172,6 +3467,8 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram return lhs, nil, lhs <= rhs, nil, nil case parser.ATAN2: return math.Atan2(lhs, rhs), nil, true, nil, nil + case parser.TRIM_LOWER, parser.TRIM_UPPER: + return 0, nil, false, nil, annotations.NewIncompatibleTypesInBinOpInfo("float", parser.ItemTypeStr[op], "float", pos) } } case hlhs == nil && hrhs != nil: @@ -3179,7 +3476,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram switch op { case parser.MUL: return 0, hrhs.Copy().Mul(lhs).Compact(0), true, nil, nil - case parser.ADD, parser.SUB, parser.DIV, parser.POW, parser.MOD, parser.EQLC, parser.NEQ, parser.GTR, parser.LSS, parser.GTE, parser.LTE, parser.ATAN2: + case parser.ADD, parser.SUB, parser.DIV, parser.POW, parser.MOD, parser.EQLC, parser.NEQ, parser.GTR, parser.TRIM_LOWER, parser.TRIM_UPPER, parser.LSS, parser.GTE, parser.LTE, parser.ATAN2: return 0, nil, false, nil, annotations.NewIncompatibleTypesInBinOpInfo("float", parser.ItemTypeStr[op], "histogram", pos) } } @@ -3190,6 +3487,14 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram return 0, hlhs.Copy().Mul(rhs).Compact(0), true, nil, nil case parser.DIV: return 0, hlhs.Copy().Div(rhs).Compact(0), true, nil, nil + case parser.TRIM_UPPER: + trimmedHist := hlhs.Copy() + trimHistogram(trimmedHist, rhs, op) + return 0, trimmedHist, true, nil, nil + case parser.TRIM_LOWER: + trimmedHist := hlhs.Copy() + trimHistogram(trimmedHist, rhs, op) + return 0, trimmedHist, true, nil, nil case parser.ADD, parser.SUB, parser.POW, parser.MOD, parser.EQLC, parser.NEQ, parser.GTR, parser.LSS, parser.GTE, parser.LTE, parser.ATAN2: return 0, nil, false, nil, annotations.NewIncompatibleTypesInBinOpInfo("histogram", parser.ItemTypeStr[op], "float", pos) } @@ -3230,7 +3535,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram case parser.NEQ: // This operation expects that both histograms are compacted. return 0, hlhs, !hlhs.Equals(hrhs), nil, nil - case parser.MUL, parser.DIV, parser.POW, parser.MOD, parser.GTR, parser.LSS, parser.GTE, parser.LTE, parser.ATAN2: + case parser.MUL, parser.DIV, parser.POW, parser.MOD, parser.GTR, parser.LSS, parser.GTE, parser.LTE, parser.ATAN2, parser.TRIM_LOWER, parser.TRIM_UPPER: return 0, nil, false, nil, annotations.NewIncompatibleTypesInBinOpInfo("histogram", parser.ItemTypeStr[op], "histogram", pos) } } diff --git a/promql/parser/generated_parser.y b/promql/parser/generated_parser.y index 71ab6ed4b3..7ac16f3c08 100644 --- a/promql/parser/generated_parser.y +++ b/promql/parser/generated_parser.y @@ -98,6 +98,8 @@ EQLC EQL_REGEX GTE GTR +TRIM_UPPER +TRIM_LOWER LAND LOR LSS @@ -200,7 +202,7 @@ START_METRIC_SELECTOR // Operators are listed with increasing precedence. %left LOR %left LAND LUNLESS -%left EQLC GTE GTR LSS LTE NEQ +%left EQLC GTE GTR LSS LTE NEQ TRIM_UPPER TRIM_LOWER %left ADD SUB %left MUL DIV MOD ATAN2 %right POW @@ -291,6 +293,8 @@ binary_expr : expr ADD bin_modifier expr { $$ = yylex.(*parser).newBinar | expr EQLC bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } | expr GTE bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } | expr GTR bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } + | expr TRIM_UPPER bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } + | expr TRIM_LOWER bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } | expr LAND bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } | expr LOR bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } | expr LSS bin_modifier expr { $$ = yylex.(*parser).newBinaryExpression($1, $2, $3, $4) } diff --git a/promql/parser/generated_parser.y.go b/promql/parser/generated_parser.y.go index d20460ed5b..17a001e11b 100644 --- a/promql/parser/generated_parser.y.go +++ b/promql/parser/generated_parser.y.go @@ -78,69 +78,71 @@ const EQLC = 57385 const EQL_REGEX = 57386 const GTE = 57387 const GTR = 57388 -const LAND = 57389 -const LOR = 57390 -const LSS = 57391 -const LTE = 57392 -const LUNLESS = 57393 -const MOD = 57394 -const MUL = 57395 -const NEQ = 57396 -const NEQ_REGEX = 57397 -const POW = 57398 -const SUB = 57399 -const AT = 57400 -const ATAN2 = 57401 -const operatorsEnd = 57402 -const aggregatorsStart = 57403 -const AVG = 57404 -const BOTTOMK = 57405 -const COUNT = 57406 -const COUNT_VALUES = 57407 -const GROUP = 57408 -const MAX = 57409 -const MIN = 57410 -const QUANTILE = 57411 -const STDDEV = 57412 -const STDVAR = 57413 -const SUM = 57414 -const TOPK = 57415 -const LIMITK = 57416 -const LIMIT_RATIO = 57417 -const aggregatorsEnd = 57418 -const keywordsStart = 57419 -const BOOL = 57420 -const BY = 57421 -const GROUP_LEFT = 57422 -const GROUP_RIGHT = 57423 -const FILL = 57424 -const FILL_LEFT = 57425 -const FILL_RIGHT = 57426 -const IGNORING = 57427 -const OFFSET = 57428 -const SMOOTHED = 57429 -const ANCHORED = 57430 -const ON = 57431 -const WITHOUT = 57432 -const keywordsEnd = 57433 -const preprocessorStart = 57434 -const START = 57435 -const END = 57436 -const STEP = 57437 -const RANGE = 57438 -const preprocessorEnd = 57439 -const counterResetHintsStart = 57440 -const UNKNOWN_COUNTER_RESET = 57441 -const COUNTER_RESET = 57442 -const NOT_COUNTER_RESET = 57443 -const GAUGE_TYPE = 57444 -const counterResetHintsEnd = 57445 -const startSymbolsStart = 57446 -const START_METRIC = 57447 -const START_SERIES_DESCRIPTION = 57448 -const START_EXPRESSION = 57449 -const START_METRIC_SELECTOR = 57450 -const startSymbolsEnd = 57451 +const TRIM_UPPER = 57389 +const TRIM_LOWER = 57390 +const LAND = 57391 +const LOR = 57392 +const LSS = 57393 +const LTE = 57394 +const LUNLESS = 57395 +const MOD = 57396 +const MUL = 57397 +const NEQ = 57398 +const NEQ_REGEX = 57399 +const POW = 57400 +const SUB = 57401 +const AT = 57402 +const ATAN2 = 57403 +const operatorsEnd = 57404 +const aggregatorsStart = 57405 +const AVG = 57406 +const BOTTOMK = 57407 +const COUNT = 57408 +const COUNT_VALUES = 57409 +const GROUP = 57410 +const MAX = 57411 +const MIN = 57412 +const QUANTILE = 57413 +const STDDEV = 57414 +const STDVAR = 57415 +const SUM = 57416 +const TOPK = 57417 +const LIMITK = 57418 +const LIMIT_RATIO = 57419 +const aggregatorsEnd = 57420 +const keywordsStart = 57421 +const BOOL = 57422 +const BY = 57423 +const GROUP_LEFT = 57424 +const GROUP_RIGHT = 57425 +const FILL = 57426 +const FILL_LEFT = 57427 +const FILL_RIGHT = 57428 +const IGNORING = 57429 +const OFFSET = 57430 +const SMOOTHED = 57431 +const ANCHORED = 57432 +const ON = 57433 +const WITHOUT = 57434 +const keywordsEnd = 57435 +const preprocessorStart = 57436 +const START = 57437 +const END = 57438 +const STEP = 57439 +const RANGE = 57440 +const preprocessorEnd = 57441 +const counterResetHintsStart = 57442 +const UNKNOWN_COUNTER_RESET = 57443 +const COUNTER_RESET = 57444 +const NOT_COUNTER_RESET = 57445 +const GAUGE_TYPE = 57446 +const counterResetHintsEnd = 57447 +const startSymbolsStart = 57448 +const START_METRIC = 57449 +const START_SERIES_DESCRIPTION = 57450 +const START_EXPRESSION = 57451 +const START_METRIC_SELECTOR = 57452 +const startSymbolsEnd = 57453 var yyToknames = [...]string{ "$end", @@ -189,6 +191,8 @@ var yyToknames = [...]string{ "EQL_REGEX", "GTE", "GTR", + "TRIM_UPPER", + "TRIM_LOWER", "LAND", "LOR", "LSS", @@ -265,369 +269,372 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 44, - 1, 161, - 10, 161, - 24, 161, + 1, 163, + 10, 163, + 24, 163, -2, 0, -1, 75, - 2, 204, - 15, 204, - 79, 204, - 90, 204, - -2, 115, - -1, 76, - 2, 205, - 15, 205, - 79, 205, - 90, 205, - -2, 116, - -1, 77, 2, 206, 15, 206, - 79, 206, - 90, 206, - -2, 118, - -1, 78, + 81, 206, + 92, 206, + -2, 117, + -1, 76, 2, 207, 15, 207, - 79, 207, - 90, 207, - -2, 119, - -1, 79, + 81, 207, + 92, 207, + -2, 118, + -1, 77, 2, 208, 15, 208, - 79, 208, - 90, 208, - -2, 123, - -1, 80, + 81, 208, + 92, 208, + -2, 120, + -1, 78, 2, 209, 15, 209, - 79, 209, - 90, 209, - -2, 128, - -1, 81, + 81, 209, + 92, 209, + -2, 121, + -1, 79, 2, 210, 15, 210, - 79, 210, - 90, 210, - -2, 130, - -1, 82, + 81, 210, + 92, 210, + -2, 125, + -1, 80, 2, 211, 15, 211, - 79, 211, - 90, 211, - -2, 132, - -1, 83, + 81, 211, + 92, 211, + -2, 130, + -1, 81, 2, 212, 15, 212, - 79, 212, - 90, 212, - -2, 133, - -1, 84, + 81, 212, + 92, 212, + -2, 132, + -1, 82, 2, 213, 15, 213, - 79, 213, - 90, 213, + 81, 213, + 92, 213, -2, 134, - -1, 85, + -1, 83, 2, 214, 15, 214, - 79, 214, - 90, 214, + 81, 214, + 92, 214, -2, 135, - -1, 86, + -1, 84, 2, 215, 15, 215, - 79, 215, - 90, 215, + 81, 215, + 92, 215, -2, 136, - -1, 87, + -1, 85, 2, 216, 15, 216, - 79, 216, - 90, 216, - -2, 140, - -1, 88, + 81, 216, + 92, 216, + -2, 137, + -1, 86, 2, 217, 15, 217, - 79, 217, - 90, 217, - -2, 141, - -1, 140, - 41, 288, - 42, 288, - 52, 288, - 53, 288, - 57, 288, + 81, 217, + 92, 217, + -2, 138, + -1, 87, + 2, 218, + 15, 218, + 81, 218, + 92, 218, + -2, 142, + -1, 88, + 2, 219, + 15, 219, + 81, 219, + 92, 219, + -2, 143, + -1, 142, + 41, 290, + 42, 290, + 54, 290, + 55, 290, + 59, 290, -2, 22, - -1, 258, - 9, 273, - 12, 273, - 13, 273, - 18, 273, - 19, 273, - 25, 273, - 41, 273, - 47, 273, - 48, 273, - 51, 273, - 57, 273, - 62, 273, - 63, 273, - 64, 273, - 65, 273, - 66, 273, - 67, 273, - 68, 273, - 69, 273, - 70, 273, - 71, 273, - 72, 273, - 73, 273, - 74, 273, - 75, 273, - 79, 273, - 82, 273, - 83, 273, - 84, 273, - 86, 273, - 87, 273, - 88, 273, - 90, 273, - 93, 273, - 94, 273, - 95, 273, - 96, 273, + -1, 262, + 9, 275, + 12, 275, + 13, 275, + 18, 275, + 19, 275, + 25, 275, + 41, 275, + 49, 275, + 50, 275, + 53, 275, + 59, 275, + 64, 275, + 65, 275, + 66, 275, + 67, 275, + 68, 275, + 69, 275, + 70, 275, + 71, 275, + 72, 275, + 73, 275, + 74, 275, + 75, 275, + 76, 275, + 77, 275, + 81, 275, + 84, 275, + 85, 275, + 86, 275, + 88, 275, + 89, 275, + 90, 275, + 92, 275, + 95, 275, + 96, 275, + 97, 275, + 98, 275, -2, 0, - -1, 259, - 9, 273, - 12, 273, - 13, 273, - 18, 273, - 19, 273, - 25, 273, - 41, 273, - 47, 273, - 48, 273, - 51, 273, - 57, 273, - 62, 273, - 63, 273, - 64, 273, - 65, 273, - 66, 273, - 67, 273, - 68, 273, - 69, 273, - 70, 273, - 71, 273, - 72, 273, - 73, 273, - 74, 273, - 75, 273, - 79, 273, - 82, 273, - 83, 273, - 84, 273, - 86, 273, - 87, 273, - 88, 273, - 90, 273, - 93, 273, - 94, 273, - 95, 273, - 96, 273, + -1, 263, + 9, 275, + 12, 275, + 13, 275, + 18, 275, + 19, 275, + 25, 275, + 41, 275, + 49, 275, + 50, 275, + 53, 275, + 59, 275, + 64, 275, + 65, 275, + 66, 275, + 67, 275, + 68, 275, + 69, 275, + 70, 275, + 71, 275, + 72, 275, + 73, 275, + 74, 275, + 75, 275, + 76, 275, + 77, 275, + 81, 275, + 84, 275, + 85, 275, + 86, 275, + 88, 275, + 89, 275, + 90, 275, + 92, 275, + 95, 275, + 96, 275, + 97, 275, + 98, 275, -2, 0, } const yyPrivate = 57344 -const yyLast = 1224 +const yyLast = 1241 var yyAct = [...]int16{ - 61, 363, 190, 429, 351, 436, 431, 293, 247, 201, - 98, 51, 147, 193, 369, 96, 231, 412, 413, 370, - 132, 133, 68, 130, 73, 163, 194, 131, 443, 444, - 445, 446, 134, 135, 256, 253, 254, 255, 257, 258, - 259, 129, 70, 426, 123, 425, 124, 127, 391, 342, - 157, 458, 223, 198, 447, 389, 415, 128, 126, 345, - 451, 129, 125, 197, 414, 465, 398, 138, 379, 140, - 6, 103, 105, 106, 346, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 199, 117, 118, 122, 104, - 347, 136, 343, 46, 124, 127, 389, 133, 334, 251, - 397, 200, 149, 377, 192, 128, 126, 199, 134, 129, - 125, 198, 141, 333, 420, 396, 119, 121, 120, 123, - 186, 197, 395, 200, 203, 208, 209, 210, 211, 212, - 213, 181, 376, 419, 430, 204, 204, 204, 204, 204, - 204, 204, 182, 199, 185, 227, 205, 205, 205, 205, - 205, 205, 205, 216, 219, 215, 204, 341, 214, 200, - 137, 117, 139, 122, 339, 385, 237, 205, 239, 464, - 384, 249, 226, 2, 3, 4, 5, 91, 290, 225, - 340, 123, 289, 280, 250, 383, 364, 338, 124, 127, - 284, 119, 121, 120, 275, 195, 196, 288, 218, 128, - 126, 204, 460, 129, 125, 205, 280, 278, 158, 105, - 374, 217, 205, 286, 287, 423, 243, 204, 241, 114, - 115, 124, 127, 117, 373, 122, 104, 372, 205, 222, - 143, 437, 128, 126, 124, 127, 129, 125, 65, 242, - 149, 240, 337, 142, 42, 128, 126, 418, 64, 129, - 125, 285, 252, 119, 121, 120, 365, 366, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 344, 371, 127, 367, 368, 198, 283, - 375, 124, 127, 282, 378, 128, 126, 281, 197, 129, - 203, 204, 128, 126, 135, 204, 129, 125, 198, 380, - 65, 204, 205, 144, 7, 409, 205, 408, 197, 407, - 64, 406, 205, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 202, 232, - 199, 233, 89, 156, 417, 65, 387, 405, 463, 233, - 404, 189, 102, 224, 403, 64, 200, 204, 90, 388, - 390, 10, 392, 124, 127, 393, 394, 462, 205, 402, - 461, 93, 124, 127, 128, 126, 401, 89, 129, 125, - 400, 235, 399, 128, 126, 416, 410, 129, 125, 235, - 8, 234, 236, 90, 44, 59, 204, 411, 43, 234, - 236, 92, 422, 188, 187, 1, 179, 205, 424, 155, - 428, 154, 230, 432, 433, 434, 150, 229, 74, 335, - 439, 438, 441, 440, 449, 450, 148, 435, 58, 452, - 228, 206, 207, 448, 336, 57, 296, 56, 386, 100, - 204, 69, 453, 454, 9, 9, 309, 455, 99, 55, - 457, 205, 315, 124, 127, 162, 421, 150, 97, 295, - 99, 54, 459, 53, 128, 126, 238, 148, 129, 125, - 97, 100, 153, 204, 466, 146, 52, 152, 95, 50, - 100, 311, 312, 100, 205, 313, 160, 220, 49, 161, - 151, 48, 159, 326, 47, 60, 297, 299, 301, 302, - 303, 314, 316, 319, 320, 321, 322, 323, 327, 328, - 246, 456, 298, 300, 304, 305, 306, 307, 308, 310, - 317, 332, 331, 318, 296, 348, 101, 324, 325, 329, - 330, 245, 244, 291, 309, 198, 94, 442, 248, 191, - 315, 350, 251, 294, 292, 197, 62, 295, 349, 145, - 0, 0, 353, 354, 352, 359, 361, 358, 360, 355, - 356, 357, 362, 0, 0, 0, 0, 199, 0, 311, - 312, 0, 0, 313, 0, 0, 0, 0, 0, 0, - 0, 326, 0, 200, 297, 299, 301, 302, 303, 314, - 316, 319, 320, 321, 322, 323, 327, 328, 0, 0, - 298, 300, 304, 305, 306, 307, 308, 310, 317, 332, - 331, 318, 0, 0, 0, 324, 325, 329, 330, 65, - 0, 0, 63, 91, 0, 66, 427, 0, 25, 64, - 0, 0, 221, 0, 0, 67, 0, 353, 354, 352, - 359, 361, 358, 360, 355, 356, 357, 362, 0, 0, - 0, 89, 0, 0, 0, 0, 0, 21, 22, 0, - 0, 23, 0, 0, 0, 0, 0, 90, 0, 0, - 0, 0, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 0, 0, 0, 13, - 0, 0, 16, 17, 18, 0, 27, 41, 40, 0, - 33, 0, 0, 34, 35, 71, 72, 65, 45, 0, - 63, 91, 0, 66, 0, 0, 25, 64, 0, 0, - 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, - 0, 0, 0, 0, 0, 21, 22, 0, 0, 23, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 0, 0, 0, 13, 0, 0, - 16, 17, 18, 0, 27, 41, 40, 0, 33, 0, - 0, 34, 35, 71, 72, 65, 0, 0, 63, 91, - 0, 66, 0, 0, 25, 64, 0, 0, 0, 0, - 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, - 0, 0, 0, 21, 22, 0, 0, 23, 0, 0, - 0, 0, 0, 90, 0, 0, 0, 0, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 0, 0, 0, 13, 0, 0, 16, 17, - 18, 0, 27, 41, 40, 0, 33, 20, 91, 34, - 35, 71, 72, 25, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 22, 0, 0, 23, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, 12, 14, - 15, 19, 24, 26, 28, 29, 30, 31, 32, 36, - 37, 0, 0, 0, 13, 0, 0, 16, 17, 18, - 0, 27, 41, 40, 0, 33, 20, 42, 34, 35, - 38, 39, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61, 369, 194, 435, 357, 442, 437, 299, 251, 205, + 98, 51, 149, 197, 73, 96, 235, 260, 375, 376, + 134, 261, 68, 135, 133, 132, 449, 450, 451, 452, + 418, 419, 198, 137, 136, 257, 258, 259, 262, 263, + 165, 70, 126, 129, 131, 125, 432, 431, 397, 125, + 348, 159, 236, 227, 237, 130, 128, 395, 395, 131, + 127, 404, 464, 453, 421, 202, 457, 140, 420, 142, + 6, 385, 103, 105, 106, 201, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 138, 119, + 120, 124, 104, 119, 239, 124, 46, 203, 436, 135, + 126, 129, 151, 383, 382, 230, 238, 240, 229, 255, + 136, 143, 370, 130, 128, 204, 380, 131, 127, 121, + 123, 122, 190, 121, 123, 122, 207, 212, 213, 214, + 215, 216, 217, 185, 379, 65, 189, 208, 208, 208, + 208, 208, 208, 208, 186, 64, 378, 231, 209, 209, + 209, 209, 209, 209, 209, 220, 223, 218, 208, 219, + 347, 345, 145, 139, 65, 141, 351, 89, 241, 209, + 243, 144, 426, 253, 64, 2, 3, 4, 5, 125, + 349, 352, 291, 346, 344, 90, 249, 286, 247, 237, + 202, 425, 254, 252, 290, 203, 443, 255, 281, 353, + 201, 284, 289, 288, 287, 208, 103, 105, 137, 209, + 286, 246, 245, 204, 160, 129, 209, 292, 293, 116, + 117, 208, 203, 119, 120, 124, 104, 130, 128, 239, + 146, 131, 209, 152, 226, 244, 222, 202, 91, 42, + 204, 238, 240, 150, 151, 196, 343, 201, 7, 221, + 415, 342, 202, 121, 123, 122, 100, 256, 414, 413, + 371, 372, 201, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 373, 374, 377, 350, 203, 340, 381, 412, 99, 391, + 384, 469, 158, 10, 390, 43, 207, 208, 97, 411, + 339, 208, 204, 93, 202, 386, 242, 208, 209, 389, + 468, 100, 209, 467, 201, 410, 471, 409, 209, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 203, 408, 199, 200, + 470, 407, 393, 406, 405, 59, 296, 466, 403, 102, + 295, 92, 1, 208, 204, 394, 396, 183, 398, 126, + 129, 399, 400, 402, 209, 294, 126, 129, 152, 234, + 401, 8, 130, 128, 233, 44, 131, 127, 150, 130, + 128, 422, 416, 131, 127, 74, 148, 232, 388, 58, + 99, 100, 208, 417, 155, 65, 57, 56, 428, 154, + 97, 193, 55, 209, 430, 64, 434, 387, 95, 438, + 439, 440, 153, 100, 424, 164, 445, 444, 447, 446, + 455, 456, 157, 441, 156, 458, 54, 89, 69, 454, + 53, 9, 9, 52, 302, 50, 208, 392, 459, 460, + 429, 162, 224, 461, 315, 90, 463, 209, 126, 129, + 321, 49, 163, 48, 427, 192, 191, 301, 465, 126, + 129, 130, 128, 161, 47, 131, 127, 60, 250, 208, + 472, 462, 130, 128, 354, 101, 131, 127, 248, 297, + 209, 317, 318, 210, 211, 319, 94, 448, 195, 300, + 62, 147, 0, 332, 0, 0, 303, 305, 307, 308, + 309, 320, 322, 325, 326, 327, 328, 329, 333, 334, + 0, 0, 304, 306, 310, 311, 312, 313, 314, 316, + 323, 338, 337, 324, 302, 0, 423, 330, 331, 335, + 336, 0, 228, 0, 315, 0, 0, 0, 0, 0, + 321, 0, 0, 0, 298, 126, 129, 301, 0, 0, + 0, 126, 129, 0, 0, 0, 0, 0, 130, 128, + 0, 0, 131, 127, 130, 128, 0, 0, 131, 127, + 0, 317, 318, 0, 0, 319, 0, 0, 0, 0, + 0, 341, 0, 332, 0, 0, 303, 305, 307, 308, + 309, 320, 322, 325, 326, 327, 328, 329, 333, 334, + 0, 0, 304, 306, 310, 311, 312, 313, 314, 316, + 323, 338, 337, 324, 0, 126, 129, 330, 331, 335, + 336, 65, 0, 0, 63, 91, 0, 66, 130, 128, + 25, 64, 131, 127, 225, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 21, 22, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 12, 14, 15, - 19, 24, 26, 28, 29, 30, 31, 32, 36, 37, - 123, 0, 0, 13, 0, 0, 16, 17, 18, 0, - 27, 41, 40, 0, 33, 0, 0, 34, 35, 38, - 39, 123, 0, 0, 0, 0, 0, 103, 105, 106, - 0, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 0, 117, 118, 122, 104, 0, 0, 103, 105, - 106, 0, 107, 108, 109, 0, 111, 112, 113, 114, - 115, 116, 382, 117, 118, 122, 104, 0, 0, 65, - 0, 123, 119, 121, 120, 189, 65, 0, 0, 64, - 0, 381, 189, 0, 0, 0, 64, 0, 0, 0, - 0, 0, 0, 119, 121, 120, 0, 0, 103, 105, - 106, 89, 107, 108, 0, 0, 111, 112, 89, 114, - 115, 116, 180, 117, 118, 122, 104, 90, 0, 65, - 0, 0, 0, 0, 90, 189, 65, 188, 187, 64, - 0, 0, 279, 0, 188, 187, 64, 123, 0, 0, - 0, 0, 0, 119, 121, 120, 0, 0, 0, 0, - 0, 89, 0, 0, 0, 206, 207, 0, 89, 0, - 0, 0, 206, 207, 103, 105, 0, 90, 0, 0, - 0, 0, 0, 0, 90, 114, 115, 188, 187, 117, - 118, 122, 104, 0, 188, 187, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 0, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 0, 0, 0, 13, 0, 0, 16, 17, 18, 0, + 27, 41, 40, 0, 33, 0, 0, 34, 35, 71, + 72, 65, 45, 0, 63, 91, 0, 66, 356, 0, + 25, 64, 0, 0, 0, 355, 0, 67, 0, 359, + 360, 358, 365, 367, 364, 366, 361, 362, 363, 368, + 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 21, 22, 0, 0, 23, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 0, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 0, 0, 0, 13, 0, 0, 16, 17, 18, 0, + 27, 41, 40, 0, 33, 0, 0, 34, 35, 71, + 72, 65, 0, 0, 63, 91, 0, 66, 433, 0, + 25, 64, 0, 0, 0, 0, 0, 67, 0, 359, + 360, 358, 365, 367, 364, 366, 361, 362, 363, 368, + 0, 0, 0, 89, 0, 0, 206, 0, 0, 0, + 0, 21, 22, 65, 0, 23, 0, 0, 0, 193, + 0, 90, 0, 64, 0, 0, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 0, 0, 0, 13, 0, 89, 16, 17, 18, 0, + 27, 41, 40, 0, 33, 20, 91, 34, 35, 71, + 72, 25, 0, 90, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 192, 191, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 21, 22, 65, 0, 23, 0, 0, 0, + 193, 210, 211, 0, 64, 0, 0, 11, 12, 14, + 15, 19, 24, 26, 28, 29, 30, 31, 32, 36, + 37, 0, 0, 0, 13, 0, 89, 16, 17, 18, + 0, 27, 41, 40, 0, 33, 20, 42, 34, 35, + 38, 39, 25, 0, 90, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 192, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 183, 184, 0, 0, 119, - 121, 120, 276, 277, + 0, 0, 0, 21, 22, 0, 0, 23, 0, 0, + 0, 0, 187, 188, 0, 0, 0, 0, 11, 12, + 14, 15, 19, 24, 26, 28, 29, 30, 31, 32, + 36, 37, 125, 0, 0, 13, 0, 0, 16, 17, + 18, 0, 27, 41, 40, 0, 33, 0, 0, 34, + 35, 38, 39, 125, 0, 0, 0, 0, 0, 103, + 105, 106, 0, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 0, 119, 120, 124, 104, + 103, 105, 106, 0, 107, 108, 109, 110, 111, 0, + 113, 114, 115, 116, 117, 118, 0, 119, 120, 124, + 104, 0, 0, 125, 0, 0, 121, 123, 122, 0, + 65, 0, 0, 0, 0, 0, 193, 0, 125, 0, + 64, 0, 0, 0, 0, 0, 0, 121, 123, 122, + 103, 105, 106, 0, 107, 108, 109, 110, 0, 0, + 113, 114, 89, 116, 117, 118, 105, 119, 120, 124, + 104, 65, 0, 0, 0, 0, 0, 285, 116, 117, + 90, 64, 119, 0, 124, 104, 0, 0, 0, 0, + 192, 191, 0, 0, 0, 0, 0, 121, 123, 122, + 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 123, 122, 0, 0, 0, 210, 211, + 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 191, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, + 283, } var yyPact = [...]int16{ - 68, 294, 934, 934, 688, 855, -1000, -1000, -1000, 231, + 68, 238, 954, 954, 702, 873, -1000, -1000, -1000, 226, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 448, -1000, 340, -1000, 996, -1000, -1000, -1000, + -1000, -1000, 388, -1000, 347, -1000, 1018, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 5, 18, 279, -1000, -1000, 776, -1000, 776, 164, - -1000, 228, 215, 288, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1, 18, 193, -1000, -1000, 792, -1000, 792, 225, + -1000, 156, 147, 215, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 445, -1000, -1000, 460, -1000, -1000, 397, 329, -1000, - -1000, 26, -1000, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, 1120, - -1000, -1000, 102, 326, 1077, 1077, 1077, 1077, 1077, 1077, - 279, -58, -1000, 196, 196, 600, -1000, 30, 321, 105, - -15, -1000, 157, 150, 1077, 400, -1000, -1000, 327, 335, - -1000, -1000, 436, -1000, 216, -1000, 214, 516, 776, -1000, - -47, -51, -41, -1000, 776, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 776, 776, -1000, - -1000, -1000, 1127, 272, 268, 264, 5, -1000, -1000, 1077, - -1000, 236, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 269, - 269, 176, -1000, 5, -1000, 1077, 228, 215, 233, 233, - -15, -15, -15, -15, -1000, -1000, -1000, 512, -1000, -1000, - 91, -1000, 996, -1000, -1000, -1000, -1000, 402, -1000, 404, - -1000, 162, -1000, -1000, -1000, -1000, -1000, 155, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 23, 66, 33, -1000, -1000, - -1000, 514, 167, 171, 171, 171, 196, 196, 196, 196, - 105, 105, 1133, 1133, 1133, 1067, 1017, 1133, 1133, 1067, - 105, 105, 1133, 105, 167, -1000, 212, 209, 195, 1077, - -15, 110, 81, 1077, 321, 46, -1000, -1000, -1000, 1070, - -1000, 163, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 366, -1000, -1000, 392, -1000, -1000, 420, 288, -1000, + -1000, 27, -1000, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, 915, -1000, -1000, 243, 834, 1101, 1101, 1101, 1101, + 1101, 1101, 193, -58, -1000, 234, 234, 612, -1000, 31, + 510, 35, -14, -1000, 86, 83, 1101, 367, -1000, -1000, + 50, 185, -1000, -1000, 286, -1000, 210, -1000, 186, 181, + 792, -1000, -49, -70, -44, -1000, 792, 792, 792, 792, + 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, + 792, 792, 792, -1000, -1000, -1000, 1142, 189, 188, 187, + 1, -1000, -1000, 1101, -1000, 167, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 228, 228, 344, -1000, 1, -1000, 1101, + 156, 147, 173, 173, -14, -14, -14, -14, -1000, -1000, + -1000, 522, -1000, -1000, 278, -1000, 1018, -1000, -1000, -1000, + -1000, 574, -1000, 231, -1000, 159, -1000, -1000, -1000, -1000, + -1000, 158, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 24, + 154, 140, -1000, -1000, -1000, 701, 1104, 97, 97, 97, + 234, 234, 234, 234, 35, 35, 165, 165, 165, 165, + 165, 1089, 1039, 165, 165, 1089, 35, 35, 165, 35, + 1104, -1000, 131, 119, 101, 1101, -14, 82, 81, 1101, + 510, 49, -1000, -1000, -1000, 386, -1000, 287, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 776, 1077, -1000, -1000, -1000, -1000, - -1000, -1000, 36, 36, 22, 36, 83, 83, 98, 49, - -1000, -1000, 366, 364, 360, 353, 338, 334, 331, 305, - 303, 301, 299, -1000, 291, -67, -65, -1000, -1000, -1000, - -1000, -1000, 42, 34, 1077, 312, -1000, -1000, 240, -1000, - 112, -1000, -1000, -1000, 424, -1000, 996, 193, -1000, -1000, - -1000, 36, -1000, 19, 17, 599, -1000, -1000, -1000, 77, - 289, 289, 289, 269, 217, 217, 77, 217, 77, -71, - 32, 229, 171, 171, -1000, -1000, 53, -1000, 1077, -1000, - -1000, -1000, -1000, -1000, -1000, 36, 36, -1000, -1000, -1000, - 36, -1000, -1000, -1000, -1000, -1000, -1000, 289, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 29, -1000, - -1000, 1077, 180, -1000, -1000, -1000, 336, -1000, -1000, 147, - -1000, 44, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 792, 1101, -1000, -1000, -1000, -1000, -1000, -1000, 38, 38, + 22, 38, 93, 93, 346, 44, -1000, -1000, 338, 337, + 335, 331, 311, 309, 293, 281, 253, 252, 244, -1000, + 126, -56, -54, -1000, -1000, -1000, -1000, -1000, 46, 42, + 1101, 504, -1000, -1000, 407, -1000, 170, -1000, -1000, -1000, + 432, -1000, 1018, 418, -1000, -1000, -1000, 38, -1000, 21, + 20, 791, -1000, -1000, -1000, 39, 56, 56, 56, 228, + 182, 182, 39, 182, 39, -75, 41, 155, 97, 97, + -1000, -1000, 59, -1000, 1101, -1000, -1000, -1000, -1000, -1000, + -1000, 38, 38, -1000, -1000, -1000, 38, -1000, -1000, -1000, + -1000, -1000, -1000, 56, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 40, -1000, -1000, 1101, 325, -1000, + -1000, -1000, 289, -1000, -1000, 318, -1000, 295, -1000, -1000, + -1000, -1000, -1000, } var yyPgo = [...]int16{ - 0, 539, 12, 536, 7, 16, 533, 431, 22, 529, - 10, 527, 24, 351, 380, 526, 15, 523, 19, 14, - 522, 516, 8, 515, 4, 5, 501, 3, 6, 13, - 500, 26, 2, 485, 484, 23, 208, 482, 481, 479, - 93, 478, 477, 27, 476, 1, 42, 469, 11, 466, - 453, 451, 445, 439, 427, 425, 418, 385, 0, 408, - 9, 396, 395, 388, + 0, 491, 12, 490, 7, 16, 489, 428, 22, 488, + 10, 487, 14, 293, 371, 486, 15, 479, 19, 18, + 478, 475, 8, 474, 4, 5, 471, 3, 6, 13, + 468, 32, 2, 467, 464, 25, 214, 463, 453, 452, + 96, 451, 442, 24, 441, 1, 41, 435, 11, 433, + 430, 426, 415, 402, 397, 396, 389, 345, 0, 385, + 9, 357, 352, 295, } var yyR1 = [...]int8{ @@ -635,32 +642,33 @@ var yyR1 = [...]int8{ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 34, 34, 34, 34, 35, 35, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 36, 39, 39, 52, 52, - 44, 44, 44, 44, 37, 37, 37, 37, 37, 37, - 18, 18, 18, 18, 17, 17, 17, 4, 4, 4, - 45, 45, 41, 43, 43, 42, 42, 42, 53, 60, - 49, 49, 50, 51, 33, 33, 33, 9, 9, 47, - 55, 55, 55, 55, 55, 55, 56, 57, 57, 57, - 46, 46, 46, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 14, 14, 7, 7, 7, 7, 7, + 38, 38, 38, 38, 38, 38, 38, 36, 39, 39, + 52, 52, 44, 44, 44, 44, 37, 37, 37, 37, + 37, 37, 18, 18, 18, 18, 17, 17, 17, 4, + 4, 4, 45, 45, 41, 43, 43, 42, 42, 42, + 53, 60, 49, 49, 50, 51, 33, 33, 33, 9, + 9, 47, 55, 55, 55, 55, 55, 55, 56, 57, + 57, 57, 46, 46, 46, 1, 1, 1, 2, 2, + 2, 2, 2, 2, 2, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 13, 13, 13, 13, - 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, - 63, 21, 21, 21, 21, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 30, 30, 30, 22, 22, 22, - 22, 23, 23, 23, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 25, 25, 26, 26, 26, - 11, 11, 11, 11, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 13, 13, + 13, 13, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 63, 21, 21, 21, 21, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 30, 30, 30, 22, + 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 25, 25, 26, + 26, 26, 11, 11, 11, 11, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 8, 8, 5, 5, 5, 5, - 48, 48, 29, 29, 31, 31, 32, 32, 28, 27, - 27, 54, 10, 19, 19, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 12, 12, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, + 6, 6, 6, 6, 6, 6, 8, 8, 5, 5, + 5, 5, 48, 48, 29, 29, 31, 31, 32, 32, + 28, 27, 27, 54, 10, 19, 19, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 12, 12, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 59, } var yyR2 = [...]int8{ @@ -668,132 +676,135 @@ var yyR2 = [...]int8{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 1, 0, 1, 3, 3, - 1, 1, 3, 3, 1, 3, 3, 3, 5, 5, - 3, 4, 2, 1, 3, 1, 2, 1, 1, 1, - 3, 4, 2, 3, 2, 3, 1, 2, 3, 1, - 3, 3, 2, 2, 3, 5, 3, 1, 1, 4, - 6, 5, 6, 5, 4, 3, 2, 2, 1, 1, - 3, 4, 2, 3, 1, 2, 3, 3, 1, 3, - 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, + 4, 4, 4, 4, 4, 4, 4, 1, 0, 1, + 3, 3, 1, 1, 3, 3, 1, 3, 3, 3, + 5, 5, 3, 4, 2, 1, 3, 1, 2, 1, + 1, 1, 3, 4, 2, 3, 2, 3, 1, 2, + 3, 1, 3, 3, 2, 2, 3, 5, 3, 1, + 1, 4, 6, 5, 6, 5, 4, 3, 2, 2, + 1, 1, 3, 4, 2, 3, 1, 2, 3, 3, + 1, 3, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 4, 2, 0, - 3, 1, 2, 3, 3, 1, 3, 3, 2, 1, - 2, 0, 3, 2, 1, 1, 3, 1, 3, 4, - 1, 3, 5, 5, 1, 1, 1, 4, 3, 3, - 2, 3, 1, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 4, 3, 3, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, + 2, 0, 3, 1, 2, 3, 3, 1, 3, 3, + 2, 1, 2, 0, 3, 2, 1, 1, 3, 1, + 3, 4, 1, 3, 5, 5, 1, 1, 1, 4, + 3, 3, 2, 3, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, - 1, 1, 1, 0, 1, 1, 2, 3, 3, 4, - 4, 6, 7, 4, 1, 1, 1, 1, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 6, 1, 3, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, + 1, 2, 1, 1, 1, 0, 1, 1, 2, 3, + 3, 4, 4, 6, 7, 4, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 6, + 1, 3, } var yyChk = [...]int16{ - -1000, -62, 105, 106, 107, 108, 2, 10, -14, -7, - -13, 62, 63, 79, 64, 65, 82, 83, 84, 66, - 12, 47, 48, 51, 67, 18, 68, 86, 69, 70, - 71, 72, 73, 90, 93, 94, 74, 75, 95, 96, - 88, 87, 13, -63, -14, 10, -40, -34, -38, -41, + -1000, -62, 107, 108, 109, 110, 2, 10, -14, -7, + -13, 64, 65, 81, 66, 67, 84, 85, 86, 68, + 12, 49, 50, 53, 69, 18, 70, 88, 71, 72, + 73, 74, 75, 92, 95, 96, 76, 77, 97, 98, + 90, 89, 13, -63, -14, 10, -40, -34, -38, -41, -47, -48, -49, -50, -51, -53, -54, -55, -56, -57, -33, -58, -3, 12, 19, 9, 15, 25, -8, -7, - -46, 95, 96, -12, -59, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 41, - 57, 13, -57, -13, -15, 20, -16, 12, -10, 2, - 25, -21, 2, 41, 59, 42, 43, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 56, 57, 86, - 88, 87, 58, 14, 41, 57, 53, 42, 52, 56, - -35, -43, 2, 79, 90, 15, -43, -40, -58, -40, - -58, -46, 15, 15, 15, -1, 20, -2, 12, -10, - 2, 20, 7, 2, 4, 2, 4, 24, -36, -37, - -44, -39, -52, 78, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -61, - 2, -48, -8, 95, 96, -12, -58, 68, 67, 15, - -32, -9, 2, -29, -31, 93, 94, 19, 9, 41, - 57, -60, 2, -58, -48, -8, 95, 96, -58, -58, - -58, -58, -58, -58, -43, -35, -18, 15, 2, -18, - -42, 22, -40, 22, 22, 22, 22, -58, 20, 7, - 2, -5, 2, 4, 54, 44, 55, -5, 20, -16, - 25, 2, 25, 2, -20, 5, -30, -22, 12, -29, - -31, 16, -40, 82, 83, 84, 85, 89, 80, 81, + -46, 97, 98, -12, -59, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 41, + 59, 13, -57, -13, -15, 20, -16, 12, -10, 2, + 25, -21, 2, 41, 61, 42, 43, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 58, + 59, 88, 90, 89, 60, 14, 41, 59, 55, 42, + 54, 58, -35, -43, 2, 81, 92, 15, -43, -40, + -58, -40, -58, -46, 15, 15, 15, -1, 20, -2, + 12, -10, 2, 20, 7, 2, 4, 2, 4, 24, + -36, -37, -44, -39, -52, 80, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -61, 2, -48, -8, 97, 98, -12, + -58, 70, 69, 15, -32, -9, 2, -29, -31, 95, + 96, 19, 9, 41, 59, -60, 2, -58, -48, -8, + 97, 98, -58, -58, -58, -58, -58, -58, -43, -35, + -18, 15, 2, -18, -42, 22, -40, 22, 22, 22, + 22, -58, 20, 7, 2, -5, 2, 4, 56, 44, + 57, -5, 20, -16, 25, 2, 25, 2, -20, 5, + -30, -22, 12, -29, -31, 16, -40, 84, 85, 86, + 87, 91, 82, 83, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -48, 95, 96, -12, 15, - -58, 15, 15, 15, -58, 15, -29, -29, 21, 6, - 2, -17, 22, -4, -6, 25, 2, 62, 78, 63, - 79, 64, 65, 66, 80, 81, 82, 83, 84, 12, - 85, 47, 48, 51, 67, 18, 68, 86, 89, 69, - 70, 71, 72, 73, 93, 94, 59, 74, 75, 95, - 96, 88, 87, 22, 7, 7, 20, -2, 25, 2, - 25, 2, 26, 26, -31, 26, 41, 57, -23, 24, - 17, -24, 30, 28, 29, 35, 36, 37, 33, 31, - 34, 32, 38, -45, 15, -45, -45, -18, -18, -19, - -18, -19, 15, 15, 15, -58, 22, 22, -58, 22, - -60, 21, 2, 22, 7, 2, -40, -58, -28, 19, - -28, 26, -28, -22, -22, 24, 17, 2, 17, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - -48, -8, 84, 83, 22, 22, -58, 22, 7, 21, - 2, 22, -4, 22, -28, 26, 26, 17, -24, -27, - 57, -28, -32, -32, -32, -29, -25, 14, -25, -27, - -25, -27, -11, 99, 100, 101, 102, 22, -48, -45, - -45, 7, -58, -28, -28, -28, -26, -32, 22, -58, - 22, 24, 21, 2, 22, 21, -32, + -40, -48, 97, 98, -12, 15, -58, 15, 15, 15, + -58, 15, -29, -29, 21, 6, 2, -17, 22, -4, + -6, 25, 2, 64, 80, 65, 81, 66, 67, 68, + 82, 83, 84, 85, 86, 12, 87, 49, 50, 53, + 69, 18, 70, 88, 91, 71, 72, 73, 74, 75, + 95, 96, 61, 76, 77, 97, 98, 90, 89, 22, + 7, 7, 20, -2, 25, 2, 25, 2, 26, 26, + -31, 26, 41, 59, -23, 24, 17, -24, 30, 28, + 29, 35, 36, 37, 33, 31, 34, 32, 38, -45, + 15, -45, -45, -18, -18, -19, -18, -19, 15, 15, + 15, -58, 22, 22, -58, 22, -60, 21, 2, 22, + 7, 2, -40, -58, -28, 19, -28, 26, -28, -22, + -22, 24, 17, 2, 17, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, -48, -8, 86, 85, + 22, 22, -58, 22, 7, 21, 2, 22, -4, 22, + -28, 26, 26, 17, -24, -27, 59, -28, -32, -32, + -32, -29, -25, 14, -25, -27, -25, -27, -11, 101, + 102, 103, 104, 22, -48, -45, -45, 7, -58, -28, + -28, -28, -26, -32, 22, -58, 22, 24, 21, 2, + 22, 21, -32, } var yyDef = [...]int16{ - 0, -2, 149, 149, 0, 0, 7, 6, 1, 149, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 0, 2, -2, 3, 4, 8, 9, 10, + 0, -2, 151, 151, 0, 0, 7, 6, 1, 151, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 0, 2, -2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 124, 260, 261, 0, 271, 0, 98, - 99, 142, 143, 0, 298, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, 254, - 255, 0, 5, 113, 0, 148, 151, 0, 155, 159, - 272, 160, 164, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, - 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 26, 0, 0, 0, 72, 0, 22, 96, - -2, 97, 0, 0, 0, 0, 102, 104, 0, 108, - 112, 146, 0, 152, 0, 158, 0, 163, 0, 45, - 54, 50, 51, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, - 81, 275, 0, 0, 0, 0, 284, 285, 286, 0, - 84, 0, 86, 266, 267, 87, 88, 262, 263, 0, - 0, 0, 95, 79, 287, 0, 0, 0, 289, 290, - 291, 292, 293, 294, 23, 24, 27, 0, 63, 28, - 0, 74, 76, 78, 299, 295, 296, 0, 100, 0, - 105, 0, 111, 256, 257, 258, 259, 0, 147, 150, - 153, 156, 154, 157, 162, 165, 167, 170, 174, 175, - 176, 0, 29, 0, 0, 0, 0, 0, -2, -2, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 276, 0, 0, 0, 0, - 288, 0, 0, 0, 0, 0, 264, 265, 89, 0, - 94, 0, 62, 65, 67, 68, 69, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 73, 77, 0, 101, 103, 106, 110, - 107, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 180, 182, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 0, 56, 57, 48, 49, 52, - 274, 53, 0, 0, 0, 0, 277, 278, 0, 85, - 0, 91, 93, 60, 0, 66, 75, 0, 166, 268, - 168, 0, 171, 0, 0, 0, 178, 183, 179, 0, + 21, 22, 0, 126, 262, 263, 0, 273, 0, 100, + 101, 144, 145, 0, 300, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, 256, + 257, 0, 5, 115, 0, 150, 153, 0, 157, 161, + 274, 162, 166, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 84, 85, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 25, 26, 0, 0, 0, 74, 0, + 22, 98, -2, 99, 0, 0, 0, 0, 104, 106, + 0, 110, 114, 148, 0, 154, 0, 160, 0, 165, + 0, 47, 56, 52, 53, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 280, 0, 283, 0, 90, - 92, 61, 64, 297, 169, 0, 0, 177, 181, 184, - 0, 270, 185, 186, 187, 188, 189, 0, 190, 191, - 192, 193, 194, 200, 201, 202, 203, 70, 0, 58, - 59, 0, 0, 172, 173, 269, 0, 198, 71, 0, - 281, 0, 196, 199, 282, 195, 197, + 0, 0, 0, 82, 83, 277, 0, 0, 0, 0, + 286, 287, 288, 0, 86, 0, 88, 268, 269, 89, + 90, 264, 265, 0, 0, 0, 97, 81, 289, 0, + 0, 0, 291, 292, 293, 294, 295, 296, 23, 24, + 27, 0, 65, 28, 0, 76, 78, 80, 301, 297, + 298, 0, 102, 0, 107, 0, 113, 258, 259, 260, + 261, 0, 149, 152, 155, 158, 156, 159, 164, 167, + 169, 172, 176, 177, 178, 0, 29, 0, 0, 0, + 0, 0, -2, -2, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 278, 0, 0, 0, 0, 290, 0, 0, 0, + 0, 0, 266, 267, 91, 0, 96, 0, 64, 67, + 69, 70, 71, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 75, + 79, 0, 103, 105, 108, 112, 109, 111, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 58, 59, 50, 51, 54, 276, 55, 0, 0, + 0, 0, 279, 280, 0, 87, 0, 93, 95, 62, + 0, 68, 77, 0, 168, 270, 170, 0, 173, 0, + 0, 0, 180, 185, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 282, 0, 285, 0, 92, 94, 63, 66, 299, + 171, 0, 0, 179, 183, 186, 0, 272, 187, 188, + 189, 190, 191, 0, 192, 193, 194, 195, 196, 202, + 203, 204, 205, 72, 0, 60, 61, 0, 0, 174, + 175, 271, 0, 200, 73, 0, 283, 0, 198, 201, + 284, 197, 199, } var yyTok1 = [...]int8{ @@ -811,7 +822,7 @@ var yyTok2 = [...]int8{ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, } var yyTok3 = [...]int8{ @@ -1294,14 +1305,24 @@ yydefault: { yyVAL.node = yylex.(*parser).newBinaryExpression(yyDollar[1].node, yyDollar[2].item, yyDollar[3].node, yyDollar[4].node) } + case 45: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.node = yylex.(*parser).newBinaryExpression(yyDollar[1].node, yyDollar[2].item, yyDollar[3].node, yyDollar[4].node) + } case 46: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.node = yylex.(*parser).newBinaryExpression(yyDollar[1].node, yyDollar[2].item, yyDollar[3].node, yyDollar[4].node) + } + case 48: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.node = &BinaryExpr{ VectorMatching: &VectorMatching{Card: CardOneToOne}, } } - case 47: + case 49: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.node = &BinaryExpr{ @@ -1309,56 +1330,56 @@ yydefault: ReturnBool: true, } } - case 48: + case 50: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[1].node yyVAL.node.(*BinaryExpr).VectorMatching.MatchingLabels = yyDollar[3].strings } - case 49: + case 51: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[1].node yyVAL.node.(*BinaryExpr).VectorMatching.MatchingLabels = yyDollar[3].strings yyVAL.node.(*BinaryExpr).VectorMatching.On = true } - case 52: + case 54: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[1].node yyVAL.node.(*BinaryExpr).VectorMatching.Card = CardManyToOne yyVAL.node.(*BinaryExpr).VectorMatching.Include = yyDollar[3].strings } - case 53: + case 55: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[1].node yyVAL.node.(*BinaryExpr).VectorMatching.Card = CardOneToMany yyVAL.node.(*BinaryExpr).VectorMatching.Include = yyDollar[3].strings } - case 55: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.node = yyDollar[1].node - fill := yyDollar[3].node.(*NumberLiteral).Val - yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.LHS = &fill - yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.RHS = &fill - } - case 56: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.node = yyDollar[1].node - fill := yyDollar[3].node.(*NumberLiteral).Val - yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.LHS = &fill - } case 57: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[1].node fill := yyDollar[3].node.(*NumberLiteral).Val + yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.LHS = &fill yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.RHS = &fill } case 58: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.node = yyDollar[1].node + fill := yyDollar[3].node.(*NumberLiteral).Val + yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.LHS = &fill + } + case 59: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.node = yyDollar[1].node + fill := yyDollar[3].node.(*NumberLiteral).Val + yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.RHS = &fill + } + case 60: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.node = yyDollar[1].node @@ -1367,7 +1388,7 @@ yydefault: yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.LHS = &fill_left yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.RHS = &fill_right } - case 59: + case 61: yyDollar = yyS[yypt-5 : yypt+1] { fill_right := yyDollar[3].node.(*NumberLiteral).Val @@ -1375,44 +1396,44 @@ yydefault: yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.LHS = &fill_left yyVAL.node.(*BinaryExpr).VectorMatching.FillValues.RHS = &fill_right } - case 60: + case 62: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.strings = yyDollar[2].strings } - case 61: + case 63: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.strings = yyDollar[2].strings } - case 62: + case 64: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.strings = []string{} } - case 63: + case 65: yyDollar = yyS[yypt-1 : yypt+1] { yylex.(*parser).unexpected("grouping opts", "\"(\"") yyVAL.strings = nil } - case 64: + case 66: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.strings = append(yyDollar[1].strings, yyDollar[3].item.Val) } - case 65: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.strings = []string{yyDollar[1].item.Val} } - case 66: + case 68: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).unexpected("grouping opts", "\",\" or \")\"") yyVAL.strings = yyDollar[1].strings } - case 67: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { if !model.UTF8Validation.IsValidLabelName(yyDollar[1].item.Val) { @@ -1420,7 +1441,7 @@ yydefault: } yyVAL.item = yyDollar[1].item } - case 68: + case 70: yyDollar = yyS[yypt-1 : yypt+1] { unquoted := yylex.(*parser).unquoteString(yyDollar[1].item.Val) @@ -1431,18 +1452,18 @@ yydefault: yyVAL.item.Pos++ yyVAL.item.Val = unquoted } - case 69: + case 71: yyDollar = yyS[yypt-1 : yypt+1] { yylex.(*parser).unexpected("grouping opts", "label") yyVAL.item = Item{} } - case 70: + case 72: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[2].node.(*NumberLiteral) } - case 71: + case 73: yyDollar = yyS[yypt-4 : yypt+1] { nl := yyDollar[3].node.(*NumberLiteral) @@ -1452,7 +1473,7 @@ yydefault: nl.PosRange.Start = yyDollar[2].item.Pos yyVAL.node = nl } - case 72: + case 74: yyDollar = yyS[yypt-2 : yypt+1] { fn, exist := getFunction(yyDollar[1].item.Val, yylex.(*parser).functions) @@ -1471,38 +1492,38 @@ yydefault: }, } } - case 73: + case 75: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = yyDollar[2].node } - case 74: + case 76: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.node = Expressions{} } - case 75: + case 77: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = append(yyDollar[1].node.(Expressions), yyDollar[3].node.(Expr)) } - case 76: + case 78: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.node = Expressions{yyDollar[1].node.(Expr)} } - case 77: + case 79: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).addParseErrf(yyDollar[2].item.PositionRange(), "trailing commas not allowed in function call args") yyVAL.node = yyDollar[1].node } - case 78: + case 80: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = &ParenExpr{Expr: yyDollar[2].node.(Expr), PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[3].item)} } - case 79: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { if numLit, ok := yyDollar[1].node.(*NumberLiteral); ok { @@ -1516,7 +1537,7 @@ yydefault: } yyVAL.node = yyDollar[1].node } - case 80: + case 82: yyDollar = yyS[yypt-3 : yypt+1] { if numLit, ok := yyDollar[3].node.(*NumberLiteral); ok { @@ -1527,41 +1548,41 @@ yydefault: yylex.(*parser).addOffsetExpr(yyDollar[1].node, yyDollar[3].node.(*DurationExpr)) yyVAL.node = yyDollar[1].node } - case 81: + case 83: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).unexpected("offset", "number, duration, step(), or range()") yyVAL.node = yyDollar[1].node } - case 82: + case 84: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).setAnchored(yyDollar[1].node) } - case 83: + case 85: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).setSmoothed(yyDollar[1].node) } - case 84: + case 86: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).setTimestamp(yyDollar[1].node, yyDollar[3].float) yyVAL.node = yyDollar[1].node } - case 85: + case 87: yyDollar = yyS[yypt-5 : yypt+1] { yylex.(*parser).setAtModifierPreprocessor(yyDollar[1].node, yyDollar[3].item) yyVAL.node = yyDollar[1].node } - case 86: + case 88: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).unexpected("@", "timestamp") yyVAL.node = yyDollar[1].node } - case 89: + case 91: yyDollar = yyS[yypt-4 : yypt+1] { var errMsg string @@ -1591,7 +1612,7 @@ yydefault: EndPos: yylex.(*parser).lastClosing, } } - case 90: + case 92: yyDollar = yyS[yypt-6 : yypt+1] { var rangeNl time.Duration @@ -1613,7 +1634,7 @@ yydefault: EndPos: yyDollar[6].item.Pos + 1, } } - case 91: + case 93: yyDollar = yyS[yypt-5 : yypt+1] { var rangeNl time.Duration @@ -1628,31 +1649,31 @@ yydefault: EndPos: yyDollar[5].item.Pos + 1, } } - case 92: + case 94: yyDollar = yyS[yypt-6 : yypt+1] { yylex.(*parser).unexpected("subquery selector", "\"]\"") yyVAL.node = yyDollar[1].node } - case 93: + case 95: yyDollar = yyS[yypt-5 : yypt+1] { yylex.(*parser).unexpected("subquery selector", "number, duration, step(), range(), or \"]\"") yyVAL.node = yyDollar[1].node } - case 94: + case 96: yyDollar = yyS[yypt-4 : yypt+1] { yylex.(*parser).unexpected("subquery or range", "\":\" or \"]\"") yyVAL.node = yyDollar[1].node } - case 95: + case 97: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).unexpected("subquery or range selector", "number, duration, step(), or range()") yyVAL.node = yyDollar[1].node } - case 96: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { if nl, ok := yyDollar[2].node.(*NumberLiteral); ok { @@ -1665,7 +1686,7 @@ yydefault: yyVAL.node = &UnaryExpr{Op: yyDollar[1].item.Typ, Expr: yyDollar[2].node.(Expr), StartPos: yyDollar[1].item.Pos} } } - case 97: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { vs := yyDollar[2].node.(*VectorSelector) @@ -1674,7 +1695,7 @@ yydefault: yylex.(*parser).assembleVectorSelector(vs) yyVAL.node = vs } - case 98: + case 100: yyDollar = yyS[yypt-1 : yypt+1] { vs := &VectorSelector{ @@ -1685,14 +1706,14 @@ yydefault: yylex.(*parser).assembleVectorSelector(vs) yyVAL.node = vs } - case 99: + case 101: yyDollar = yyS[yypt-1 : yypt+1] { vs := yyDollar[1].node.(*VectorSelector) yylex.(*parser).assembleVectorSelector(vs) yyVAL.node = vs } - case 100: + case 102: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = &VectorSelector{ @@ -1700,7 +1721,7 @@ yydefault: PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[3].item), } } - case 101: + case 103: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.node = &VectorSelector{ @@ -1708,7 +1729,7 @@ yydefault: PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[4].item), } } - case 102: + case 104: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.node = &VectorSelector{ @@ -1716,7 +1737,7 @@ yydefault: PosRange: mergeRanges(&yyDollar[1].item, &yyDollar[2].item), } } - case 103: + case 105: yyDollar = yyS[yypt-3 : yypt+1] { if yyDollar[1].matchers != nil { @@ -1725,144 +1746,144 @@ yydefault: yyVAL.matchers = yyDollar[1].matchers } } - case 104: + case 106: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.matchers = []*labels.Matcher{yyDollar[1].matcher} } - case 105: + case 107: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).unexpected("label matching", "\",\" or \"}\"") yyVAL.matchers = yyDollar[1].matchers } - case 106: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item) - } - case 107: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item) - } case 108: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.matcher = yylex.(*parser).newMetricNameMatcher(yyDollar[1].item) + yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item) } case 109: yyDollar = yyS[yypt-3 : yypt+1] { - yylex.(*parser).unexpected("label matching", "string") - yyVAL.matcher = nil + yyVAL.matcher = yylex.(*parser).newLabelMatcher(yyDollar[1].item, yyDollar[2].item, yyDollar[3].item) } case 110: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.matcher = yylex.(*parser).newMetricNameMatcher(yyDollar[1].item) + } + case 111: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).unexpected("label matching", "string") yyVAL.matcher = nil } - case 111: + case 112: + yyDollar = yyS[yypt-3 : yypt+1] + { + yylex.(*parser).unexpected("label matching", "string") + yyVAL.matcher = nil + } + case 113: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).unexpected("label matching", "label matching operator") yyVAL.matcher = nil } - case 112: + case 114: yyDollar = yyS[yypt-1 : yypt+1] { yylex.(*parser).unexpected("label matching", "identifier or \"}\"") yyVAL.matcher = nil } - case 113: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { b := labels.NewBuilder(yyDollar[2].labels) b.Set(labels.MetricName, yyDollar[1].item.Val) yyVAL.labels = b.Labels() } - case 114: + case 116: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.labels = yyDollar[1].labels } - case 146: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.labels = labels.New(yyDollar[2].lblList...) } - case 147: + case 149: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.labels = labels.New(yyDollar[2].lblList...) } - case 148: + case 150: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.labels = labels.New() } - case 149: + case 151: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.labels = labels.New() } - case 150: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.lblList = append(yyDollar[1].lblList, yyDollar[3].label) } - case 151: + case 153: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.lblList = []labels.Label{yyDollar[1].label} } - case 152: + case 154: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).unexpected("label set", "\",\" or \"}\"") yyVAL.lblList = yyDollar[1].lblList } - case 153: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)} - } - case 154: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)} - } case 155: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.label = labels.Label{Name: labels.MetricName, Value: yyDollar[1].item.Val} + yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)} } case 156: yyDollar = yyS[yypt-3 : yypt+1] { - yylex.(*parser).unexpected("label set", "string") - yyVAL.label = labels.Label{} + yyVAL.label = labels.Label{Name: yyDollar[1].item.Val, Value: yylex.(*parser).unquoteString(yyDollar[3].item.Val)} } case 157: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.label = labels.Label{Name: labels.MetricName, Value: yyDollar[1].item.Val} + } + case 158: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).unexpected("label set", "string") yyVAL.label = labels.Label{} } - case 158: + case 159: + yyDollar = yyS[yypt-3 : yypt+1] + { + yylex.(*parser).unexpected("label set", "string") + yyVAL.label = labels.Label{} + } + case 160: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).unexpected("label set", "\"=\"") yyVAL.label = labels.Label{} } - case 159: + case 161: yyDollar = yyS[yypt-1 : yypt+1] { yylex.(*parser).unexpected("label set", "identifier or \"}\"") yyVAL.label = labels.Label{} } - case 160: + case 162: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).generatedParserResult = &seriesDescription{ @@ -1870,33 +1891,33 @@ yydefault: values: yyDollar[2].series, } } - case 161: + case 163: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.series = []SequenceValue{} } - case 162: + case 164: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.series = append(yyDollar[1].series, yyDollar[3].series...) } - case 163: + case 165: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.series = yyDollar[1].series } - case 164: + case 166: yyDollar = yyS[yypt-1 : yypt+1] { yylex.(*parser).unexpected("series values", "") yyVAL.series = nil } - case 165: + case 167: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.series = []SequenceValue{{Omitted: true}} } - case 166: + case 168: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.series = []SequenceValue{} @@ -1904,12 +1925,12 @@ yydefault: yyVAL.series = append(yyVAL.series, SequenceValue{Omitted: true}) } } - case 167: + case 169: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.series = []SequenceValue{{Value: yyDollar[1].float}} } - case 168: + case 170: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.series = []SequenceValue{} @@ -1918,7 +1939,7 @@ yydefault: yyVAL.series = append(yyVAL.series, SequenceValue{Value: yyDollar[1].float}) } } - case 169: + case 171: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.series = []SequenceValue{} @@ -1928,12 +1949,12 @@ yydefault: yyDollar[1].float += yyDollar[2].float } } - case 170: + case 172: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.series = []SequenceValue{{Histogram: yyDollar[1].histogram}} } - case 171: + case 173: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.series = []SequenceValue{} @@ -1943,7 +1964,7 @@ yydefault: //$1 += $2 } } - case 172: + case 174: yyDollar = yyS[yypt-5 : yypt+1] { val, err := yylex.(*parser).histogramsIncreaseSeries(yyDollar[1].histogram, yyDollar[3].histogram, yyDollar[5].uint) @@ -1952,7 +1973,7 @@ yydefault: } yyVAL.series = val } - case 173: + case 175: yyDollar = yyS[yypt-5 : yypt+1] { val, err := yylex.(*parser).histogramsDecreaseSeries(yyDollar[1].histogram, yyDollar[3].histogram, yyDollar[5].uint) @@ -1961,7 +1982,7 @@ yydefault: } yyVAL.series = val } - case 174: + case 176: yyDollar = yyS[yypt-1 : yypt+1] { if yyDollar[1].item.Val != "stale" { @@ -1969,130 +1990,130 @@ yydefault: } yyVAL.float = math.Float64frombits(value.StaleNaN) } - case 177: + case 179: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&yyDollar[2].descriptors) } - case 178: + case 180: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&yyDollar[2].descriptors) } - case 179: + case 181: yyDollar = yyS[yypt-3 : yypt+1] { m := yylex.(*parser).newMap() yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&m) } - case 180: + case 182: yyDollar = yyS[yypt-2 : yypt+1] { m := yylex.(*parser).newMap() yyVAL.histogram = yylex.(*parser).buildHistogramFromMap(&m) } - case 181: + case 183: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = *(yylex.(*parser).mergeMaps(&yyDollar[1].descriptors, &yyDollar[3].descriptors)) } - case 182: + case 184: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.descriptors = yyDollar[1].descriptors } - case 183: + case 185: yyDollar = yyS[yypt-2 : yypt+1] { yylex.(*parser).unexpected("histogram description", "histogram description key, e.g. buckets:[5 10 7]") } - case 184: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["schema"] = yyDollar[3].int - } - case 185: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["sum"] = yyDollar[3].float - } case 186: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["count"] = yyDollar[3].float + yyVAL.descriptors["schema"] = yyDollar[3].int } case 187: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["z_bucket"] = yyDollar[3].float + yyVAL.descriptors["sum"] = yyDollar[3].float } case 188: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["z_bucket_w"] = yyDollar[3].float + yyVAL.descriptors["count"] = yyDollar[3].float } case 189: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["custom_values"] = yyDollar[3].bucket_set + yyVAL.descriptors["z_bucket"] = yyDollar[3].float } case 190: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["buckets"] = yyDollar[3].bucket_set + yyVAL.descriptors["z_bucket_w"] = yyDollar[3].float } case 191: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["offset"] = yyDollar[3].int + yyVAL.descriptors["custom_values"] = yyDollar[3].bucket_set } case 192: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["n_buckets"] = yyDollar[3].bucket_set + yyVAL.descriptors["buckets"] = yyDollar[3].bucket_set } case 193: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["n_offset"] = yyDollar[3].int + yyVAL.descriptors["offset"] = yyDollar[3].int } case 194: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.descriptors = yylex.(*parser).newMap() - yyVAL.descriptors["counter_reset_hint"] = yyDollar[3].item + yyVAL.descriptors["n_buckets"] = yyDollar[3].bucket_set } case 195: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.bucket_set = yyDollar[2].bucket_set + yyVAL.descriptors = yylex.(*parser).newMap() + yyVAL.descriptors["n_offset"] = yyDollar[3].int } case 196: yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.bucket_set = yyDollar[2].bucket_set + yyVAL.descriptors = yylex.(*parser).newMap() + yyVAL.descriptors["counter_reset_hint"] = yyDollar[3].item } case 197: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.bucket_set = yyDollar[2].bucket_set + } + case 198: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.bucket_set = yyDollar[2].bucket_set + } + case 199: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.bucket_set = append(yyDollar[1].bucket_set, yyDollar[3].float) } - case 198: + case 200: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.bucket_set = []float64{yyDollar[1].float} } - case 260: + case 262: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.node = &NumberLiteral{ @@ -2100,7 +2121,7 @@ yydefault: PosRange: yyDollar[1].item.PositionRange(), } } - case 261: + case 263: yyDollar = yyS[yypt-1 : yypt+1] { var err error @@ -2115,12 +2136,12 @@ yydefault: Duration: true, } } - case 262: + case 264: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.float = yylex.(*parser).number(yyDollar[1].item.Val) } - case 263: + case 265: yyDollar = yyS[yypt-1 : yypt+1] { var err error @@ -2131,17 +2152,17 @@ yydefault: } yyVAL.float = dur.Seconds() } - case 264: + case 266: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.float = yyDollar[2].float } - case 265: + case 267: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.float = -yyDollar[2].float } - case 268: + case 270: yyDollar = yyS[yypt-1 : yypt+1] { var err error @@ -2150,17 +2171,17 @@ yydefault: yylex.(*parser).addParseErrf(yyDollar[1].item.PositionRange(), "invalid repetition in series values: %s", err) } } - case 269: + case 271: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.int = -int64(yyDollar[2].uint) } - case 270: + case 272: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.int = int64(yyDollar[1].uint) } - case 271: + case 273: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.node = &StringLiteral{ @@ -2168,7 +2189,7 @@ yydefault: PosRange: yyDollar[1].item.PositionRange(), } } - case 272: + case 274: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.item = Item{ @@ -2177,12 +2198,12 @@ yydefault: Val: yylex.(*parser).unquoteString(yyDollar[1].item.Val), } } - case 273: + case 275: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.strings = nil } - case 275: + case 277: yyDollar = yyS[yypt-1 : yypt+1] { nl := yyDollar[1].node.(*NumberLiteral) @@ -2193,7 +2214,7 @@ yydefault: } yyVAL.node = nl } - case 276: + case 278: yyDollar = yyS[yypt-2 : yypt+1] { nl := yyDollar[2].node.(*NumberLiteral) @@ -2208,7 +2229,7 @@ yydefault: nl.PosRange.Start = yyDollar[1].item.Pos yyVAL.node = nl } - case 277: + case 279: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2217,7 +2238,7 @@ yydefault: EndPos: yyDollar[3].item.PositionRange().End, } } - case 278: + case 280: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2226,7 +2247,7 @@ yydefault: EndPos: yyDollar[3].item.PositionRange().End, } } - case 279: + case 281: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2239,7 +2260,7 @@ yydefault: StartPos: yyDollar[1].item.Pos, } } - case 280: + case 282: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2252,7 +2273,7 @@ yydefault: StartPos: yyDollar[1].item.Pos, } } - case 281: + case 283: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2263,7 +2284,7 @@ yydefault: RHS: yyDollar[5].node.(Expr), } } - case 282: + case 284: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2279,7 +2300,7 @@ yydefault: }, } } - case 283: + case 285: yyDollar = yyS[yypt-4 : yypt+1] { de := yyDollar[3].node.(*DurationExpr) @@ -2294,7 +2315,7 @@ yydefault: } yyVAL.node = yyDollar[3].node } - case 287: + case 289: yyDollar = yyS[yypt-1 : yypt+1] { nl := yyDollar[1].node.(*NumberLiteral) @@ -2305,7 +2326,7 @@ yydefault: } yyVAL.node = nl } - case 288: + case 290: yyDollar = yyS[yypt-2 : yypt+1] { switch expr := yyDollar[2].node.(type) { @@ -2338,25 +2359,25 @@ yydefault: break } } - case 289: + case 291: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr)) yyVAL.node = &DurationExpr{Op: ADD, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)} } - case 290: + case 292: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr)) yyVAL.node = &DurationExpr{Op: SUB, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)} } - case 291: + case 293: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr)) yyVAL.node = &DurationExpr{Op: MUL, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)} } - case 292: + case 294: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr)) @@ -2367,7 +2388,7 @@ yydefault: } yyVAL.node = &DurationExpr{Op: DIV, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)} } - case 293: + case 295: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr)) @@ -2378,13 +2399,13 @@ yydefault: } yyVAL.node = &DurationExpr{Op: MOD, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)} } - case 294: + case 296: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[1].node.(Expr)) yyVAL.node = &DurationExpr{Op: POW, LHS: yyDollar[1].node.(Expr), RHS: yyDollar[3].node.(Expr)} } - case 295: + case 297: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2393,7 +2414,7 @@ yydefault: EndPos: yyDollar[3].item.PositionRange().End, } } - case 296: + case 298: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2402,7 +2423,7 @@ yydefault: EndPos: yyDollar[3].item.PositionRange().End, } } - case 297: + case 299: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.node = &DurationExpr{ @@ -2413,7 +2434,7 @@ yydefault: RHS: yyDollar[5].node.(Expr), } } - case 299: + case 301: yyDollar = yyS[yypt-3 : yypt+1] { yylex.(*parser).experimentalDurationExpr(yyDollar[2].node.(Expr)) diff --git a/promql/parser/lex.go b/promql/parser/lex.go index 7149985767..8aa9e9dcbe 100644 --- a/promql/parser/lex.go +++ b/promql/parser/lex.go @@ -189,21 +189,23 @@ var ItemTypeStr = map[ItemType]string{ TIMES: "x", SPACE: "", - SUB: "-", - ADD: "+", - MUL: "*", - MOD: "%", - DIV: "/", - EQLC: "==", - NEQ: "!=", - LTE: "<=", - LSS: "<", - GTE: ">=", - GTR: ">", - EQL_REGEX: "=~", - NEQ_REGEX: "!~", - POW: "^", - AT: "@", + SUB: "-", + ADD: "+", + MUL: "*", + MOD: "%", + DIV: "/", + EQLC: "==", + NEQ: "!=", + LTE: "<=", + LSS: "<", + GTE: ">=", + GTR: ">", + TRIM_UPPER: "/", + EQL_REGEX: "=~", + NEQ_REGEX: "!~", + POW: "^", + AT: "@", } func init() { @@ -446,6 +448,9 @@ func lexStatements(l *Lexer) stateFn { if t := l.peek(); t == '=' { l.next() l.emit(LTE) + } else if t := l.peek(); t == '/' { + l.next() + l.emit(TRIM_UPPER) } else { l.emit(LSS) } @@ -453,6 +458,9 @@ func lexStatements(l *Lexer) stateFn { if t := l.peek(); t == '=' { l.next() l.emit(GTE) + } else if t := l.peek(); t == '/' { + l.next() + l.emit(TRIM_LOWER) } else { l.emit(GTR) } diff --git a/promql/promqltest/testdata/native_histograms.test b/promql/promqltest/testdata/native_histograms.test index fd4b1f4178..57219c8981 100644 --- a/promql/promqltest/testdata/native_histograms.test +++ b/promql/promqltest/testdata/native_histograms.test @@ -1872,3 +1872,58 @@ eval instant at 1m irate(nhcb_add_bucket[2m]) * 60 expect no_warn expect no_info {} {{schema:-53 sum:56 count:15 custom_values:[2 3 4 6] buckets:[1 0 1 5 8] counter_reset_hint:gauge}} + +# Test native histogram with trim operators ("/": TRIM_LOWER) +load 1m + h_test {{schema:0 sum:123.75 count:34 z_bucket:1 z_bucket_w:0.001 buckets:[2 4 8 16] n_buckets:[1 2]}} + h_test_2 {{schema:2 sum:12.8286080906 count:28 z_bucket:1 z_bucket_w:0.001 buckets:[1 2 4 7 3] n_buckets:[1 5 3 1]}} + cbh {{schema:-53 sum:172.5 count:15 custom_values:[5 10 15 20] buckets:[1 6 4 3 1]}} + zero_bucket {{schema:0 sum:-6.75 z_bucket:5 z_bucket_w:0.01 buckets:[2 3] n_buckets:[1 2 3]}} + +# Native Histogram: Exponential Bucket Interpolation Tests +eval instant at 1m h_test_2 / 1.13 +{__name__="h_test_2"} {{schema:2 count:14.589417818876296 sum:-1.5258511531197865 z_bucket_w:0.001 offset:1 buckets:[0.589417818876296 4 7 3]}} + +eval instant at 1m h_test_2 >/ -1.3 +{__name__="h_test_2"} {{schema:2 count:25.54213947904476 sum:13.099057472672072 z_bucket:1 z_bucket_w:0.001 buckets:[1 2 4 7 3] n_buckets:[1 5 1.54213947904476]}} + +eval instant at 1m h_test_2 / 2 +{__name__="h_test"} {{count:24 sum:113.14339828220179 z_bucket_w:0.001 offset:2 buckets:[8 16]}} + +eval instant at 1m h_test >/ -1 +{__name__="h_test"} {{count:32 sum:120.92157287525382 z_bucket:1 z_bucket_w:0.001 buckets:[2 4 8 16] n_buckets:[1]}} + +eval instant at 1m h_test / 13 +{__name__="cbh"} {{schema:-53 count:5.6 sum:92.5 custom_values:[5 10 15 20] offset:2 buckets:[1.6 3 1]}} + +eval instant at 1m cbh / 15 +{__name__="cbh"} {{schema:-53 count:4 sum:72.5 custom_values:[5 10 15 20] offset:3 buckets:[3 1]}} + +# Zero Bucket Edge Case: Interpolation Around Zero +eval instant at 1m zero_bucket / 0 +{__name__="zero_bucket"} {{count:7.5 sum:-18.77081528017131 z_bucket:2.5 z_bucket_w:0.01 buckets:[2 3]}} + +clear diff --git a/web/ui/mantine-ui/src/promql/ast.ts b/web/ui/mantine-ui/src/promql/ast.ts index 9f8c5cb102..f301b0a5c2 100644 --- a/web/ui/mantine-ui/src/promql/ast.ts +++ b/web/ui/mantine-ui/src/promql/ast.ts @@ -40,6 +40,8 @@ export enum binaryOperatorType { neq = "!=", gtr = ">", lss = "<", + trimUpper = "/", gte = ">=", lte = "<=", and = "and", diff --git a/web/ui/mantine-ui/src/promql/utils.ts b/web/ui/mantine-ui/src/promql/utils.ts index 2addeed8ab..54d4e97555 100644 --- a/web/ui/mantine-ui/src/promql/utils.ts +++ b/web/ui/mantine-ui/src/promql/utils.ts @@ -37,6 +37,8 @@ const binOpPrecedence = { [binaryOperatorType.lss]: 4, [binaryOperatorType.gte]: 4, [binaryOperatorType.lte]: 4, + [binaryOperatorType.trimLower]: 4, + [binaryOperatorType.trimUpper]: 4, [binaryOperatorType.and]: 5, [binaryOperatorType.or]: 6, [binaryOperatorType.unless]: 5, diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.ts index 84c101b43c..37c3d5b625 100644 --- a/web/ui/module/codemirror-promql/src/complete/hybrid.ts +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.ts @@ -60,6 +60,8 @@ import { LimitK, LimitRatio, CountValues, + TrimLower, + TrimUpper, } from '@prometheus-io/lezer-promql'; import { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete'; import { EditorState } from '@codemirror/state'; @@ -408,7 +410,7 @@ export function analyzeCompletion(state: EditorState, node: SyntaxNode, pos: num // BinaryExpr( ..., Gtr , ... ) // When the `bool` keyword is present, then the expression looks like this: // BinaryExpr( ..., Gtr , BoolModifier(...), ... ) - if (containsAtLeastOneChild(parent, Eql, Gte, Gtr, Lte, Lss, Neq) && !containsAtLeastOneChild(parent, BoolModifier)) { + if (containsAtLeastOneChild(parent, Eql, Gte, Gtr, TrimLower, TrimUpper, Lte, Lss, Neq) && !containsAtLeastOneChild(parent, BoolModifier)) { result.push({ kind: ContextKind.Bool }); } } @@ -579,6 +581,8 @@ export function analyzeCompletion(state: EditorState, node: SyntaxNode, pos: num case Eql: case Gte: case Gtr: + case TrimLower: + case TrimUpper: case Lte: case Lss: case And: diff --git a/web/ui/module/codemirror-promql/src/complete/promql.terms.ts b/web/ui/module/codemirror-promql/src/complete/promql.terms.ts index 3670fffff7..9c6439e176 100644 --- a/web/ui/module/codemirror-promql/src/complete/promql.terms.ts +++ b/web/ui/module/codemirror-promql/src/complete/promql.terms.ts @@ -26,6 +26,8 @@ export const binOpTerms = [ { label: '>=' }, { label: '>' }, { label: '<' }, + { label: '/' }, { label: '<=' }, { label: '!=' }, { label: 'atan2' }, diff --git a/web/ui/module/codemirror-promql/src/parser/parser.ts b/web/ui/module/codemirror-promql/src/parser/parser.ts index f6e6fa50b6..bfd4acba22 100644 --- a/web/ui/module/codemirror-promql/src/parser/parser.ts +++ b/web/ui/module/codemirror-promql/src/parser/parser.ts @@ -49,12 +49,14 @@ import { StepInvariantExpr, SubqueryExpr, Topk, + TrimLower, + TrimUpper, UnaryExpr, Unless, UnquotedLabelMatcher, VectorSelector, } from '@prometheus-io/lezer-promql'; -import { containsAtLeastOneChild } from './path-finder'; +import { containsAtLeastOneChild, containsChild } from './path-finder'; import { getType } from './type'; import { buildLabelMatchers } from './matcher'; import { EditorState } from '@codemirror/state'; @@ -214,17 +216,25 @@ export class Parser { const lt = this.checkAST(lExpr); const rt = this.checkAST(rExpr); const boolModifierUsed = node.getChild(BoolModifier); - const isComparisonOperator = containsAtLeastOneChild(node, Eql, Neq, Lte, Lss, Gte, Gtr); + + const isComparisonOperator = containsAtLeastOneChild(node, Eql, Neq, Lte, Lss, Gte, Gtr, TrimLower, TrimUpper); + const isTrimLowerOperator = containsChild(node, TrimLower); + const isTrimUpperOperator = containsChild(node, TrimUpper); const isSetOperator = containsAtLeastOneChild(node, And, Or, Unless); - // BOOL modifier check if (boolModifierUsed) { - if (!isComparisonOperator) { + if (!isComparisonOperator || isTrimLowerOperator || isTrimUpperOperator) { this.addDiagnostic(node, 'bool modifier can only be used on comparison operators'); } } else { if (isComparisonOperator && lt === ValueType.scalar && rt === ValueType.scalar) { - this.addDiagnostic(node, 'comparisons between scalars must use BOOL modifier'); + if (isTrimLowerOperator) { + this.addDiagnostic(node, 'operator ">/" not allowed for Scalar operations'); + } else if (isTrimUpperOperator) { + this.addDiagnostic(node, 'operator "=" } Gtr { ">" } + TrimUpper { "/" } EqlRegex { "=~" } EqlSingle { "=" } NeqRegex { "!~" } diff --git a/web/ui/module/lezer-promql/test/expression.txt b/web/ui/module/lezer-promql/test/expression.txt index 109eb7af15..0fe5f3d918 100644 --- a/web/ui/module/lezer-promql/test/expression.txt +++ b/web/ui/module/lezer-promql/test/expression.txt @@ -716,3 +716,31 @@ rate(caddy_http_requests_total[5m] smoothed) ==> PromQL(FunctionCall(FunctionIdentifier(Rate),FunctionCallBody(SmoothedExpr(MatrixSelector(VectorSelector(Identifier),NumberDurationLiteralInDurationContext),Smoothed)))) + +# TrimUpper binary operator + +metric1 + +PromQL( + BinaryExpr( + VectorSelector(Identifier), + TrimUpper, + VectorSelector(Identifier) + ) +) + +# TrimLower binary operator + +metric1 >/ metric2 + +==> + +PromQL( + BinaryExpr( + VectorSelector(Identifier), + TrimLower, + VectorSelector(Identifier) + ) +)