func lexStatements(l *lexer) stateFn {
	if l.braceOpen {
		return lexInsideBraces
	}
	if strings.HasPrefix(l.input[l.pos:], lineComment) {
		return lexLineComment
	}

	switch r := l.next(); {
	case r == eof:
		if l.parenDepth != 0 {
			return l.errorf("unclosed left parenthesis")
		} else if l.bracketOpen {
			return l.errorf("unclosed left bracket")
		}
		l.emit(ItemEOF)
		return nil
	case r == ',':
		l.emit(ItemComma)
	case isSpace(r):
		return lexSpace
	case r == '*':
		l.emit(ItemMUL)
	case r == '/':
		l.emit(ItemDIV)
	case r == '%':
		l.emit(ItemMOD)
	case r == '+':
		l.emit(ItemADD)
	case r == '-':
		l.emit(ItemSUB)
	case r == '^':
		l.emit(ItemPOW)
	case r == '=':
		if t := l.peek(); t == '=' {
			l.next()
			l.emit(ItemEQL)
		} else if t == '~' {
			return l.errorf("unexpected character after '=': %q", t)
		} else {
			l.emit(ItemAssign)
		}
	case r == '!':
		if t := l.next(); t == '=' {
			l.emit(ItemNEQ)
		} else {
			return l.errorf("unexpected character after '!': %q", t)
		}
	case r == '<':
		if t := l.peek(); t == '=' {
			l.next()
			l.emit(ItemLTE)
		} else {
			l.emit(ItemLSS)
		}
	case r == '>':
		if t := l.peek(); t == '=' {
			l.next()
			l.emit(ItemGTE)
		} else {
			l.emit(ItemGTR)
		}
	case isDigit(r) || (r == '.' && isDigit(l.peek())):
		l.backup()
		return lexNumberOrDuration
	case r == '"' || r == '\'':
		l.stringOpen = r
		return lexString
	case r == '`':
		l.stringOpen = r
		return lexRawString
	case isAlpha(r) || r == ':':
		if !l.bracketOpen {
			l.backup()
			return lexKeywordOrIdentifier
		}
		if l.gotColon {
			return l.errorf("unexpected colon %q", r)
		}
		l.emit(ItemColon)
		l.gotColon = true
	case r == '(':
		l.emit(ItemLeftParen)
		l.parenDepth++
		return lexStatements
	case r == ')':
		l.emit(ItemRightParen)
		l.parenDepth--
		if l.parenDepth < 0 {
			return l.errorf("unexpected right parenthesis %q", r)
		}
		return lexStatements
	case r == '{':
		l.emit(ItemLeftBrace)
		l.braceOpen = true
		return lexInsideBraces(l)
	case r == '[':
		if l.bracketOpen {
			return l.errorf("unexpected left bracket %q", r)
		}
		l.gotColon = false
		l.emit(ItemLeftBracket)
		l.bracketOpen = true
		return lexDuration
	case r == ']':
		if !l.bracketOpen {
			return l.errorf("unexpected right bracket %q", r)
		}
		l.emit(ItemRightBracket)
		l.bracketOpen = false

	default:
		return l.errorf("unexpected character: %q", r)
	}
	return lexStatements
}
func lexStatements(l *lexer) stateFn {
	if l.braceOpen {
		return lexInsideBraces
	}
	if strings.HasPrefix(l.input[l.pos:], lineComment) {
		return lexLineComment
	}

	switch r := l.next(); {
	case r == eof:
		if l.parenDepth != 0 {
			return l.errorf("unclosed left parenthesis")
		} else if l.bracketOpen {
			return l.errorf("unclosed left bracket")
		}
		l.emit(ItemEOF)
		return nil
	case r == ',':
		l.emit(ItemComma)
	case isSpace(r):
		return lexSpace
	case r == '*':
		l.emit(ItemMUL)
	case r == '/':
		l.emit(ItemDIV)
	case r == '%':
		l.emit(ItemMOD)
	case r == '+':
		l.emit(ItemADD)
	case r == '-':
		l.emit(ItemSUB)
	case r == '^':
		l.emit(ItemPOW)
	case r == '=':
		if t := l.peek(); t == '=' {
			l.next()
			l.emit(ItemEQL)
		} else if t == '~' {
			return l.errorf("unexpected character after '=': %q", t)
		} else {
			l.emit(ItemAssign)
		}
	case r == '!':
		if t := l.next(); t == '=' {
			l.emit(ItemNEQ)
		} else {
			return l.errorf("unexpected character after '!': %q", t)
		}
	case r == '<':
		if t := l.peek(); t == '=' {
			l.next()
			l.emit(ItemLTE)
		} else {
			l.emit(ItemLSS)
		}
	case r == '>':
		if t := l.peek(); t == '=' {
			l.next()
			l.emit(ItemGTE)
		} else {
			l.emit(ItemGTR)
		}
	case isDigit(r) || (r == '.' && isDigit(l.peek())):
		l.backup()
		return lexNumberOrDuration
	case r == '"' || r == '\'':
		l.stringOpen = r
		return lexString
	case r == '`':
		l.stringOpen = r
		return lexRawString
	case isAlpha(r) || r == ':':
		if !l.bracketOpen {
			l.backup()
			return lexKeywordOrIdentifier
		}
		if l.gotColon {
			return l.errorf("unexpected colon %q", r)
		}
		l.emit(ItemColon)
		l.gotColon = true
	case r == '(':
		l.emit(ItemLeftParen)
		l.parenDepth++
		return lexStatements
	case r == ')':
		l.emit(ItemRightParen)
		l.parenDepth--
		if l.parenDepth < 0 {
			return l.errorf("unexpected right parenthesis %q", r)
		}
		return lexStatements
	case r == '{':
		l.emit(ItemLeftBrace)
		l.braceOpen = true
		return lexInsideBraces(l)
	case r == '[':
		if l.bracketOpen {
			return l.errorf("unexpected left bracket %q", r)
		}
		l.gotColon = false
		l.emit(ItemLeftBracket)
		l.bracketOpen = true
		return lexDuration
	case r == ']':
		if !l.bracketOpen {
			return l.errorf("unexpected right bracket %q", r)
		}
		l.emit(ItemRightBracket)
		l.bracketOpen = false

	default:
		return l.errorf("unexpected character: %q", r)
	}
	return lexStatements
}
func lexStatements ( l * lexer ) stateFn { if l . braceOpen { return lexInsideBraces } if strings . HasPrefix ( l . input [ l . pos : ] , lineComment ) { return lexLineComment } switch r := l . next ( ) ; { case r == eof : if l . parenDepth != 0 { return l . errorf ( " " ) } else if l . bracketOpen { return l . errorf ( " " ) } l . emit ( ItemEOF ) return nil case r == ',' : l . emit ( ItemComma ) case isSpace ( r ) : return lexSpace case r == '*' : l . emit ( ItemMUL ) case r == '/' : l . emit ( ItemDIV ) case r == '%' : l . emit ( ItemMOD ) case r == '+' : l . emit ( ItemADD ) case r == '-' : l . emit ( ItemSUB ) case r == '^' : l . emit ( ItemPOW ) case r == '=' : if t := l . peek ( ) ; t == '=' { l . next ( ) l . emit ( ItemEQL ) } else if t == '~' { return l . errorf ( " " , t ) } else { l . emit ( ItemAssign ) } case r == '!' : if t := l . next ( ) ; t == '=' { l . emit ( ItemNEQ ) } else { return l . errorf ( " " , t ) } case r == '<' : if t := l . peek ( ) ; t == '=' { l . next ( ) l . emit ( ItemLTE ) } else { l . emit ( ItemLSS ) } case r == '>' : if t := l . peek ( ) ; t == '=' { l . next ( ) l . emit ( ItemGTE ) } else { l . emit ( ItemGTR ) } case isDigit ( r ) || ( r == '.' && isDigit ( l . peek ( ) ) ) : l . backup ( ) return lexNumberOrDuration case r == '"' || r == '\'' : l . stringOpen = r return lexString case r == '`' : l . stringOpen = r return lexRawString case isAlpha ( r ) || r == ':' : if ! l . bracketOpen { l . backup ( ) return lexKeywordOrIdentifier } if l . gotColon { return l . errorf ( " " , r ) } l . emit ( ItemColon ) l . gotColon = true case r == '(' : l . emit ( ItemLeftParen ) l . parenDepth ++ return lexStatements case r == ')' : l . emit ( ItemRightParen ) l . parenDepth -- if l . parenDepth < 0 { return l . errorf ( " " , r ) } return lexStatements case r == '{' : l . emit ( ItemLeftBrace ) l . braceOpen = true return lexInsideBraces ( l ) case r == '[' : if l . bracketOpen { return l . errorf ( " " , r ) } l . gotColon = false l . emit ( ItemLeftBracket ) l . bracketOpen = true return lexDuration case r == ']' : if ! l . bracketOpen { return l . errorf ( " " , r ) } l . emit ( ItemRightBracket ) l . bracketOpen = false default : return l . errorf ( " " , r ) } return lexStatements }
// lexStatements is the top-level state for lexing.
lexStatements is the top - level state for lexing .