5#ifndef V8_PARSING_SCANNER_INL_H_
6#define V8_PARSING_SCANNER_INL_H_
21#define KEYWORDS(KEYWORD_GROUP, KEYWORD) \
23 KEYWORD("async", Token::kAsync) \
24 KEYWORD("await", Token::kAwait) \
26 KEYWORD("break", Token::kBreak) \
28 KEYWORD("case", Token::kCase) \
29 KEYWORD("catch", Token::kCatch) \
30 KEYWORD("class", Token::kClass) \
31 KEYWORD("const", Token::kConst) \
32 KEYWORD("continue", Token::kContinue) \
34 KEYWORD("debugger", Token::kDebugger) \
35 KEYWORD("default", Token::kDefault) \
36 KEYWORD("delete", Token::kDelete) \
37 KEYWORD("do", Token::kDo) \
39 KEYWORD("else", Token::kElse) \
40 KEYWORD("enum", Token::kEnum) \
41 KEYWORD("export", Token::kExport) \
42 KEYWORD("extends", Token::kExtends) \
44 KEYWORD("false", Token::kFalseLiteral) \
45 KEYWORD("finally", Token::kFinally) \
46 KEYWORD("for", Token::kFor) \
47 KEYWORD("function", Token::kFunction) \
49 KEYWORD("get", Token::kGet) \
51 KEYWORD("if", Token::kIf) \
52 KEYWORD("implements", Token::kFutureStrictReservedWord) \
53 KEYWORD("import", Token::kImport) \
54 KEYWORD("in", Token::kIn) \
55 KEYWORD("instanceof", Token::kInstanceOf) \
56 KEYWORD("interface", Token::kFutureStrictReservedWord) \
58 KEYWORD("let", Token::kLet) \
60 KEYWORD("new", Token::kNew) \
61 KEYWORD("null", Token::kNullLiteral) \
63 KEYWORD("of", Token::kOf) \
65 KEYWORD("package", Token::kFutureStrictReservedWord) \
66 KEYWORD("private", Token::kFutureStrictReservedWord) \
67 KEYWORD("protected", Token::kFutureStrictReservedWord) \
68 KEYWORD("public", Token::kFutureStrictReservedWord) \
70 KEYWORD("return", Token::kReturn) \
72 KEYWORD("set", Token::kSet) \
73 KEYWORD("static", Token::kStatic) \
74 KEYWORD("super", Token::kSuper) \
75 KEYWORD("switch", Token::kSwitch) \
77 KEYWORD("this", Token::kThis) \
78 KEYWORD("throw", Token::kThrow) \
79 KEYWORD("true", Token::kTrueLiteral) \
80 KEYWORD("try", Token::kTry) \
81 KEYWORD("typeof", Token::kTypeOf) \
83 KEYWORD("using", Token::kUsing) \
85 KEYWORD("var", Token::kVar) \
86 KEYWORD("void", Token::kVoid) \
88 KEYWORD("while", Token::kWhile) \
89 KEYWORD("with", Token::kWith) \
91 KEYWORD("yield", Token::kYield)
94#define KEYWORD_GROUP_CHECK(ch) c == ch ||
95#define KEYWORD_CHECK(keyword, token)
97#undef KEYWORD_GROUP_CHECK
118#define
KEYWORD(keyword, token) keyword
136 c ==
'(' ? Token::kLeftParen :
137 c ==
')' ? Token::kRightParen :
138 c ==
'{' ? Token::kLeftBrace :
139 c ==
'}' ? Token::kRightBrace :
140 c ==
'[' ? Token::kLeftBracket :
141 c ==
']' ? Token::kRightBracket :
142 c ==
'?' ? Token::kConditional :
143 c ==
':' ? Token::kColon :
144 c ==
';' ? Token::kSemicolon :
145 c ==
',' ? Token::kComma :
146 c ==
'.' ? Token::kPeriod :
147 c ==
'|' ? Token::kBitOr :
148 c ==
'&' ? Token::kBitAnd :
149 c ==
'^' ? Token::kBitXor :
150 c ==
'~' ? Token::kBitNot :
151 c ==
'!' ? Token::kNot :
152 c ==
'<' ? Token::kLessThan :
153 c ==
'>' ? Token::kGreaterThan :
154 c ==
'%' ? Token::kMod :
155 c ==
'=' ? Token::kAssign :
156 c ==
'+' ? Token::kAdd :
157 c ==
'-' ? Token::kSub :
158 c ==
'*' ? Token::kMul :
159 c ==
'/' ? Token::kDiv :
160 c ==
'#' ? Token::kPrivateName :
161 c ==
'"' ? Token::kString :
162 c ==
'\'' ? Token::kString :
163 c ==
'`' ? Token::kTemplateSpan :
164 c ==
'\\' ? Token::kIdentifier :
166 c ==
' ' ? Token::kWhitespace :
167 c ==
'\t' ? Token::kWhitespace :
168 c ==
'\v' ? Token::kWhitespace :
169 c ==
'\f' ? Token::kWhitespace :
170 c ==
'\r' ? Token::kWhitespace :
171 c ==
'\n' ? Token::kWhitespace :
181#define CALL_GET_SCAN_FLAGS(N) GetOneCharToken(N),
183#undef CALL_GET_SCAN_FLAGS
222 ((c ==
'\'' || c ==
'"' || c ==
'\n' || c ==
'\r' || c ==
'\\')
230 (c ==
'\n' || c ==
'\r' || c ==
'*'
231 ?
static_cast<uint8_t
>(
246 return (scan_flags &
static_cast<uint8_t
>(
255#define CALL_GET_SCAN_FLAGS(N) GetScanFlags(N),
257#undef CALL_GET_SCAN_FLAGS
267 bool escaped =
false;
268 bool can_be_keyword =
true;
293 scan_flags |= char_flags;
303 if (!
CanBeKeyword(scan_flags))
return Token::kIdentifier;
317 return Token::kIllegal;
348 return Token::kWhitespace;
364 case Token::kLeftParen:
365 case Token::kRightParen:
366 case Token::kLeftBrace:
367 case Token::kRightBrace:
368 case Token::kLeftBracket:
369 case Token::kRightBracket:
371 case Token::kSemicolon:
374 case Token::kIllegal:
378 case Token::kConditional:
385 }
else if (
c0_ ==
'?') {
386 return Select(
'=', Token::kAssignNullish, Token::kNullish);
388 return Token::kConditional;
393 case Token::kLessThan:
396 if (
c0_ ==
'=')
return Select(Token::kLessThanEq);
397 if (
c0_ ==
'<')
return Select(
'=', Token::kAssignShl, Token::kShl);
402 return Token::kLessThan;
404 case Token::kGreaterThan:
407 if (
c0_ ==
'=')
return Select(Token::kGreaterThanEq);
411 if (
c0_ ==
'=')
return Select(Token::kAssignSar);
412 if (
c0_ ==
'>')
return Select(
'=', Token::kAssignShr, Token::kShr);
415 return Token::kGreaterThan;
420 if (
c0_ ==
'=')
return Select(
'=', Token::kEqStrict, Token::kEq);
421 if (
c0_ ==
'>')
return Select(Token::kArrow);
422 return Token::kAssign;
428 return Select(
'=', Token::kNotEqStrict, Token::kNotEq);
434 if (
c0_ ==
'+')
return Select(Token::kInc);
435 if (
c0_ ==
'=')
return Select(Token::kAssignAdd);
443 if (
c0_ ==
'>' &&
next().after_line_terminator) {
451 if (
c0_ ==
'=')
return Select(Token::kAssignSub);
457 if (
c0_ ==
'*')
return Select(
'=', Token::kAssignExp, Token::kExp);
458 if (
c0_ ==
'=')
return Select(Token::kAssignMul);
463 return Select(
'=', Token::kAssignMod, Token::kMod);
471 if (c ==
'#' || c ==
'@') {
485 if (
c0_ ==
'=')
return Select(Token::kAssignDiv);
491 if (
c0_ ==
'&')
return Select(
'=', Token::kAssignAnd, Token::kAnd);
492 if (
c0_ ==
'=')
return Select(Token::kAssignBitAnd);
493 return Token::kBitAnd;
498 if (
c0_ ==
'|')
return Select(
'=', Token::kAssignOr, Token::kOr);
499 if (
c0_ ==
'=')
return Select(Token::kAssignBitOr);
500 return Token::kBitOr;
504 return Select(
'=', Token::kAssignBitXor, Token::kBitXor);
514 return Token::kEllipsis;
517 return Token::kPeriod;
519 case Token::kTemplateSpan:
523 case Token::kPrivateName:
530 case Token::kWhitespace:
537 case Token::kIdentifier:
555 }
while (token == Token::kWhitespace);
568 SanityCheckTokenDesc(
current());
569 SanityCheckTokenDesc(
next());
constexpr T * begin() const
base::Vector< const uint8_t > one_byte_literal() const
static Token::Value GetToken(const char *str, int len)
V8_INLINE Token::Value ScanIdentifierOrKeywordInner()
V8_INLINE Token::Value ScanSingleToken()
Token::Value SkipMagicComment(base::uc32 hash_or_at_sign)
const TokenDesc & next_next() const
void PushBack(base::uc32 ch)
V8_INLINE void AddLiteralChar(base::uc32 c)
Token::Value ScanIdentifierOrKeywordInnerSlow(bool escaped, bool can_be_keyword)
bool CombineSurrogatePair()
Token::Value ScanString()
Token::Value ScanTemplateSpan()
Token::Value ScanNumber(bool seen_period)
V8_INLINE bool has_parser_error() const
Token::Value SkipMultiLineComment()
Token::Value SkipSingleHTMLComment()
Utf16CharacterStream *const source_
V8_INLINE void AdvanceUntil(FunctionType check)
V8_INLINE Token::Value ScanIdentifierOrKeyword()
base::uc32 ScanIdentifierUnicodeEscape()
static constexpr base::uc32 kEndOfInput
const TokenDesc & next_next_next() const
Token::Value SkipSingleLineComment()
static const int kMaxAscii
V8_INLINE Token::Value SkipWhiteSpace()
static constexpr base::uc32 Invalid()
Token::Value ScanHtmlComment()
Token::Value Select(Token::Value tok)
Token::Value ScanPrivateName()
const TokenDesc & current() const
V8_INLINE bool has_parser_error() const
#define CALL_GET_SCAN_FLAGS(N)
V8_INLINE bool IsLineTerminator(uchar c)
bool IsIdentifierStart(base::uc32 c)
@ kIdentifierNeedsSlowPath
@ kMultilineCommentCharacterNeedsSlowPath
constexpr bool CanBeKeywordCharacter(char c)
constexpr bool IsKeywordStart(char c)
bool CanBeKeyword(uint8_t scan_flags)
constexpr Token::Value GetOneCharToken(char c)
constexpr bool IsAsciiIdentifier(base::uc32 c)
bool IsWhiteSpaceOrLineTerminator(base::uc32 c)
static const constexpr Token::Value one_char_tokens[128]
constexpr bool IsInString(const char(&s)[N], char c, size_t i=0)
bool CharCanBeKeyword(base::uc32 c)
bool TerminatesLiteral(uint8_t scan_flags)
static constexpr const uint8_t character_scan_flags[128]
bool IdentifierNeedsSlowPath(uint8_t scan_flags)
Disallow flags or implications overriding each other abort_on_contradictory_flags true
bool MayTerminateString(uint8_t scan_flags)
constexpr bool IsDecimalDigit(base::uc32 c)
V8_INLINE Token::Value KeywordOrIdentifierToken(const uint8_t *input, int input_length)
bool MultilineCommentCharacterNeedsSlowPath(uint8_t scan_flags)
constexpr uint8_t GetScanFlags(char c)
#define KEYWORD_GROUP_CHECK(ch)
#define KEYWORD_GROUP_CASE(ch)
#define KEYWORD_CHECK(keyword, token)
#define KEYWORD(keyword, token)
#define KEYWORDS(KEYWORD_GROUP, KEYWORD)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
LiteralBuffer literal_chars
bool after_line_terminator
#define INT_0_TO_127_LIST(V)
#define V8_LIKELY(condition)
#define V8_UNLIKELY(condition)