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