75 if (next_unhandled_token.
IsInvalid())
return false;
76 bool has_read_number = !day.
IsEmpty();
78 bool legacy_parser =
false;
80 token = scanner.
Next()) {
81 if (token.IsNumber()) {
83 has_read_number =
true;
84 int n = token.number();
88 if (!time.IsEmpty())
return false;
93 if (!time.Add(n))
return false;
96 }
else if (scanner.
SkipSymbol(
'.') && time.IsExpecting(n)) {
100 if (ms < 0)
return false;
104 }
else if (time.IsExpecting(n)) {
113 if (!day.
Add(n))
return false;
116 }
else if (token.IsKeyword()) {
117 legacy_parser =
true;
120 int value = token.keyword_value();
121 if (type ==
AM_PM && !time.IsEmpty()) {
122 time.SetHourOffset(value);
130 if (has_read_number)
return false;
135 }
else if (token.IsAsciiSign() && (tz.
IsUTC() || !time.IsEmpty())) {
136 legacy_parser =
true;
138 tz.
SetSign(token.ascii_sign());
144 length = next_token.
length();
147 has_read_number =
true;
153 }
else if (length == 2 || length == 1) {
157 }
else if (length == 4 || length == 3) {
165 }
else if ((token.IsAsciiSign() || token.IsSymbol(
')')) &&
174 bool success = day.
Write(out) && time.Write(out) && tz.
Write(out);
176 if (legacy_parser && success) {
185 int pre_pos = in_->position();
186 if (in_->IsEnd())
return DateToken::EndOfInput();
187 if (in_->IsAsciiDigit()) {
188 int n = in_->ReadUnsignedNumeral();
189 int length = in_->position() - pre_pos;
190 return DateToken::Number(n, length);
192 if (in_->Skip(
':'))
return DateToken::Symbol(
':');
193 if (in_->Skip(
'-'))
return DateToken::Symbol(
'-');
194 if (in_->Skip(
'+'))
return DateToken::Symbol(
'+');
195 if (in_->Skip(
'.'))
return DateToken::Symbol(
'.');
196 if (in_->Skip(
')'))
return DateToken::Symbol(
')');
197 if (in_->IsAsciiAlphaOrAbove() && !in_->IsWhiteSpaceChar()) {
198 DCHECK_EQ(KeywordTable::kPrefixLength, 3);
199 uint32_t buffer[3] = {0, 0, 0};
200 int length = in_->ReadWord(buffer, 3);
201 int index = KeywordTable::Lookup(buffer, length);
202 return DateToken::Keyword(KeywordTable::GetType(index),
203 KeywordTable::GetValue(index), length);
205 if (in_->SkipWhiteSpace()) {
206 return DateToken::WhiteSpace(in_->position() - pre_pos);
208 if (in_->SkipParentheses()) {
209 return DateToken::Unknown();
212 return DateToken::Unknown();