215#define T(name, string, precedence) name,
230 static bool IsKeyword(
Value token) {
231 return IsKeywordBits::decode(token_flags[token]);
234 static bool IsPropertyName(
Value token) {
235 return IsPropertyNameBits::decode(token_flags[token]);
241 bool disallow_await) {
242 if (
V8_LIKELY(base::IsInRange(token, kIdentifier,
kAsync)))
return true;
243 if (token == kAwait)
return !disallow_await;
244 if (token == kYield)
return !is_generator &&
is_sloppy(language_mode);
245 return IsStrictReservedWord(token) &&
is_sloppy(language_mode);
248 static bool IsCallable(
Value token) {
249 return base::IsInRange(token, kSuper, kEscapedStrictReservedWord);
252 static bool IsAutoSemicolon(
Value token) {
253 return base::IsInRange(token, kSemicolon, kEos);
256 static bool IsAnyIdentifier(
Value token) {
257 return base::IsInRange(token, kIdentifier, kEscapedStrictReservedWord);
260 static bool IsStrictReservedWord(
Value token) {
261 return base::IsInRange(token, kYield, kEscapedStrictReservedWord);
264 static bool IsLiteral(
Value token) {
265 return base::IsInRange(token, kNullLiteral,
kString);
268 static bool IsTemplate(
Value token) {
269 return base::IsInRange(token, kTemplateSpan, kTemplateTail);
272 static bool IsMember(
Value token) {
273 return base::IsInRange(token, kTemplateSpan, kLeftBracket);
276 static bool IsProperty(
Value token) {
277 return base::IsInRange(token, kPeriod, kLeftBracket);
280 static bool IsPropertyOrCall(
Value token) {
281 return base::IsInRange(token, kTemplateSpan, kLeftParen);
284 static bool IsArrowOrAssignmentOp(
Value token) {
285 return base::IsInRange(token, kArrow, kAssignSub);
288 static bool IsAssignmentOp(
Value token) {
289 return base::IsInRange(token,
kInit, kAssignSub);
292 static bool IsLogicalAssignmentOp(
Value token) {
293 return base::IsInRange(token, kAssignNullish, kAssignAnd);
296 static bool IsBinaryOp(
Value op) {
return base::IsInRange(op, kComma, kSub); }
298 static bool IsCompareOp(
Value op) {
return base::IsInRange(op, kEq, kIn); }
300 static bool IsOrderedRelationalCompareOp(
Value op) {
301 return base::IsInRange(op,
kLessThan, kGreaterThanEq);
304 static bool IsEqualityOp(
Value op) {
305 return base::IsInRange(op, kEq, kEqStrict);
308 static Value BinaryOpForAssignment(
Value op) {
309 DCHECK(base::IsInRange(op, kAssignNullish, kAssignSub));
315 static bool IsBitOp(
Value op) {
316 return base::IsInRange(op, kBitOr, kShr) || op == kBitNot;
319 static bool IsUnaryOp(
Value op) {
return base::IsInRange(op, kAdd, kVoid); }
320 static bool IsCountOp(
Value op) {
return base::IsInRange(op, kInc, kDec); }
321 static bool IsUnaryOrCountOp(
Value op) {
322 return base::IsInRange(op, kAdd, kDec);
324 static bool IsShiftOp(
Value op) {
return base::IsInRange(op, kShl, kShr); }
334 static uint8_t StringLength(
Value token) {
336 return string_length_[token];
341 static int Precedence(
Value token,
bool accept_IN) {
343 return precedence_[accept_IN][token];
347 static const char*
const name_[kNumTokens];
349 static const uint8_t string_length_[kNumTokens];
350 static const int8_t precedence_[2][kNumTokens];
351 static const uint8_t token_flags[kNumTokens];