// Copyright 2012 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_TOKEN_H_
#define V8_TOKEN_H_

#include "src/base/logging.h"
#include "src/globals.h"

namespace v8 {
namespace internal {

// TOKEN_LIST takes a list of 3 macros M, all of which satisfy the
// same signature M(name, string, precedence), where name is the
// symbolic token name, string is the corresponding syntactic symbol
// (or NULL, for literals), and precedence is the precedence (or 0).
// The parameters are invoked for token categories as follows:
//
//   T: Non-keyword tokens
//   K: Keyword tokens

// IGNORE_TOKEN is a convenience macro that can be supplied as
// an argument (at any position) for a TOKEN_LIST call. It does
// nothing with tokens belonging to the respective category.

#define IGNORE_TOKEN(name, string, precedence)

#define TOKEN_LIST(T, K)                                             \
  /* End of source indicator. */                                     \
  T(EOS, "EOS", 0)                                                   \
                                                                     \
  /* Punctuators (ECMA-262, section 7.7, page 15). */                \
  T(LPAREN, "(", 0)                                                  \
  T(RPAREN, ")", 0)                                                  \
  T(LBRACK, "[", 0)                                                  \
  T(RBRACK, "]", 0)                                                  \
  T(LBRACE, "{", 0)                                                  \
  T(RBRACE, "}", 0)                                                  \
  T(COLON, ":", 0)                                                   \
  T(SEMICOLON, ";", 0)                                               \
  T(PERIOD, ".", 0)                                                  \
  T(CONDITIONAL, "?", 3)                                             \
  T(INC, "++", 0)                                                    \
  T(DEC, "--", 0)                                                    \
  T(ARROW, "=>", 0)                                                  \
                                                                     \
  /* Assignment operators. */                                        \
  /* IsAssignmentOp() and Assignment::is_compound() relies on */     \
  /* this block of enum values being contiguous and sorted in the */ \
  /* same order! */                                                  \
  T(INIT_VAR, "=init_var", 2)                   /* AST-use only. */  \
  T(INIT_LET, "=init_let", 2)                   /* AST-use only. */  \
  T(INIT_CONST, "=init_const", 2)               /* AST-use only. */  \
  T(INIT_CONST_LEGACY, "=init_const_legacy", 2) /* AST-use only. */  \
  T(ASSIGN, "=", 2)                                                  \
  T(ASSIGN_BIT_OR, "|=", 2)                                          \
  T(ASSIGN_BIT_XOR, "^=", 2)                                         \
  T(ASSIGN_BIT_AND, "&=", 2)                                         \
  T(ASSIGN_SHL, "<<=", 2)                                            \
  T(ASSIGN_SAR, ">>=", 2)                                            \
  T(ASSIGN_SHR, ">>>=", 2)                                           \
  T(ASSIGN_ADD, "+=", 2)                                             \
  T(ASSIGN_SUB, "-=", 2)                                             \
  T(ASSIGN_MUL, "*=", 2)                                             \
  T(ASSIGN_DIV, "/=", 2)                                             \
  T(ASSIGN_MOD, "%=", 2)                                             \
                                                                     \
  /* Binary operators sorted by precedence. */                       \
  /* IsBinaryOp() relies on this block of enum values */             \
  /* being contiguous and sorted in the same order! */               \
  T(COMMA, ",", 1)                                                   \
  T(OR, "||", 4)                                                     \
  T(AND, "&&", 5)                                                    \
  T(BIT_OR, "|", 6)                                                  \
  T(BIT_XOR, "^", 7)                                                 \
  T(BIT_AND, "&", 8)                                                 \
  T(SHL, "<<", 11)                                                   \
  T(SAR, ">>", 11)                                                   \
  T(SHR, ">>>", 11)                                                  \
  T(ROR, "rotate right", 11) /* only used by Crankshaft */           \
  T(ADD, "+", 12)                                                    \
  T(SUB, "-", 12)                                                    \
  T(MUL, "*", 13)                                                    \
  T(DIV, "/", 13)                                                    \
  T(MOD, "%", 13)                                                    \
                                                                     \
  /* Compare operators sorted by precedence. */                      \
  /* IsCompareOp() relies on this block of enum values */            \
  /* being contiguous and sorted in the same order! */               \
  T(EQ, "==", 9)                                                     \
  T(NE, "!=", 9)                                                     \
  T(EQ_STRICT, "===", 9)                                             \
  T(NE_STRICT, "!==", 9)                                             \
  T(LT, "<", 10)                                                     \
  T(GT, ">", 10)                                                     \
  T(LTE, "<=", 10)                                                   \
  T(GTE, ">=", 10)                                                   \
  K(INSTANCEOF, "instanceof", 10)                                    \
  K(IN, "in", 10)                                                    \
                                                                     \
  /* Unary operators. */                                             \
  /* IsUnaryOp() relies on this block of enum values */              \
  /* being contiguous and sorted in the same order! */               \
  T(NOT, "!", 0)                                                     \
  T(BIT_NOT, "~", 0)                                                 \
  K(DELETE, "delete", 0)                                             \
  K(TYPEOF, "typeof", 0)                                             \
  K(VOID, "void", 0)                                                 \
                                                                     \
  /* Keywords (ECMA-262, section 7.5.2, page 13). */                 \
  K(BREAK, "break", 0)                                               \
  K(CASE, "case", 0)                                                 \
  K(CATCH, "catch", 0)                                               \
  K(CONTINUE, "continue", 0)                                         \
  K(DEBUGGER, "debugger", 0)                                         \
  K(DEFAULT, "default", 0)                                           \
  /* DELETE */                                                       \
  K(DO, "do", 0)                                                     \
  K(ELSE, "else", 0)                                                 \
  K(FINALLY, "finally", 0)                                           \
  K(FOR, "for", 0)                                                   \
  K(FUNCTION, "function", 0)                                         \
  K(IF, "if", 0)                                                     \
  /* IN */                                                           \
  /* INSTANCEOF */                                                   \
  K(NEW, "new", 0)                                                   \
  K(RETURN, "return", 0)                                             \
  K(SWITCH, "switch", 0)                                             \
  K(THIS, "this", 0)                                                 \
  K(THROW, "throw", 0)                                               \
  K(TRY, "try", 0)                                                   \
  /* TYPEOF */                                                       \
  K(VAR, "var", 0)                                                   \
  /* VOID */                                                         \
  K(WHILE, "while", 0)                                               \
  K(WITH, "with", 0)                                                 \
                                                                     \
  /* Literals (ECMA-262, section 7.8, page 16). */                   \
  K(NULL_LITERAL, "null", 0)                                         \
  K(TRUE_LITERAL, "true", 0)                                         \
  K(FALSE_LITERAL, "false", 0)                                       \
  T(NUMBER, NULL, 0)                                                 \
  T(STRING, NULL, 0)                                                 \
                                                                     \
  /* Identifiers (not keywords or future reserved words). */         \
  T(IDENTIFIER, NULL, 0)                                             \
                                                                     \
  /* Future reserved words (ECMA-262, section 7.6.1.2). */           \
  T(FUTURE_RESERVED_WORD, NULL, 0)                                   \
  T(FUTURE_STRICT_RESERVED_WORD, NULL, 0)                            \
  K(CLASS, "class", 0)                                               \
  K(CONST, "const", 0)                                               \
  K(EXPORT, "export", 0)                                             \
  K(EXTENDS, "extends", 0)                                           \
  K(IMPORT, "import", 0)                                             \
  K(LET, "let", 0)                                                   \
  K(STATIC, "static", 0)                                             \
  K(YIELD, "yield", 0)                                               \
  K(SUPER, "super", 0)                                               \
                                                                     \
  /* Illegal token - not able to scan. */                            \
  T(ILLEGAL, "ILLEGAL", 0)                                           \
                                                                     \
  /* Scanner-internal use only. */                                   \
  T(WHITESPACE, NULL, 0)                                             \
                                                                     \
  /* ES6 Template Literals */                                        \
  T(TEMPLATE_SPAN, NULL, 0)                                          \
  T(TEMPLATE_TAIL, NULL, 0)


class Token {
 public:
  // All token values.
#define T(name, string, precedence) name,
  enum Value {
    TOKEN_LIST(T, T)
    NUM_TOKENS
  };
#undef T

  // Returns a string corresponding to the C++ token name
  // (e.g. "LT" for the token LT).
  static const char* Name(Value tok) {
    DCHECK(tok < NUM_TOKENS);  // tok is unsigned
    return name_[tok];
  }

  // Predicates
  static bool IsKeyword(Value tok) {
    return token_type[tok] == 'K';
  }

  static bool IsIdentifier(Value tok, StrictMode strict_mode,
                           bool is_generator) {
    switch (tok) {
      case IDENTIFIER:
        return true;
      case FUTURE_STRICT_RESERVED_WORD:
      case LET:
      case STATIC:
        return strict_mode == SLOPPY;
      case YIELD:
        return !is_generator && strict_mode == SLOPPY;
      default:
        return false;
    }
    UNREACHABLE();
    return false;
  }

  static bool IsAssignmentOp(Value tok) {
    return INIT_VAR <= tok && tok <= ASSIGN_MOD;
  }

  static bool IsBinaryOp(Value op) {
    return COMMA <= op && op <= MOD;
  }

  static bool IsTruncatingBinaryOp(Value op) {
    return BIT_OR <= op && op <= ROR;
  }

  static bool IsCompareOp(Value op) {
    return EQ <= op && op <= IN;
  }

  static bool IsOrderedRelationalCompareOp(Value op) {
    return op == LT || op == LTE || op == GT || op == GTE;
  }

  static bool IsEqualityOp(Value op) {
    return op == EQ || op == EQ_STRICT;
  }

  static bool IsInequalityOp(Value op) {
    return op == NE || op == NE_STRICT;
  }

  static bool IsArithmeticCompareOp(Value op) {
    return IsOrderedRelationalCompareOp(op) ||
        IsEqualityOp(op) || IsInequalityOp(op);
  }

  static Value NegateCompareOp(Value op) {
    DCHECK(IsArithmeticCompareOp(op));
    switch (op) {
      case EQ: return NE;
      case NE: return EQ;
      case EQ_STRICT: return NE_STRICT;
      case NE_STRICT: return EQ_STRICT;
      case LT: return GTE;
      case GT: return LTE;
      case LTE: return GT;
      case GTE: return LT;
      default:
        UNREACHABLE();
        return op;
    }
  }

  static Value ReverseCompareOp(Value op) {
    DCHECK(IsArithmeticCompareOp(op));
    switch (op) {
      case EQ: return EQ;
      case NE: return NE;
      case EQ_STRICT: return EQ_STRICT;
      case NE_STRICT: return NE_STRICT;
      case LT: return GT;
      case GT: return LT;
      case LTE: return GTE;
      case GTE: return LTE;
      default:
        UNREACHABLE();
        return op;
    }
  }

  static bool IsBitOp(Value op) {
    return (BIT_OR <= op && op <= SHR) || op == BIT_NOT;
  }

  static bool IsUnaryOp(Value op) {
    return (NOT <= op && op <= VOID) || op == ADD || op == SUB;
  }

  static bool IsCountOp(Value op) {
    return op == INC || op == DEC;
  }

  static bool IsShiftOp(Value op) {
    return (SHL <= op) && (op <= SHR);
  }

  // Returns a string corresponding to the JS token string
  // (.e., "<" for the token LT) or NULL if the token doesn't
  // have a (unique) string (e.g. an IDENTIFIER).
  static const char* String(Value tok) {
    DCHECK(tok < NUM_TOKENS);  // tok is unsigned.
    return string_[tok];
  }

  // Returns the precedence > 0 for binary and compare
  // operators; returns 0 otherwise.
  static int Precedence(Value tok) {
    DCHECK(tok < NUM_TOKENS);  // tok is unsigned.
    return precedence_[tok];
  }

 private:
  static const char* const name_[NUM_TOKENS];
  static const char* const string_[NUM_TOKENS];
  static const int8_t precedence_[NUM_TOKENS];
  static const char token_type[NUM_TOKENS];
};

} }  // namespace v8::internal

#endif  // V8_TOKEN_H_
