5 #ifndef V8_PARSING_TOKEN_H_ 6 #define V8_PARSING_TOKEN_H_ 8 #include "src/base/logging.h" 9 #include "src/globals.h" 10 #include "src/utils.h" 28 #define IGNORE_TOKEN(name, string, precedence) 32 #define BINARY_OP_TOKEN_LIST(T, E) \ 33 E(T, BIT_OR, "|", 6) \ 34 E(T, BIT_XOR, "^", 7) \ 35 E(T, BIT_AND, "&", 8) \ 38 E(T, SHR, ">>>", 11) \ 46 #define EXPAND_BINOP_ASSIGN_TOKEN(T, name, string, precedence) \ 47 T(ASSIGN_##name, string "=", 2) 49 #define EXPAND_BINOP_TOKEN(T, name, string, precedence) \ 50 T(name, string, precedence) 52 #define TOKEN_LIST(T, K, C) \ 58 T(TEMPLATE_SPAN, nullptr, 0) \ 59 T(TEMPLATE_TAIL, nullptr, 0) \ 74 T(ELLIPSIS, "...", 0) \ 75 T(CONDITIONAL, "?", 3) \ 77 T(SEMICOLON, ";", 0) \ 90 BINARY_OP_TOKEN_LIST(T, EXPAND_BINOP_ASSIGN_TOKEN) \ 104 BINARY_OP_TOKEN_LIST(T, EXPAND_BINOP_TOKEN) \ 108 K(DELETE, "delete", 0) \ 109 K(TYPEOF, "typeof", 0) \ 122 T(EQ_STRICT, "===", 9) \ 124 T(NE_STRICT, "!==", 9) \ 129 K(INSTANCEOF, "instanceof", 10) \ 133 K(BREAK, "break", 0) \ 135 K(CATCH, "catch", 0) \ 136 K(CONTINUE, "continue", 0) \ 137 K(DEBUGGER, "debugger", 0) \ 138 K(DEFAULT, "default", 0) \ 142 K(FINALLY, "finally", 0) \ 144 K(FUNCTION, "function", 0) \ 149 K(RETURN, "return", 0) \ 150 K(SWITCH, "switch", 0) \ 151 K(THROW, "throw", 0) \ 156 K(WHILE, "while", 0) \ 161 K(NULL_LITERAL, "null", 0) \ 162 K(TRUE_LITERAL, "true", 0) \ 163 K(FALSE_LITERAL, "false", 0) \ 164 T(NUMBER, nullptr, 0) \ 166 T(BIGINT, nullptr, 0) \ 167 T(STRING, nullptr, 0) \ 170 K(SUPER, "super", 0) \ 173 T(IDENTIFIER, nullptr, 0) \ 174 K(ASYNC, "async", 0) \ 176 K(AWAIT, "await", 0) \ 177 K(YIELD, "yield", 0) \ 179 K(STATIC, "static", 0) \ 181 T(FUTURE_STRICT_RESERVED_WORD, nullptr, 0) \ 182 T(ESCAPED_STRICT_RESERVED_WORD, nullptr, 0) \ 186 K(CLASS, "class", 0) \ 187 K(CONST, "const", 0) \ 188 K(EXPORT, "export", 0) \ 189 K(EXTENDS, "extends", 0) \ 190 K(IMPORT, "import", 0) \ 191 T(PRIVATE_NAME, nullptr, 0) \ 194 T(ILLEGAL, "ILLEGAL", 0) \ 195 T(ESCAPED_KEYWORD, nullptr, 0) \ 198 T(WHITESPACE, nullptr, 0) \ 199 T(UNINITIALIZED, nullptr, 0) \ 200 T(REGEXP_LITERAL, nullptr, 0) 205 #define T(name, string, precedence) name, 206 enum Value : uint8_t { TOKEN_LIST(
T,
T,
T) NUM_TOKENS };
211 static const char*
Name(Value token) {
212 DCHECK_GT(NUM_TOKENS, token);
216 static char TypeForTesting(Value token) {
return token_type[token]; }
219 static bool IsKeyword(Value token) {
return token_type[token] ==
'K'; }
221 static bool IsIdentifier(Value token, LanguageMode language_mode,
222 bool is_generator,
bool disallow_await) {
223 if (IsInRange(token, IDENTIFIER, ASYNC))
return true;
224 if (IsInRange(token, LET, ESCAPED_STRICT_RESERVED_WORD)) {
225 return is_sloppy(language_mode);
227 if (token == AWAIT)
return !disallow_await;
228 if (token == YIELD)
return !is_generator && is_sloppy(language_mode);
232 static bool IsCallable(Value token) {
return IsInRange(token, SUPER, ENUM); }
234 static bool IsAutoSemicolon(Value token) {
235 return IsInRange(token, SEMICOLON, EOS);
238 static bool IsAnyIdentifier(Value token) {
239 return IsInRange(token, IDENTIFIER, ENUM);
242 static bool IsStrictReservedWord(Value token) {
243 return IsInRange(token, LET, ESCAPED_STRICT_RESERVED_WORD);
246 static bool IsLiteral(Value token) {
247 return IsInRange(token, NULL_LITERAL, STRING);
250 static bool IsTemplate(Value token) {
251 return IsInRange(token, TEMPLATE_SPAN, TEMPLATE_TAIL);
254 static bool IsMember(Value token) {
255 return IsInRange(token, TEMPLATE_SPAN, LBRACK);
258 static bool IsProperty(Value token) {
259 return IsInRange(token, PERIOD, LBRACK);
262 static bool IsPropertyOrCall(Value token) {
263 return IsInRange(token, TEMPLATE_SPAN, LPAREN);
266 static bool IsArrowOrAssignmentOp(Value token) {
267 return IsInRange(token, ARROW, ASSIGN_SUB);
270 static bool IsAssignmentOp(Value token) {
271 return IsInRange(token, INIT, ASSIGN_SUB);
274 static bool IsBinaryOp(Value op) {
return IsInRange(op, COMMA, SUB); }
276 static bool IsCompareOp(Value op) {
return IsInRange(op, EQ, IN); }
278 static bool IsOrderedRelationalCompareOp(Value op) {
279 return IsInRange(op, LT, GTE);
282 static bool IsEqualityOp(Value op) {
return IsInRange(op, EQ, EQ_STRICT); }
284 static Value BinaryOpForAssignment(Value op) {
285 DCHECK(IsInRange(op, ASSIGN_BIT_OR, ASSIGN_SUB));
286 Value result =
static_cast<Value
>(op - ASSIGN_BIT_OR + BIT_OR);
287 DCHECK(IsBinaryOp(result));
291 static bool IsBitOp(Value op) {
292 return IsInRange(op, BIT_OR, SHR) || op == BIT_NOT;
295 static bool IsUnaryOp(Value op) {
return IsInRange(op, ADD, VOID); }
296 static bool IsCountOp(Value op) {
return IsInRange(op, INC, DEC); }
297 static bool IsUnaryOrCountOp(Value op) {
return IsInRange(op, ADD, DEC); }
298 static bool IsShiftOp(Value op) {
return IsInRange(op, SHL, SHR); }
303 static const char*
String(Value token) {
304 DCHECK_GT(NUM_TOKENS, token);
305 return string_[token];
308 static uint8_t StringLength(Value token) {
309 DCHECK_GT(NUM_TOKENS, token);
310 return string_length_[token];
315 static int Precedence(Value token,
bool accept_IN) {
316 DCHECK_GT(NUM_TOKENS, token);
317 return precedence_[accept_IN][token];
321 static const char*
const name_[NUM_TOKENS];
322 static const char*
const string_[NUM_TOKENS];
323 static const uint8_t string_length_[NUM_TOKENS];
324 static const int8_t precedence_[2][NUM_TOKENS];
325 static const char token_type[NUM_TOKENS];
331 #endif // V8_PARSING_TOKEN_H_