// Code generated by golex. DO NOT EDIT. /* This file is used with golex to generate a lexer that has a signature compatible with goyacc. Many constants referred to below are defined by goyacc when creating template.y.go See https://godoc.org/modernc.org/golex for more about golex */ package datemath import ( "bytes" "fmt" "strconv" ) const ( // 0 is expected by the goyacc generated parser to indicate EOF eofCode = 0 ) // lexer holds the state of the lexer type lexer struct { src *bytes.Reader buf []byte current byte pos int errors []string } func newLexer(b []byte) *lexer { l := &lexer{ src: bytes.NewReader(b), } // queue up a byte l.next() return l } func (l *lexer) Error(s string) { l.errors = append(l.errors, fmt.Sprintf("%s at character %d starting with %q", s, l.pos, string(l.buf))) } func (l *lexer) next() { if l.current != 0 { l.buf = append(l.buf, l.current) } l.current = 0 if b, err := l.src.ReadByte(); err == nil { l.current = b } l.pos++ } func (l *lexer) Lex(lval *yySymType) int { /* give some regular expressions more semantic names for use below */ /* tell golex how to determine the current start condition */ /* tell golex how to determine the current byte */ /* tell golex how to advance to the next byte */ yystate0: // runs before each token is parsed l.buf = l.buf[:0] goto yystart1 yystate1: l.next() yystart1: switch { default: goto yyabort case l.current == '+': goto yystate4 case l.current == '-': goto yystate5 case l.current == '.': goto yystate6 case l.current == '/': goto yystate7 case l.current == ':': goto yystate9 case l.current == 'H' || l.current == 'M' || l.current == 'b' || l.current == 'd' || l.current == 'h' || l.current == 'm' || l.current == 's' || l.current == 'w' || l.current == 'y': goto yystate10 case l.current == 'T': goto yystate11 case l.current == 'Z': goto yystate12 case l.current == '\x00': goto yystate2 case l.current == 'n': goto yystate13 case l.current == '|': goto yystate16 case l.current >= '0' && l.current <= '9': goto yystate8 case l.current >= '\x01' && l.current <= '\t' || l.current >= '\v' && l.current <= '*' || l.current == ',' || l.current >= ';' && l.current <= 'G' || l.current >= 'I' && l.current <= 'L' || l.current >= 'N' && l.current <= 'S' || l.current >= 'U' && l.current <= 'Y' || l.current >= '[' && l.current <= 'a' || l.current == 'c' || l.current >= 'e' && l.current <= 'g' || l.current >= 'i' && l.current <= 'l' || l.current >= 'o' && l.current <= 'r' || l.current >= 't' && l.current <= 'v' || l.current == 'x' || l.current == 'z' || l.current == '{' || l.current >= '}' && l.current <= 'ΓΏ': goto yystate3 } yystate2: l.next() goto yyrule12 yystate3: l.next() goto yyrule13 yystate4: l.next() goto yyrule3 yystate5: l.next() goto yyrule4 yystate6: l.next() goto yyrule9 yystate7: l.next() goto yyrule7 yystate8: l.next() goto yyrule1 yystate9: l.next() goto yyrule5 yystate10: l.next() goto yyrule8 yystate11: l.next() goto yyrule10 yystate12: l.next() goto yyrule11 yystate13: l.next() switch { default: goto yyrule13 case l.current == 'o': goto yystate14 } yystate14: l.next() switch { default: goto yyabort case l.current == 'w': goto yystate15 } yystate15: l.next() goto yyrule2 yystate16: l.next() switch { default: goto yyrule13 case l.current == '|': goto yystate17 } yystate17: l.next() goto yyrule6 yyrule1: // [0-9] { i, err := strconv.ParseInt(string(l.buf), 10, 0) if err != nil { panic(fmt.Sprintf("could not parse digit as number: %s", err)) } lval.i = int(i) return tDIGIT } yyrule2: // "now" { return tNOW } yyrule3: // "+" { return tPLUS } yyrule4: // "-" { return tMINUS } yyrule5: // ":" { return tCOLON } yyrule6: // "||" { return tPIPES } yyrule7: // "/" { return tBACKSLASH } yyrule8: // [yMwdbhHms] { switch l.buf[0] { case 'y': lval.unit = timeUnitYear case 'M': lval.unit = timeUnitMonth case 'w': lval.unit = timeUnitWeek case 'b': lval.unit = timeUnitBusinessDay case 'd': lval.unit = timeUnitDay case 'h', 'H': lval.unit = timeUnitHour case 'm': lval.unit = timeUnitMinute case 's': lval.unit = timeUnitSecond default: panic(fmt.Sprintf("unknown time unit: %q", l.buf[0])) } return tUNIT } yyrule9: // \. { return tDOT } yyrule10: // "T" { return tTIME_DELIMITER } yyrule11: // "Z" { return tUTC } yyrule12: // {eof} { return eofCode } yyrule13: // . if true { // avoid go vet determining the below panic will not be reached return tINVALID_TOKEN } panic("unreachable") yyabort: // no lexem recognized // // silence unused label errors for build and satisfy go vet reachability analysis // { if false { goto yyabort } if false { goto yystate0 } if false { goto yystate1 } } // should never get here panic("scanner internal error") }