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