1// Code generated by goyacc -o datemath.y.go datemath.y. DO NOT EDIT. 2 3//line datemath.y:8 4package datemath 5 6import __yyfmt__ "fmt" 7 8//line datemath.y:8 9 10import ( 11 "fmt" 12 "math" 13 "time" 14) 15 16var epoch = time.Unix(0, 0).In(time.UTC) 17 18// convert a list of significant digits to an integer 19// assumes most to least significant 20// e.g. 5,2,3 -> 523 21func digitsToInt(digits ...int) int { 22 n := 0 23 for i := range digits { 24 n += digits[i] * int(math.Pow10(len(digits)-i-1)) 25 } 26 return n 27} 28 29//line datemath.y:34 30type yySymType struct { 31 yys int 32 i64 int64 33 i int 34 unit timeUnit 35 month time.Month 36 37 expression mathExpression 38 anchorDateExpression anchorDateExpression 39 timeAdjuster timeAdjuster 40 timeAdjusters []timeAdjuster 41 42 location *time.Location 43 time time.Time 44} 45 46const tNOW = 57346 47const tPLUS = 57347 48const tMINUS = 57348 49const tPIPES = 57349 50const tBACKSLASH = 57350 51const tTIME_DELIMITER = 57351 52const tCOLON = 57352 53const tDOT = 57353 54const tUNIT = 57354 55const tUTC = 57355 56const tDIGIT = 57356 57const tINVALID_TOKEN = 57357 58 59var yyToknames = [...]string{ 60 "$end", 61 "error", 62 "$unk", 63 "tNOW", 64 "tPLUS", 65 "tMINUS", 66 "tPIPES", 67 "tBACKSLASH", 68 "tTIME_DELIMITER", 69 "tCOLON", 70 "tDOT", 71 "tUNIT", 72 "tUTC", 73 "tDIGIT", 74 "tINVALID_TOKEN", 75} 76var yyStatenames = [...]string{} 77 78const yyEofCode = 1 79const yyErrCode = 2 80const yyInitialStackSize = 16 81 82//line datemath.y:300 83 84//line yacctab:1 85var yyExca = [...]int{ 86 -1, 1, 87 1, -1, 88 -2, 0, 89} 90 91const yyPrivate = 57344 92 93const yyLast = 65 94 95var yyAct = [...]int{ 96 97 14, 6, 17, 16, 4, 12, 63, 62, 61, 60, 98 40, 42, 59, 56, 10, 54, 53, 23, 52, 24, 99 29, 51, 49, 47, 46, 45, 43, 41, 37, 35, 100 39, 34, 32, 30, 27, 22, 19, 36, 28, 55, 101 57, 44, 17, 16, 21, 15, 11, 18, 20, 1, 102 38, 13, 7, 3, 5, 2, 31, 58, 50, 33, 103 9, 48, 8, 26, 25, 104} 105var yyPact = [...]int{ 106 107 0, -1000, -1000, 39, 37, 38, -1000, 22, 42, 34, 108 21, 37, -1000, 37, 20, 26, -1000, -1000, 19, -1000, 109 18, 17, 15, -1000, -1000, 25, 14, -1000, -1000, -3, 110 13, 5, 12, 31, 11, 10, -1000, -1000, -1000, 9, 111 -1000, -1000, 8, -1000, 7, -1000, 4, 2, -1000, 1, 112 28, -1, -1000, 30, -1000, -2, -1000, -5, -1000, -6, 113 -7, -8, -1000, -1000, 114} 115var yyPgo = [...]int{ 116 117 0, 0, 64, 63, 62, 61, 60, 59, 58, 57, 118 56, 55, 54, 1, 53, 52, 5, 51, 50, 49, 119} 120var yyR1 = [...]int{ 121 122 0, 19, 11, 11, 11, 11, 11, 14, 14, 14, 123 14, 18, 18, 18, 12, 12, 12, 13, 13, 13, 124 13, 4, 10, 5, 6, 7, 8, 9, 9, 9, 125 16, 16, 17, 17, 1, 1, 2, 2, 3, 3, 126 15, 15, 127} 128var yyR2 = [...]int{ 129 130 0, 1, 1, 2, 3, 1, 2, 1, 1, 4, 131 1, 0, 6, 1, 1, 3, 5, 1, 3, 5, 132 7, 4, 2, 2, 2, 2, 2, 1, 2, 3, 133 2, 1, 3, 2, 1, 1, 0, 1, 1, 2, 134 5, 2, 135} 136var yyChk = [...]int{ 137 138 -1000, -19, -11, -14, 4, -12, -13, -15, -4, -6, 139 14, 7, -16, -17, -1, 8, 6, 5, 9, 14, 140 6, 10, 14, -16, -16, -2, -3, 14, 12, -13, 141 14, -10, 14, -7, 14, 14, 12, 14, -18, -1, 142 13, 14, 6, 14, 10, 14, 14, 14, -5, 14, 143 -8, 14, 14, 14, 14, 11, 14, 10, -9, 14, 144 14, 14, 14, 14, 145} 146var yyDef = [...]int{ 147 148 0, -2, 1, 2, 5, 7, 8, 10, 14, 17, 149 0, 3, 6, 31, 36, 0, 34, 35, 0, 41, 150 0, 0, 24, 4, 30, 0, 37, 38, 33, 11, 151 0, 15, 0, 18, 0, 0, 32, 39, 9, 0, 152 13, 24, 0, 22, 0, 25, 21, 0, 16, 0, 153 19, 0, 40, 0, 23, 0, 26, 0, 20, 27, 154 0, 28, 12, 29, 155} 156var yyTok1 = [...]int{ 157 158 1, 159} 160var yyTok2 = [...]int{ 161 162 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 163 12, 13, 14, 15, 164} 165var yyTok3 = [...]int{ 166 0, 167} 168 169var yyErrorMessages = [...]struct { 170 state int 171 token int 172 msg string 173}{ 174 {1, 15, "invalid token"}, 175} 176 177//line yaccpar:1 178 179/* parser for yacc output */ 180 181var ( 182 yyDebug = 0 183 yyErrorVerbose = false 184) 185 186type yyLexer interface { 187 Lex(lval *yySymType) int 188 Error(s string) 189} 190 191type yyParser interface { 192 Parse(yyLexer) int 193 Lookahead() int 194} 195 196type yyParserImpl struct { 197 lval yySymType 198 stack [yyInitialStackSize]yySymType 199 char int 200} 201 202func (p *yyParserImpl) Lookahead() int { 203 return p.char 204} 205 206func yyNewParser() yyParser { 207 return &yyParserImpl{} 208} 209 210const yyFlag = -1000 211 212func yyTokname(c int) string { 213 if c >= 1 && c-1 < len(yyToknames) { 214 if yyToknames[c-1] != "" { 215 return yyToknames[c-1] 216 } 217 } 218 return __yyfmt__.Sprintf("tok-%v", c) 219} 220 221func yyStatname(s int) string { 222 if s >= 0 && s < len(yyStatenames) { 223 if yyStatenames[s] != "" { 224 return yyStatenames[s] 225 } 226 } 227 return __yyfmt__.Sprintf("state-%v", s) 228} 229 230func yyErrorMessage(state, lookAhead int) string { 231 const TOKSTART = 4 232 233 if !yyErrorVerbose { 234 return "syntax error" 235 } 236 237 for _, e := range yyErrorMessages { 238 if e.state == state && e.token == lookAhead { 239 return "syntax error: " + e.msg 240 } 241 } 242 243 res := "syntax error: unexpected " + yyTokname(lookAhead) 244 245 // To match Bison, suggest at most four expected tokens. 246 expected := make([]int, 0, 4) 247 248 // Look for shiftable tokens. 249 base := yyPact[state] 250 for tok := TOKSTART; tok-1 < len(yyToknames); tok++ { 251 if n := base + tok; n >= 0 && n < yyLast && yyChk[yyAct[n]] == tok { 252 if len(expected) == cap(expected) { 253 return res 254 } 255 expected = append(expected, tok) 256 } 257 } 258 259 if yyDef[state] == -2 { 260 i := 0 261 for yyExca[i] != -1 || yyExca[i+1] != state { 262 i += 2 263 } 264 265 // Look for tokens that we accept or reduce. 266 for i += 2; yyExca[i] >= 0; i += 2 { 267 tok := yyExca[i] 268 if tok < TOKSTART || yyExca[i+1] == 0 { 269 continue 270 } 271 if len(expected) == cap(expected) { 272 return res 273 } 274 expected = append(expected, tok) 275 } 276 277 // If the default action is to accept or reduce, give up. 278 if yyExca[i+1] != 0 { 279 return res 280 } 281 } 282 283 for i, tok := range expected { 284 if i == 0 { 285 res += ", expecting " 286 } else { 287 res += " or " 288 } 289 res += yyTokname(tok) 290 } 291 return res 292} 293 294func yylex1(lex yyLexer, lval *yySymType) (char, token int) { 295 token = 0 296 char = lex.Lex(lval) 297 if char <= 0 { 298 token = yyTok1[0] 299 goto out 300 } 301 if char < len(yyTok1) { 302 token = yyTok1[char] 303 goto out 304 } 305 if char >= yyPrivate { 306 if char < yyPrivate+len(yyTok2) { 307 token = yyTok2[char-yyPrivate] 308 goto out 309 } 310 } 311 for i := 0; i < len(yyTok3); i += 2 { 312 token = yyTok3[i+0] 313 if token == char { 314 token = yyTok3[i+1] 315 goto out 316 } 317 } 318 319out: 320 if token == 0 { 321 token = yyTok2[1] /* unknown char */ 322 } 323 if yyDebug >= 3 { 324 __yyfmt__.Printf("lex %s(%d)\n", yyTokname(token), uint(char)) 325 } 326 return char, token 327} 328 329func yyParse(yylex yyLexer) int { 330 return yyNewParser().Parse(yylex) 331} 332 333func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int { 334 var yyn int 335 var yyVAL yySymType 336 var yyDollar []yySymType 337 _ = yyDollar // silence set and not used 338 yyS := yyrcvr.stack[:] 339 340 Nerrs := 0 /* number of errors */ 341 Errflag := 0 /* error recovery flag */ 342 yystate := 0 343 yyrcvr.char = -1 344 yytoken := -1 // yyrcvr.char translated into internal numbering 345 defer func() { 346 // Make sure we report no lookahead when not parsing. 347 yystate = -1 348 yyrcvr.char = -1 349 yytoken = -1 350 }() 351 yyp := -1 352 goto yystack 353 354ret0: 355 return 0 356 357ret1: 358 return 1 359 360yystack: 361 /* put a state and value onto the stack */ 362 if yyDebug >= 4 { 363 __yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate)) 364 } 365 366 yyp++ 367 if yyp >= len(yyS) { 368 nyys := make([]yySymType, len(yyS)*2) 369 copy(nyys, yyS) 370 yyS = nyys 371 } 372 yyS[yyp] = yyVAL 373 yyS[yyp].yys = yystate 374 375yynewstate: 376 yyn = yyPact[yystate] 377 if yyn <= yyFlag { 378 goto yydefault /* simple state */ 379 } 380 if yyrcvr.char < 0 { 381 yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) 382 } 383 yyn += yytoken 384 if yyn < 0 || yyn >= yyLast { 385 goto yydefault 386 } 387 yyn = yyAct[yyn] 388 if yyChk[yyn] == yytoken { /* valid shift */ 389 yyrcvr.char = -1 390 yytoken = -1 391 yyVAL = yyrcvr.lval 392 yystate = yyn 393 if Errflag > 0 { 394 Errflag-- 395 } 396 goto yystack 397 } 398 399yydefault: 400 /* default state action */ 401 yyn = yyDef[yystate] 402 if yyn == -2 { 403 if yyrcvr.char < 0 { 404 yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) 405 } 406 407 /* look through exception table */ 408 xi := 0 409 for { 410 if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate { 411 break 412 } 413 xi += 2 414 } 415 for xi += 2; ; xi += 2 { 416 yyn = yyExca[xi+0] 417 if yyn < 0 || yyn == yytoken { 418 break 419 } 420 } 421 yyn = yyExca[xi+1] 422 if yyn < 0 { 423 goto ret0 424 } 425 } 426 if yyn == 0 { 427 /* error ... attempt to resume parsing */ 428 switch Errflag { 429 case 0: /* brand new error */ 430 yylex.Error(yyErrorMessage(yystate, yytoken)) 431 Nerrs++ 432 if yyDebug >= 1 { 433 __yyfmt__.Printf("%s", yyStatname(yystate)) 434 __yyfmt__.Printf(" saw %s\n", yyTokname(yytoken)) 435 } 436 fallthrough 437 438 case 1, 2: /* incompletely recovered error ... try again */ 439 Errflag = 3 440 441 /* find a state where "error" is a legal shift action */ 442 for yyp >= 0 { 443 yyn = yyPact[yyS[yyp].yys] + yyErrCode 444 if yyn >= 0 && yyn < yyLast { 445 yystate = yyAct[yyn] /* simulate a shift of "error" */ 446 if yyChk[yystate] == yyErrCode { 447 goto yystack 448 } 449 } 450 451 /* the current p has no shift on "error", pop stack */ 452 if yyDebug >= 2 { 453 __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) 454 } 455 yyp-- 456 } 457 /* there is no state on the stack with an error shift ... abort */ 458 goto ret1 459 460 case 3: /* no shift yet; clobber input char */ 461 if yyDebug >= 2 { 462 __yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken)) 463 } 464 if yytoken == yyEofCode { 465 goto ret1 466 } 467 yyrcvr.char = -1 468 yytoken = -1 469 goto yynewstate /* try again in the same state */ 470 } 471 } 472 473 /* reduction by production yyn */ 474 if yyDebug >= 2 { 475 __yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate)) 476 } 477 478 yynt := yyn 479 yypt := yyp 480 _ = yypt // guard against "declared and not used" 481 482 yyp -= yyR2[yyn] 483 // yyp is now the index of $0. Perform the default action. Iff the 484 // reduced production is ε, $1 is possibly out of range. 485 if yyp+1 >= len(yyS) { 486 nyys := make([]yySymType, len(yyS)*2) 487 copy(nyys, yyS) 488 yyS = nyys 489 } 490 yyVAL = yyS[yyp+1] 491 492 /* consult goto table to find next state */ 493 yyn = yyR1[yyn] 494 yyg := yyPgo[yyn] 495 yyj := yyg + yyS[yyp].yys + 1 496 497 if yyj >= yyLast { 498 yystate = yyAct[yyg] 499 } else { 500 yystate = yyAct[yyj] 501 if yyChk[yystate] != -yyn { 502 yystate = yyAct[yyg] 503 } 504 } 505 // dummy call; replaced with literal code 506 switch yynt { 507 508 case 1: 509 yyDollar = yyS[yypt-1 : yypt+1] 510//line datemath.y:65 511 { // last rule; assign the evaluated time so we can use use it later 512 yylex.(*lexerWrapper).expression = yyDollar[1].expression 513 } 514 case 2: 515 yyDollar = yyS[yypt-1 : yypt+1] 516//line datemath.y:77 517 { 518 yyVAL.expression = newMathExpression(anchorDate(yyDollar[1].time), nil) 519 } 520 case 3: 521 yyDollar = yyS[yypt-2 : yypt+1] 522//line datemath.y:80 523 { 524 yyVAL.expression = newMathExpression(anchorDate(yyDollar[1].time), nil) 525 } 526 case 4: 527 yyDollar = yyS[yypt-3 : yypt+1] 528//line datemath.y:83 529 { 530 yyVAL.expression = newMathExpression(anchorDate(yyDollar[1].time), yyDollar[3].timeAdjusters) 531 } 532 case 5: 533 yyDollar = yyS[yypt-1 : yypt+1] 534//line datemath.y:86 535 { 536 yyVAL.expression = newMathExpression(anchorDateNow, nil) 537 } 538 case 6: 539 yyDollar = yyS[yypt-2 : yypt+1] 540//line datemath.y:89 541 { 542 yyVAL.expression = newMathExpression(anchorDateNow, yyDollar[2].timeAdjusters) 543 } 544 case 7: 545 yyDollar = yyS[yypt-1 : yypt+1] 546//line datemath.y:103 547 { 548 yyVAL.time = yyDollar[1].time 549 } 550 case 8: 551 yyDollar = yyS[yypt-1 : yypt+1] 552//line datemath.y:107 553 { 554 yyVAL.time = yyDollar[1].time 555 } 556 case 9: 557 yyDollar = yyS[yypt-4 : yypt+1] 558//line datemath.y:111 559 { 560 yyVAL.time = time.Date(yyDollar[1].time.Year(), yyDollar[1].time.Month(), yyDollar[1].time.Day(), yyDollar[3].time.Hour(), yyDollar[3].time.Minute(), yyDollar[3].time.Second(), yyDollar[3].time.Nanosecond(), yyDollar[4].location) 561 } 562 case 10: 563 yyDollar = yyS[yypt-1 : yypt+1] 564//line datemath.y:115 565 { 566 yyVAL.time = time.Unix(yyDollar[1].i64/1000, yyDollar[1].i64%1000*1000000) 567 } 568 case 11: 569 yyDollar = yyS[yypt-0 : yypt+1] 570//line datemath.y:121 571 { 572 yyVAL.location = missingTimeZone 573 } 574 case 12: 575 yyDollar = yyS[yypt-6 : yypt+1] 576//line datemath.y:125 577 { /* support +/-09:00 style timezone specifiers */ 578 yyVAL.location = time.FixedZone("$1$2$3:$5$6", yyDollar[1].i*(((yyDollar[2].i*10+yyDollar[3].i)*60*60)+((yyDollar[5].i*10+yyDollar[6].i)*60))) 579 } 580 case 13: 581 yyDollar = yyS[yypt-1 : yypt+1] 582//line datemath.y:129 583 { /* Z */ 584 yyVAL.location = time.UTC 585 } 586 case 14: 587 yyDollar = yyS[yypt-1 : yypt+1] 588//line datemath.y:135 589 { 590 yyVAL.time = time.Date(yyDollar[1].i, 1, 1, 0, 0, 0, 0, missingTimeZone) 591 } 592 case 15: 593 yyDollar = yyS[yypt-3 : yypt+1] 594//line datemath.y:139 595 { 596 yyVAL.time = time.Date(yyDollar[1].i, yyDollar[3].month, 1, 0, 0, 0, 0, missingTimeZone) 597 } 598 case 16: 599 yyDollar = yyS[yypt-5 : yypt+1] 600//line datemath.y:143 601 { 602 if yyDollar[5].i > daysIn(yyDollar[3].month, yyDollar[1].i) { 603 yylex.Error(fmt.Sprintf("day %d out of bounds for month %d", yyDollar[5].i, yyDollar[3].month)) 604 } 605 yyVAL.time = time.Date(yyDollar[1].i, yyDollar[3].month, yyDollar[5].i, 0, 0, 0, 0, missingTimeZone) 606 } 607 case 17: 608 yyDollar = yyS[yypt-1 : yypt+1] 609//line datemath.y:153 610 { 611 yyVAL.time = time.Date(epoch.Year(), epoch.Month(), epoch.Day(), yyDollar[1].i, 0, 0, 0, missingTimeZone) 612 } 613 case 18: 614 yyDollar = yyS[yypt-3 : yypt+1] 615//line datemath.y:157 616 { 617 yyVAL.time = time.Date(epoch.Year(), epoch.Month(), epoch.Day(), yyDollar[1].i, yyDollar[3].i, 0, 0, missingTimeZone) 618 } 619 case 19: 620 yyDollar = yyS[yypt-5 : yypt+1] 621//line datemath.y:161 622 { 623 yyVAL.time = time.Date(epoch.Year(), epoch.Month(), epoch.Day(), yyDollar[1].i, yyDollar[3].i, yyDollar[5].i, 0, missingTimeZone) 624 } 625 case 20: 626 yyDollar = yyS[yypt-7 : yypt+1] 627//line datemath.y:165 628 { 629 yyVAL.time = time.Date(epoch.Year(), epoch.Month(), epoch.Day(), yyDollar[1].i, yyDollar[3].i, yyDollar[5].i, yyDollar[7].i, missingTimeZone) 630 } 631 case 21: 632 yyDollar = yyS[yypt-4 : yypt+1] 633//line datemath.y:171 634 { 635 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i, yyDollar[3].i, yyDollar[4].i) 636 } 637 case 22: 638 yyDollar = yyS[yypt-2 : yypt+1] 639//line datemath.y:177 640 { 641 yyVAL.month = time.Month(digitsToInt(yyDollar[1].i, yyDollar[2].i)) 642 if yyVAL.month > 12 { 643 yylex.Error(fmt.Sprintf("month out of bounds %d", yyVAL.month)) 644 } 645 } 646 case 23: 647 yyDollar = yyS[yypt-2 : yypt+1] 648//line datemath.y:186 649 { 650 // range validated in `date` 651 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i) 652 } 653 case 24: 654 yyDollar = yyS[yypt-2 : yypt+1] 655//line datemath.y:193 656 { 657 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i) 658 if yyVAL.i > 23 { 659 yylex.Error(fmt.Sprintf("hours out of bounds %d", yyVAL.i)) 660 } 661 } 662 case 25: 663 yyDollar = yyS[yypt-2 : yypt+1] 664//line datemath.y:202 665 { 666 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i) 667 if yyVAL.i > 59 { 668 yylex.Error(fmt.Sprintf("minutes out of bounds %d", yyVAL.i)) 669 } 670 } 671 case 26: 672 yyDollar = yyS[yypt-2 : yypt+1] 673//line datemath.y:211 674 { 675 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i) 676 if yyVAL.i > 59 { 677 yylex.Error(fmt.Sprintf("seconds out of bounds %d", yyVAL.i)) 678 } 679 } 680 case 27: 681 yyDollar = yyS[yypt-1 : yypt+1] 682//line datemath.y:221 683 { 684 yyVAL.i = yyDollar[1].i * 100000000 685 } 686 case 28: 687 yyDollar = yyS[yypt-2 : yypt+1] 688//line datemath.y:225 689 { 690 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i) * 10000000 691 } 692 case 29: 693 yyDollar = yyS[yypt-3 : yypt+1] 694//line datemath.y:229 695 { 696 yyVAL.i = digitsToInt(yyDollar[1].i, yyDollar[2].i, yyDollar[3].i) * 1000000 697 } 698 case 30: 699 yyDollar = yyS[yypt-2 : yypt+1] 700//line datemath.y:236 701 { 702 yyVAL.timeAdjusters = append([]timeAdjuster{yyDollar[1].timeAdjuster}, yyDollar[2].timeAdjusters...) 703 /*f, g := $1, $2 // bind to local scope*/ 704 /*$$ = func(t time.Time) time.Time {*/ 705 /*return g(f(t))*/ 706 /*}*/ 707 } 708 case 31: 709 yyDollar = yyS[yypt-1 : yypt+1] 710//line datemath.y:244 711 { 712 yyVAL.timeAdjusters = []timeAdjuster{yyDollar[1].timeAdjuster} 713 } 714 case 32: 715 yyDollar = yyS[yypt-3 : yypt+1] 716//line datemath.y:250 717 { /* add units; e.g. +15m */ 718 yyVAL.timeAdjuster = addUnits(yyDollar[1].i*yyDollar[2].i, yyDollar[3].unit) 719 } 720 case 33: 721 yyDollar = yyS[yypt-2 : yypt+1] 722//line datemath.y:254 723 { /* truncate to specified unit: e.g. /d */ 724 yyVAL.timeAdjuster = truncateUnits(yyDollar[2].unit) 725 } 726 case 34: 727 yyDollar = yyS[yypt-1 : yypt+1] 728//line datemath.y:260 729 { 730 yyVAL.i = -1 731 } 732 case 35: 733 yyDollar = yyS[yypt-1 : yypt+1] 734//line datemath.y:264 735 { 736 yyVAL.i = 1 737 } 738 case 36: 739 yyDollar = yyS[yypt-0 : yypt+1] 740//line datemath.y:270 741 { /* default to 1 if no integer specified */ 742 yyVAL.i = 1 743 } 744 case 37: 745 yyDollar = yyS[yypt-1 : yypt+1] 746//line datemath.y:274 747 { 748 yyVAL.i = yyDollar[1].i 749 } 750 case 38: 751 yyDollar = yyS[yypt-1 : yypt+1] 752//line datemath.y:280 753 { 754 yyVAL.i = yyDollar[1].i 755 } 756 case 39: 757 yyDollar = yyS[yypt-2 : yypt+1] 758//line datemath.y:284 759 { 760 yyVAL.i = yyDollar[1].i*10 + yyDollar[2].i 761 } 762 case 40: 763 yyDollar = yyS[yypt-5 : yypt+1] 764//line datemath.y:291 765 { 766 yyVAL.i64 = int64(digitsToInt(yyDollar[1].i, yyDollar[2].i, yyDollar[3].i, yyDollar[4].i, yyDollar[5].i)) 767 } 768 case 41: 769 yyDollar = yyS[yypt-2 : yypt+1] 770//line datemath.y:295 771 { 772 yyVAL.i64 = yyDollar[1].i64*10 + int64(yyDollar[2].i) 773 } 774 } 775 goto yystack /* stack new state and value */ 776} 777