package jdk.nashorn.internal.parser;
import static jdk.nashorn.internal.parser.TokenKind.BINARY;
import static jdk.nashorn.internal.parser.TokenKind.BRACKET;
import static jdk.nashorn.internal.parser.TokenKind.FUTURE;
import static jdk.nashorn.internal.parser.TokenKind.FUTURESTRICT;
import static jdk.nashorn.internal.parser.TokenKind.IR;
import static jdk.nashorn.internal.parser.TokenKind.KEYWORD;
import static jdk.nashorn.internal.parser.TokenKind.LITERAL;
import static jdk.nashorn.internal.parser.TokenKind.SPECIAL;
import static jdk.nashorn.internal.parser.TokenKind.UNARY;
import java.util.Locale;
@SuppressWarnings("javadoc")
public enum TokenType {
ERROR (SPECIAL, null),
EOF (SPECIAL, null),
EOL (SPECIAL, null),
COMMENT (SPECIAL, null),
DIRECTIVE_COMMENT (SPECIAL, null),
NOT (UNARY, "!", 14, false),
NE (BINARY, "!=", 9, true),
NE_STRICT (BINARY, "!==", 9, true),
MOD (BINARY, "%", 13, true),
ASSIGN_MOD (BINARY, "%=", 2, false),
BIT_AND (BINARY, "&", 8, true),
AND (BINARY, "&&", 5, true),
ASSIGN_BIT_AND (BINARY, "&=", 2, false),
LPAREN (BRACKET, "(", 16, true),
RPAREN (BRACKET, ")", 0, true),
MUL (BINARY, "*", 13, true),
ASSIGN_MUL (BINARY, "*=", 2, false),
POS (UNARY, "+", 14, false),
ADD (BINARY, "+", 12, true),
INCPREFIX (UNARY, "++", 15, true),
ASSIGN_ADD (BINARY, "+=", 2, false),
COMMARIGHT (BINARY, ",", 1, true),
NEG (UNARY, "-", 14, false),
SUB (BINARY, "-", 12, true),
DECPREFIX (UNARY, "--", 15, true),
ASSIGN_SUB (BINARY, "-=", 2, false),
PERIOD (BRACKET, ".", 17, true),
DIV (BINARY, "/", 13, true),
ASSIGN_DIV (BINARY, "/=", 2, false),
COLON (BINARY, ":"),
SEMICOLON (BINARY, ";"),
LT (BINARY, "<", 10, true),
SHL (BINARY, "<<", 11, true),
ASSIGN_SHL (BINARY, "<<=", 2, false),
LE (BINARY, "<=", 10, true),
ASSIGN (BINARY, "=", 2, false),
EQ (BINARY, "==", 9, true),
EQ_STRICT (BINARY, "===", 9, true),
ARROW (BINARY, "=>", 2, true),
GT (BINARY, ">", 10, true),
GE (BINARY, ">=", 10, true),
SAR (BINARY, ">>", 11, true),
ASSIGN_SAR (BINARY, ">>=", 2, false),
SHR (BINARY, ">>>", 11, true),
ASSIGN_SHR (BINARY, ">>>=", 2, false),
TERNARY (BINARY, "?", 3, false),
LBRACKET (BRACKET, "[", 17, true),
RBRACKET (BRACKET, "]", 0, true),
BIT_XOR (BINARY, "^", 7, true),
ASSIGN_BIT_XOR (BINARY, "^=", 2, false),
LBRACE (BRACKET, "{"),
BIT_OR (BINARY, "|", 6, true),
ASSIGN_BIT_OR (BINARY, "|=", 2, false),
OR (BINARY, "||", 4, true),
RBRACE (BRACKET, "}"),
BIT_NOT (UNARY, "~", 14, false),
ELLIPSIS (UNARY, "..."),
BREAK (KEYWORD, "break"),
CASE (KEYWORD, "case"),
CATCH (KEYWORD, "catch"),
CLASS (FUTURE, "class"),
CONST (KEYWORD, "const"),
CONTINUE (KEYWORD, "continue"),
DEBUGGER (KEYWORD, "debugger"),
DEFAULT (KEYWORD, "default"),
DELETE (UNARY, "delete", 14, false),
DO (KEYWORD, "do"),
ELSE (KEYWORD, "else"),
ENUM (FUTURE, "enum"),
EXPORT (FUTURE, "export"),
EXTENDS (FUTURE, "extends"),
FALSE (LITERAL, "false"),
FINALLY (KEYWORD, "finally"),
FOR (KEYWORD, "for"),
FUNCTION (KEYWORD, "function"),
IF (KEYWORD, "if"),
IMPLEMENTS (FUTURESTRICT, "implements"),
IMPORT (FUTURE, "import"),
IN (BINARY, "in", 10, true),
INSTANCEOF (BINARY, "instanceof", 10, true),
INTERFACE (FUTURESTRICT, "interface"),
LET (FUTURESTRICT, "let"),
NEW (UNARY, "new", 17, false),
NULL (LITERAL, "null"),
PACKAGE (FUTURESTRICT, "package"),
PRIVATE (FUTURESTRICT, "private"),
PROTECTED (FUTURESTRICT, "protected"),
PUBLIC (FUTURESTRICT, "public"),
RETURN (KEYWORD, "return"),
STATIC (FUTURESTRICT, "static"),
SUPER (FUTURE, "super"),
SWITCH (KEYWORD, "switch"),
THIS (KEYWORD, "this"),
THROW (KEYWORD, "throw"),
TRUE (LITERAL, "true"),
TRY (KEYWORD, "try"),
TYPEOF (UNARY, "typeof", 14, false),
VAR (KEYWORD, "var"),
VOID (UNARY, "void", 14, false),
WHILE (KEYWORD, "while"),
WITH (KEYWORD, "with"),
YIELD (FUTURESTRICT, "yield"),
DECIMAL (LITERAL, null),
HEXADECIMAL (LITERAL, null),
OCTAL_LEGACY (LITERAL, null),
OCTAL (LITERAL, null),
BINARY_NUMBER (LITERAL, null),
FLOATING (LITERAL, null),
STRING (LITERAL, null),
ESCSTRING (LITERAL, null),
EXECSTRING (LITERAL, null),
IDENT (LITERAL, null),
REGEX (LITERAL, null),
XML (LITERAL, null),
OBJECT (LITERAL, null),
ARRAY (LITERAL, null),
TEMPLATE (LITERAL, null),
TEMPLATE_HEAD (LITERAL, null),
TEMPLATE_MIDDLE(LITERAL, null),
TEMPLATE_TAIL (LITERAL, null),
DECPOSTFIX (IR, null),
INCPOSTFIX (IR, null),
SPREAD_ARGUMENT(IR, null),
SPREAD_ARRAY (IR, null),
YIELD_STAR (IR, null);
private TokenType next;
private final TokenKind kind;
private final String name;
private final int precedence;
private final boolean isLeftAssociative;
private static final TokenType[] values;
TokenType(final TokenKind kind, final String name) {
next = null;
this.kind = kind;
this.name = name;
precedence = 0;
isLeftAssociative = false;
}
TokenType(final TokenKind kind, final String name, final int precedence, final boolean isLeftAssociative) {
next = null;
this.kind = kind;
this.name = name;
this.precedence = precedence;
this.isLeftAssociative = isLeftAssociative;
}
public boolean needsParens(final TokenType other, final boolean isLeft) {
return other.precedence != 0 &&
(precedence > other.precedence ||
precedence == other.precedence && isLeftAssociative && !isLeft);
}
public boolean isOperator(final boolean noIn) {
return kind == BINARY && (!noIn || this != IN) && precedence != 0;
}
public int getLength() {
assert name != null : "Token name not set";
return name.length();
}
public String getName() {
return name;
}
public String getNameOrType() {
return name == null ? super.name().toLowerCase(Locale.ENGLISH) : name;
}
public TokenType getNext() {
return next;
}
public void setNext(final TokenType next) {
this.next = next;
}
public TokenKind getKind() {
return kind;
}
public int getPrecedence() {
return precedence;
}
public boolean isLeftAssociative() {
return isLeftAssociative;
}
boolean startsWith(final char c) {
return name != null && name.length() > 0 && name.charAt(0) == c;
}
static TokenType[] getValues() {
return values;
}
@Override
public String toString() {
return getNameOrType();
}
static {
values = TokenType.values();
}
}