diff options
Diffstat (limited to 'js/src/frontend/TokenKind.h')
-rw-r--r-- | js/src/frontend/TokenKind.h | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/js/src/frontend/TokenKind.h b/js/src/frontend/TokenKind.h new file mode 100644 index 000000000..6f22d78e5 --- /dev/null +++ b/js/src/frontend/TokenKind.h @@ -0,0 +1,245 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef frontend_TokenKind_h +#define frontend_TokenKind_h + +/* + * List of token kinds and their ranges. + * + * The format for each line is: + * + * macro(<TOKEN_KIND_NAME>, <DESCRIPTION>) + * + * or + * + * range(<TOKEN_RANGE_NAME>, <TOKEN_KIND_NAME>) + * + * where ; + * <TOKEN_KIND_NAME> is a legal C identifier of the token, that will be used in + * the JS engine source, with `TOK_` prefix. + * + * <DESCRIPTION> is a string that describe about the token, and will be used in + * error message. + * + * <TOKEN_RANGE_NAME> is a legal C identifier of the range that will be used to + * JS engine source, with `TOK_` prefix. It should end with `_FIRST` or `_LAST`. + * This is used to check TokenKind by range-testing: + * TOK_BINOP_FIRST <= tt && tt <= TOK_BINOP_LAST + * + * Second argument of `range` is the actual value of the <TOKEN_RANGE_NAME>, + * should be same as one of <TOKEN_KIND_NAME> in other `macro`s. + * + * To use this macro, define two macros for `macro` and `range`, and pass them + * as arguments. + * + * #define EMIT_TOKEN(name, desc) ... + * #define EMIT_RANGE(name, value) ... + * FOR_EACH_TOKEN_KIND_WITH_RANGE(EMIT_TOKEN, EMIT_RANGE) + * #undef EMIT_TOKEN + * #undef EMIT_RANGE + * + * If you don't need range data, use FOR_EACH_TOKEN_KIND instead. + * + * #define EMIT_TOKEN(name, desc) ... + * FOR_EACH_TOKEN_KIND(EMIT_TOKEN) + * #undef EMIT_TOKEN + * + * Note that this list does not contain ERROR and LIMIT. + */ +#define FOR_EACH_TOKEN_KIND_WITH_RANGE(macro, range) \ + macro(EOF, "end of script") \ + \ + /* only returned by peekTokenSameLine() */ \ + macro(EOL, "line terminator") \ + \ + macro(SEMI, "';'") \ + macro(COMMA, "','") \ + macro(HOOK, "'?'") /* conditional */ \ + macro(COLON, "':'") /* conditional */ \ + macro(INC, "'++'") /* increment */ \ + macro(DEC, "'--'") /* decrement */ \ + macro(DOT, "'.'") /* member operator */ \ + macro(TRIPLEDOT, "'...'") /* rest arguments and spread operator */ \ + macro(LB, "'['") \ + macro(RB, "']'") \ + macro(LC, "'{'") \ + macro(RC, "'}'") \ + macro(LP, "'('") \ + macro(RP, "')'") \ + macro(NAME, "identifier") \ + macro(NUMBER, "numeric literal") \ + macro(STRING, "string literal") \ + \ + /* start of template literal with substitutions */ \ + macro(TEMPLATE_HEAD, "'${'") \ + /* template literal without substitutions */ \ + macro(NO_SUBS_TEMPLATE, "template literal") \ + \ + macro(REGEXP, "regular expression literal") \ + macro(TRUE, "boolean literal 'true'") \ + macro(FALSE, "boolean literal 'false'") \ + macro(NULL, "null literal") \ + macro(THIS, "keyword 'this'") \ + macro(FUNCTION, "keyword 'function'") \ + macro(IF, "keyword 'if'") \ + macro(ELSE, "keyword 'else'") \ + macro(SWITCH, "keyword 'switch'") \ + macro(CASE, "keyword 'case'") \ + macro(DEFAULT, "keyword 'default'") \ + macro(WHILE, "keyword 'while'") \ + macro(DO, "keyword 'do'") \ + macro(FOR, "keyword 'for'") \ + macro(BREAK, "keyword 'break'") \ + macro(CONTINUE, "keyword 'continue'") \ + macro(VAR, "keyword 'var'") \ + macro(CONST, "keyword 'const'") \ + macro(WITH, "keyword 'with'") \ + macro(RETURN, "keyword 'return'") \ + macro(NEW, "keyword 'new'") \ + macro(DELETE, "keyword 'delete'") \ + macro(TRY, "keyword 'try'") \ + macro(CATCH, "keyword 'catch'") \ + macro(FINALLY, "keyword 'finally'") \ + macro(THROW, "keyword 'throw'") \ + macro(DEBUGGER, "keyword 'debugger'") \ + macro(YIELD, "keyword 'yield'") \ + macro(AWAIT, "keyword 'await'") \ + macro(EXPORT, "keyword 'export'") \ + macro(IMPORT, "keyword 'import'") \ + macro(CLASS, "keyword 'class'") \ + macro(EXTENDS, "keyword 'extends'") \ + macro(SUPER, "keyword 'super'") \ + macro(RESERVED, "reserved keyword") \ + /* reserved keywords in strict mode */ \ + macro(STRICT_RESERVED, "reserved keyword") \ + \ + /* \ + * The following token types occupy contiguous ranges to enable easy \ + * range-testing. \ + */ \ + /* \ + * Binary operators tokens, TOK_OR thru TOK_POW. These must be in the same \ + * order as F(OR) and friends in FOR_EACH_PARSE_NODE_KIND in ParseNode.h. \ + */ \ + macro(OR, "'||'") /* logical or */ \ + range(BINOP_FIRST, OR) \ + macro(AND, "'&&'") /* logical and */ \ + macro(BITOR, "'|'") /* bitwise-or */ \ + macro(BITXOR, "'^'") /* bitwise-xor */ \ + macro(BITAND, "'&'") /* bitwise-and */ \ + \ + /* Equality operation tokens, per TokenKindIsEquality. */ \ + macro(STRICTEQ, "'==='") \ + range(EQUALITY_START, STRICTEQ) \ + macro(EQ, "'=='") \ + macro(STRICTNE, "'!=='") \ + macro(NE, "'!='") \ + range(EQUALITY_LAST, NE) \ + \ + /* Relational ops, per TokenKindIsRelational. */ \ + macro(LT, "'<'") \ + range(RELOP_START, LT) \ + macro(LE, "'<='") \ + macro(GT, "'>'") \ + macro(GE, "'>='") \ + range(RELOP_LAST, GE) \ + \ + macro(INSTANCEOF, "keyword 'instanceof'") \ + macro(IN, "keyword 'in'") \ + \ + /* Shift ops, per TokenKindIsShift. */ \ + macro(LSH, "'<<'") \ + range(SHIFTOP_START, LSH) \ + macro(RSH, "'>>'") \ + macro(URSH, "'>>>'") \ + range(SHIFTOP_LAST, URSH) \ + \ + macro(ADD, "'+'") \ + macro(SUB, "'-'") \ + macro(MUL, "'*'") \ + macro(DIV, "'/'") \ + macro(MOD, "'%'") \ + macro(POW, "'**'") \ + range(BINOP_LAST, POW) \ + \ + /* Unary operation tokens. */ \ + macro(TYPEOF, "keyword 'typeof'") \ + macro(VOID, "keyword 'void'") \ + macro(NOT, "'!'") \ + macro(BITNOT, "'~'") \ + \ + macro(ARROW, "'=>'") /* function arrow */ \ + \ + /* Assignment ops, per TokenKindIsAssignment */ \ + macro(ASSIGN, "'='") \ + range(ASSIGNMENT_START, ASSIGN) \ + macro(ADDASSIGN, "'+='") \ + macro(SUBASSIGN, "'-='") \ + macro(BITORASSIGN, "'|='") \ + macro(BITXORASSIGN, "'^='") \ + macro(BITANDASSIGN, "'&='") \ + macro(LSHASSIGN, "'<<='") \ + macro(RSHASSIGN, "'>>='") \ + macro(URSHASSIGN, "'>>>='") \ + macro(MULASSIGN, "'*='") \ + macro(DIVASSIGN, "'/='") \ + macro(MODASSIGN, "'%='") \ + macro(POWASSIGN, "'**='") \ + range(ASSIGNMENT_LAST, POWASSIGN) + +#define TOKEN_KIND_RANGE_EMIT_NONE(name, value) +#define FOR_EACH_TOKEN_KIND(macro) \ + FOR_EACH_TOKEN_KIND_WITH_RANGE(macro, TOKEN_KIND_RANGE_EMIT_NONE) + +namespace js { +namespace frontend { + +// Values of this type are used to index into arrays such as isExprEnding[], +// so the first value must be zero. +enum TokenKind { +#define EMIT_ENUM(name, desc) TOK_##name, +#define EMIT_ENUM_RANGE(name, value) TOK_##name = TOK_##value, + FOR_EACH_TOKEN_KIND_WITH_RANGE(EMIT_ENUM, EMIT_ENUM_RANGE) +#undef EMIT_ENUM +#undef EMIT_ENUM_RANGE + TOK_LIMIT // domain size +}; + +inline bool +TokenKindIsBinaryOp(TokenKind tt) +{ + return TOK_BINOP_FIRST <= tt && tt <= TOK_BINOP_LAST; +} + +inline bool +TokenKindIsEquality(TokenKind tt) +{ + return TOK_EQUALITY_START <= tt && tt <= TOK_EQUALITY_LAST; +} + +inline bool +TokenKindIsRelational(TokenKind tt) +{ + return TOK_RELOP_START <= tt && tt <= TOK_RELOP_LAST; +} + +inline bool +TokenKindIsShift(TokenKind tt) +{ + return TOK_SHIFTOP_START <= tt && tt <= TOK_SHIFTOP_LAST; +} + +inline bool +TokenKindIsAssignment(TokenKind tt) +{ + return TOK_ASSIGNMENT_START <= tt && tt <= TOK_ASSIGNMENT_LAST; +} + +} // namespace frontend +} // namespace js + +#endif /* frontend_TokenKind_h */ |