13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_PARSING_TOKEN_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_PARSING_TOKEN_H_ 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/logging.h" 9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/globals.h" 103e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// TOKEN_LIST takes a list of 3 macros M, all of which satisfy the 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// same signature M(name, string, precedence), where name is the 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// symbolic token name, string is the corresponding syntactic symbol 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (or NULL, for literals), and precedence is the precedence (or 0). 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The parameters are invoked for token categories as follows: 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// T: Non-keyword tokens 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// K: Keyword tokens 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// IGNORE_TOKEN is a convenience macro that can be supplied as 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// an argument (at any position) for a TOKEN_LIST call. It does 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// nothing with tokens belonging to the respective category. 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define IGNORE_TOKEN(name, string, precedence) 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TOKEN_LIST(T, K) \ 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* End of source indicator. */ \ 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(EOS, "EOS", 0) \ 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Punctuators (ECMA-262, section 7.7, page 15). */ \ 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(LPAREN, "(", 0) \ 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(RPAREN, ")", 0) \ 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(LBRACK, "[", 0) \ 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(RBRACK, "]", 0) \ 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(LBRACE, "{", 0) \ 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(RBRACE, "}", 0) \ 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(COLON, ":", 0) \ 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(SEMICOLON, ";", 0) \ 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(PERIOD, ".", 0) \ 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T(ELLIPSIS, "...", 0) \ 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(CONDITIONAL, "?", 3) \ 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(INC, "++", 0) \ 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(DEC, "--", 0) \ 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ARROW, "=>", 0) \ 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Assignment operators. */ \ 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* IsAssignmentOp() and Assignment::is_compound() relies on */ \ 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* this block of enum values being contiguous and sorted in the */ \ 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* same order! */ \ 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T(INIT, "=init", 2) /* AST-use only. */ \ 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN, "=", 2) \ 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_BIT_OR, "|=", 2) \ 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_BIT_XOR, "^=", 2) \ 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_BIT_AND, "&=", 2) \ 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_SHL, "<<=", 2) \ 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_SAR, ">>=", 2) \ 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_SHR, ">>>=", 2) \ 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_ADD, "+=", 2) \ 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_SUB, "-=", 2) \ 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_MUL, "*=", 2) \ 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_DIV, "/=", 2) \ 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ASSIGN_MOD, "%=", 2) \ 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Binary operators sorted by precedence. */ \ 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* IsBinaryOp() relies on this block of enum values */ \ 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* being contiguous and sorted in the same order! */ \ 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(COMMA, ",", 1) \ 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(OR, "||", 4) \ 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(AND, "&&", 5) \ 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(BIT_OR, "|", 6) \ 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(BIT_XOR, "^", 7) \ 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(BIT_AND, "&", 8) \ 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(SHL, "<<", 11) \ 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(SAR, ">>", 11) \ 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(SHR, ">>>", 11) \ 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ROR, "rotate right", 11) /* only used by Crankshaft */ \ 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ADD, "+", 12) \ 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(SUB, "-", 12) \ 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(MUL, "*", 13) \ 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(DIV, "/", 13) \ 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(MOD, "%", 13) \ 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Compare operators sorted by precedence. */ \ 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* IsCompareOp() relies on this block of enum values */ \ 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* being contiguous and sorted in the same order! */ \ 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(EQ, "==", 9) \ 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(NE, "!=", 9) \ 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(EQ_STRICT, "===", 9) \ 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(NE_STRICT, "!==", 9) \ 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(LT, "<", 10) \ 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(GT, ">", 10) \ 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(LTE, "<=", 10) \ 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(GTE, ">=", 10) \ 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(INSTANCEOF, "instanceof", 10) \ 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(IN, "in", 10) \ 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Unary operators. */ \ 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* IsUnaryOp() relies on this block of enum values */ \ 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* being contiguous and sorted in the same order! */ \ 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(NOT, "!", 0) \ 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(BIT_NOT, "~", 0) \ 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(DELETE, "delete", 0) \ 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(TYPEOF, "typeof", 0) \ 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(VOID, "void", 0) \ 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Keywords (ECMA-262, section 7.5.2, page 13). */ \ 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(BREAK, "break", 0) \ 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(CASE, "case", 0) \ 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(CATCH, "catch", 0) \ 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(CONTINUE, "continue", 0) \ 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(DEBUGGER, "debugger", 0) \ 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(DEFAULT, "default", 0) \ 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* DELETE */ \ 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(DO, "do", 0) \ 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(ELSE, "else", 0) \ 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(FINALLY, "finally", 0) \ 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(FOR, "for", 0) \ 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(FUNCTION, "function", 0) \ 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(IF, "if", 0) \ 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* IN */ \ 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* INSTANCEOF */ \ 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(NEW, "new", 0) \ 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(RETURN, "return", 0) \ 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(SWITCH, "switch", 0) \ 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(THIS, "this", 0) \ 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(THROW, "throw", 0) \ 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(TRY, "try", 0) \ 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* TYPEOF */ \ 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(VAR, "var", 0) \ 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* VOID */ \ 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(WHILE, "while", 0) \ 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(WITH, "with", 0) \ 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Literals (ECMA-262, section 7.8, page 16). */ \ 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(NULL_LITERAL, "null", 0) \ 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(TRUE_LITERAL, "true", 0) \ 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(FALSE_LITERAL, "false", 0) \ 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(NUMBER, NULL, 0) \ 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T(SMI, NULL, 0) \ 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(STRING, NULL, 0) \ 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Identifiers (not keywords or future reserved words). */ \ 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(IDENTIFIER, NULL, 0) \ 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Future reserved words (ECMA-262, section 7.6.1.2). */ \ 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(FUTURE_RESERVED_WORD, NULL, 0) \ 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(FUTURE_STRICT_RESERVED_WORD, NULL, 0) \ 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(CLASS, "class", 0) \ 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(CONST, "const", 0) \ 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(EXPORT, "export", 0) \ 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(EXTENDS, "extends", 0) \ 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(IMPORT, "import", 0) \ 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(LET, "let", 0) \ 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(STATIC, "static", 0) \ 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(YIELD, "yield", 0) \ 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch K(SUPER, "super", 0) \ 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Illegal token - not able to scan. */ \ 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T(ILLEGAL, "ILLEGAL", 0) \ 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T(ESCAPED_KEYWORD, NULL, 0) \ 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T(ESCAPED_STRICT_RESERVED_WORD, NULL, 0) \ 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* Scanner-internal use only. */ \ 167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier T(WHITESPACE, NULL, 0) \ 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch T(UNINITIALIZED, NULL, 0) \ 169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier \ 170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /* ES6 Template Literals */ \ 171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier T(TEMPLATE_SPAN, NULL, 0) \ 172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier T(TEMPLATE_TAIL, NULL, 0) 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Token { 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // All token values. 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define T(name, string, precedence) name, 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Value { 18069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch TOKEN_LIST(T, T) 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NUM_TOKENS 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef T 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns a string corresponding to the C++ token name 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // (e.g. "LT" for the token LT). 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* Name(Value tok) { 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(tok < NUM_TOKENS); // tok is unsigned 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return name_[tok]; 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Predicates 193bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch static bool IsKeyword(Value tok) { 194bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch return token_type[tok] == 'K'; 195bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 196bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsIdentifier(Value tok, LanguageMode language_mode, 198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool is_generator) { 199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (tok) { 200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case IDENTIFIER: 201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return true; 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case ESCAPED_STRICT_RESERVED_WORD: 203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case FUTURE_STRICT_RESERVED_WORD: 204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case LET: 205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case STATIC: 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return is_sloppy(language_mode); 207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case YIELD: 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return !is_generator && is_sloppy(language_mode); 209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: 210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; 211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier UNREACHABLE(); 213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; 214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool IsAssignmentOp(Value tok) { 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return INIT <= tok && tok <= ASSIGN_MOD; 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool IsBinaryOp(Value op) { 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return COMMA <= op && op <= MOD; 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsTruncatingBinaryOp(Value op) { 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return BIT_OR <= op && op <= ROR; 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool IsCompareOp(Value op) { 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return EQ <= op && op <= IN; 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static bool IsOrderedRelationalCompareOp(Value op) { 233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return op == LT || op == LTE || op == GT || op == GTE; 234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static bool IsEqualityOp(Value op) { 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return op == EQ || op == EQ_STRICT; 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsInequalityOp(Value op) { 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return op == NE || op == NE_STRICT; 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsArithmeticCompareOp(Value op) { 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsOrderedRelationalCompareOp(op) || 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsEqualityOp(op) || IsInequalityOp(op); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Value NegateCompareOp(Value op) { 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsArithmeticCompareOp(op)); 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op) { 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case EQ: return NE; 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case NE: return EQ; 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case EQ_STRICT: return NE_STRICT; 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NE_STRICT: return EQ_STRICT; 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case LT: return GTE; 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case GT: return LTE; 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case LTE: return GT; 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case GTE: return LT; 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return op; 263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Value ReverseCompareOp(Value op) { 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsArithmeticCompareOp(op)); 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op) { 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EQ: return EQ; 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NE: return NE; 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EQ_STRICT: return EQ_STRICT; 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case NE_STRICT: return NE_STRICT; 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case LT: return GT; 274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case GT: return LT; 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case LTE: return GTE; 276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case GTE: return LTE; 277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return op; 280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool IsBitOp(Value op) { 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (BIT_OR <= op && op <= SHR) || op == BIT_NOT; 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool IsUnaryOp(Value op) { 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (NOT <= op && op <= VOID) || op == ADD || op == SUB; 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool IsCountOp(Value op) { 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return op == INC || op == DEC; 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen static bool IsShiftOp(Value op) { 29680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return (SHL <= op) && (op <= SHR); 29780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen } 29880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns a string corresponding to the JS token string 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // (.e., "<" for the token LT) or NULL if the token doesn't 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // have a (unique) string (e.g. an IDENTIFIER). 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* String(Value tok) { 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(tok < NUM_TOKENS); // tok is unsigned. 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return string_[tok]; 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the precedence > 0 for binary and compare 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // operators; returns 0 otherwise. 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Precedence(Value tok) { 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(tok < NUM_TOKENS); // tok is unsigned. 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return precedence_[tok]; 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 31544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const name_[NUM_TOKENS]; 31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const string_[NUM_TOKENS]; 31744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int8_t precedence_[NUM_TOKENS]; 318bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch static const char token_type[NUM_TOKENS]; 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_PARSING_TOKEN_H_ 325