package dtool.parser;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertUnreachable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DeeTokenHelper {
public static final List<DeeTokens> keyWords_All;
public static final List<DeeTokens> keyWords_control;
public static final List<DeeTokens> keyWords_literalValues;
public static final List<DeeTokens> keyWords_nativeTypes;
static {
ArrayList<DeeTokens> allKeyWords_init = new ArrayList<>();
ArrayList<DeeTokens> controlKeyWords_init = new ArrayList<>();
ArrayList<DeeTokens> literalValueKeyWords_init = new ArrayList<>();
ArrayList<DeeTokens> nativeTypeKeyWords_init = new ArrayList<>();
for (DeeTokens tokenType : DeeTokens.values()) {
if(isKeyword(tokenType)) {
allKeyWords_init.add(tokenType);
switch(getTokenTypeCategory(tokenType)) {
case CONTROL:
controlKeyWords_init.add(tokenType);
break;
case LITERAL_VALUE:
literalValueKeyWords_init.add(tokenType);
break;
case NATIVE_TYPE:
nativeTypeKeyWords_init.add(tokenType);
break;
}
}
}
keyWords_All = Collections.unmodifiableList(allKeyWords_init);
keyWords_control = Collections.unmodifiableList(controlKeyWords_init);
keyWords_literalValues = Collections.unmodifiableList(literalValueKeyWords_init);
keyWords_nativeTypes = Collections.unmodifiableList(nativeTypeKeyWords_init);
}
public static boolean isKeyword(DeeTokens tokenType) {
TokensCategory category = getTokenTypeCategory(tokenType);
return
category == TokensCategory.NATIVE_TYPE ||
category == TokensCategory.CONTROL ||
category == TokensCategory.LITERAL_VALUE;
}
public static enum TokensCategory { NATIVE_TYPE, CONTROL, LITERAL_VALUE, }
public static TokensCategory getTokenTypeCategory(DeeTokens tokenType) {
// BM: Add other categories for remaining tokens? They are not nedeed at the moment.
// But nonetheless we list all DeeTokens in switch to make sure we dont miss any
switch (tokenType) {
case GROUP_COMMENT:
case GROUP_STRING:
case GROUP_INTEGER:
case GROUP_FLOAT:
case GROUP_ATTRIBUTE_KW:
case GROUP_PRIMITIVE_KW:
case GROUP_PROTECTION_KW:
return null; // Return null for artificial grouping tokens
case EOF:
return null;
case INVALID_TOKEN:
return null;
case LINE_END:
case WHITESPACE:
return null;
case COMMENT_MULTI:
case COMMENT_NESTED:
case COMMENT_LINE:
case DOCCOMMENT_MULTI:
case DOCCOMMENT_NESTED:
case DOCCOMMENT_LINE:
return null; // COMMENT
case SCRIPT_LINE_INTRO:
return null;
case SPECIAL_TOKEN_LINE:
return null;
case IDENTIFIER:
return null;
case KW_BOOL:
case KW_VOID:
case KW_BYTE:
case KW_UBYTE:
case KW_SHORT:
case KW_USHORT:
case KW_INT:
case KW_UINT:
case KW_LONG:
case KW_ULONG:
case KW_CHAR:
case KW_WCHAR:
case KW_DCHAR:
case KW_FLOAT:
case KW_DOUBLE:
case KW_REAL:
case KW_IFLOAT:
case KW_IDOUBLE:
case KW_IREAL:
case KW_CFLOAT:
case KW_CDOUBLE:
case KW_CREAL:
case KW_CENT:
case KW_UCENT:
return TokensCategory.NATIVE_TYPE;
case KW_PRIVATE:
case KW_PACKAGE:
case KW_PROTECTED:
case KW_PUBLIC:
case KW_EXPORT:
case KW_ABSTRACT:
case KW_CONST:
case KW_IMMUTABLE:
case KW_INOUT:
case KW_SHARED:
case KW_DEPRECATED:
case KW_FINAL:
case KW_NOTHROW:
case KW_OVERRIDE:
case KW_PURE:
case KW_SCOPE:
case KW_STATIC:
case KW_SYNCHRONIZED:
case KW_REF:
case KW_AUTO:
case KW_ALIAS:
case KW_ALIGN:
case KW_ASM:
case KW_ASSERT:
case KW_BODY:
case KW_BREAK:
case KW_CASE:
case KW_CAST:
case KW_CATCH:
case KW_CLASS:
case KW_CONTINUE:
case KW_DEBUG:
case KW_DEFAULT:
case KW_DELEGATE:
case KW_DELETE:
case KW_DO:
case KW_ELSE:
case KW_ENUM:
case KW_EXTERN:
case KW_FINALLY:
case KW_FOR:
case KW_FOREACH:
case KW_FOREACH_REVERSE:
case KW_FUNCTION:
case KW_GOTO:
case KW_IF:
case KW_IMPORT:
case KW_IN:
case KW_INTERFACE:
case KW_INVARIANT:
case KW_IS:
case KW_LAZY:
case KW_MACRO:
case KW_MIXIN:
case KW_MODULE:
case KW_NEW:
case KW_OUT:
case KW_PRAGMA:
case KW_RETURN:
case KW_STRUCT:
case KW_SWITCH:
case KW_TEMPLATE:
case KW_THROW:
case KW_TRY:
case KW_TYPEDEF:
case KW_TYPEID:
case KW_TYPEOF:
case KW_UNION:
case KW_UNITTEST:
case KW_VERSION:
case KW_VOLATILE:
case KW_WHILE:
case KW_WITH:
case KW___TRAITS:
case KW___GSHARED:
case KW___THREAD:
case KW___VECTOR:
return TokensCategory.CONTROL;
case KW_THIS:
case KW_SUPER:
return TokensCategory.CONTROL;
case KW_TRUE:
case KW_FALSE:
case KW_NULL:
case KW___FILE__:
case KW___LINE__:
case KW___MODULE__:
case KW___FUNCTION__:
case KW___PRETTY_FUNCTION__:
case KW___DATE__:
case KW___TIME__:
case KW___TIMESTAMP__:
case KW___VENDOR__:
case KW___VERSION__:
return TokensCategory.LITERAL_VALUE;
case STRING_WYSIWYG:
case STRING_DQ:
case STRING_HEX:
case STRING_DELIM:
case STRING_TOKENS:
return null;
case CHARACTER:
return null;
case INTEGER_DECIMAL:
case INTEGER_BINARY:
case INTEGER_OCTAL:
case INTEGER_HEX:
return null;
case FLOAT_DECIMAL:
case FLOAT_HEX:
return null;
case OPEN_PARENS:
case CLOSE_PARENS:
case OPEN_BRACE:
case CLOSE_BRACE:
case OPEN_BRACKET:
case CLOSE_BRACKET:
case SEMICOLON:
case COLON:
return null;
case QUESTION:
case COMMA:
case DOLLAR:
case AT:
case DOT:
case DOUBLE_DOT:
case TRIPLE_DOT:
case MINUS:
case MINUS_ASSIGN:
case DECREMENT:
case PLUS:
case PLUS_ASSIGN:
case INCREMENT:
case DIV:
case DIV_ASSIGN:
case STAR:
case MULT_ASSIGN:
case MOD:
case MOD_ASSIGN:
case POW:
case POW_ASSIGN:
case AND:
case AND_ASSIGN:
case LOGICAL_AND:
case OR:
case OR_ASSIGN:
case LOGICAL_OR:
case XOR:
case XOR_ASSIGN:
case CONCAT:
case CONCAT_ASSIGN:
case LAMBDA:
case ASSIGN:
case EQUALS:
case NOT:
case NOT_EQUAL:
case LESS_THAN:
case LESS_EQUAL:
case GREATER_THAN:
case GREATER_EQUAL:
case LESS_GREATER:
case LESS_GREATER_EQUAL:
case UNORDERED_E:
case UNORDERED:
case UNORDERED_GE:
case UNORDERED_G:
case UNORDERED_LE:
case UNORDERED_L:
case LEFT_SHIFT:
case LEFT_SHIFT_ASSIGN:
case RIGHT_SHIFT:
case RIGHT_SHIFT_ASSIGN:
case TRIPLE_RSHIFT:
case TRIPLE_RSHIFT_ASSIGN:
return null;
} throw assertUnreachable();
}
}