tenko
Version:
A "pixel perfect" 100% spec compliant ES2021 JavaScript parser written in JS.
1,396 lines (1,382 loc) • 131 kB
JavaScript
// All constants in this file will be extrapolated and unconditionally inlined in a build without scope tracking
// (Make sure to only make primitives `const`, use `let` for anything else. Even if it's a constant value otherwise.)
import {
ASSERT,
} from './utils.mjs';
import {
$$F_66,
} from "./charcodes.mjs"
// First LEAF_BITS bits are not flags (!), they are "leaf" token types (decimal number, template tail).
// Other bits are flags, used to augment for super groups (string, number, template)
// (If the number of leafs exceeds LEAF_BITS bits then it'll reduce the number of available bitwise flags)
const LEAF_BITS = 8;
let __$flag_leaf = 0; // This name is hardcoded in the build script...
let __$flag_group = LEAF_BITS - 1; // offset 0, this name is hardcoded in the build script... keep value in sync
// Groups get their own bit. This makes it easier to quickly check for a set of token types (string, string | number)
// Additionally, modifiers get their own bit. Like bigint suffix or bad escapes. Generally these should apply to more
// than one token, otherwise it can just go below as their own leaf type.
const $G_WHITE = (1 << ++__$flag_group);
const $G_NEWLINE = (1 << ++__$flag_group);
const $G_COMMENT = (1 << ++__$flag_group);
const $G_IDENT = (1 << ++__$flag_group);
const $G_NUMBER = (1 << ++__$flag_group);
const $G_NUMBER_BIG_INT = (1 << ++__$flag_group); // modifies certain number types, they end with `n`; https://tc39.es/proposal-bigint/#sec-grammar-change
const $G_PUNCTUATOR = (1 << ++__$flag_group);
const $G_BINOP_ASSIGN = (1 << ++__$flag_group);
const $G_BINOP_NONASSIGN = (1 << ++__$flag_group);
const $G_STRING = (1 << ++__$flag_group);
const $G_REGEX = (1 << ++__$flag_group);
const $G_TICK = (1 << ++__$flag_group);
const $G_TICK_BAD_ESCAPE = (1 << ++__$flag_group);
const $G_OTHER = (1 << ++__$flag_group);
let ALL_GEES;
ASSERT(ALL_GEES = [$G_WHITE, $G_NEWLINE, $G_COMMENT, $G_IDENT, $G_NUMBER, $G_NUMBER_BIG_INT, $G_PUNCTUATOR, $G_BINOP_ASSIGN, $G_BINOP_NONASSIGN, $G_STRING, $G_REGEX, $G_TICK, $G_TICK_BAD_ESCAPE]);
ASSERT(__$flag_group < 32, 'cannot use more than 32 flags but have ' + __$flag_group);
// Token types that are mutually exclusive can be encoded as as a unique id within a few bits of sequential space
// You can still have group bits to complement these but it's far more space efficient this way
// I don't think you should ever need the $L constants outside of defining the concrete token type constants below...
// Note: leaf 0 is reserved for $IDENT
const $L_SPACE = ++__$flag_leaf;
const $L_TAB = ++__$flag_leaf;
const $L_NL_SINGLE = ++__$flag_leaf;
const $L_NL_CRLF = ++__$flag_leaf;
const $L_COMMENT_SINGLE = ++__$flag_leaf;
const $L_COMMENT_MULTI = ++__$flag_leaf;
const $L_COMMENT_HTML = ++__$flag_leaf;
const $L_IDENT = 0; // This is a hack which causes the leaf bits to be clear. This way (value | $IDENT) yields, at least, $IDENT without destroying an $ID_foo special keyword
const $L_NUMBER_HEX = ++__$flag_leaf;
const $L_NUMBER_DEC = ++__$flag_leaf;
const $L_NUMBER_BIN = ++__$flag_leaf;
const $L_NUMBER_OCT = ++__$flag_leaf;
const $L_NUMBER_OLD = ++__$flag_leaf;
const $L_REGEXN = ++__$flag_leaf;
const $L_REGEXU = ++__$flag_leaf;
const $L_STRING_SINGLE = ++__$flag_leaf;
const $L_STRING_DOUBLE = ++__$flag_leaf;
const $L_TICK_HEAD = ++__$flag_leaf;
const $L_TICK_BODY = ++__$flag_leaf;
const $L_TICK_TAIL = ++__$flag_leaf;
const $L_TICK_PURE = ++__$flag_leaf;
const $L_EOF = ++__$flag_leaf;
const $L_ASI = ++__$flag_leaf;
const $L_ERROR = ++__$flag_leaf;
// Important Idents
const $L_ID_arguments = ++__$flag_leaf;
const $L_ID_as = ++__$flag_leaf;
const $L_ID_async = ++__$flag_leaf;
const $L_ID_await = ++__$flag_leaf;
const $L_ID_break = ++__$flag_leaf;
const $L_ID_case = ++__$flag_leaf;
const $L_ID_catch = ++__$flag_leaf;
const $L_ID_class = ++__$flag_leaf;
const $L_ID_const = ++__$flag_leaf;
const $L_ID_continue = ++__$flag_leaf;
const $L_ID_debugger = ++__$flag_leaf;
const $L_ID_default = ++__$flag_leaf;
const $L_ID_delete = ++__$flag_leaf;
const $L_ID_do = ++__$flag_leaf;
const $L_ID_else = ++__$flag_leaf;
const $L_ID_enum = ++__$flag_leaf;
const $L_ID_eval = ++__$flag_leaf;
const $L_ID_export = ++__$flag_leaf;
const $L_ID_extends = ++__$flag_leaf;
const $L_ID_false = ++__$flag_leaf;
const $L_ID_finally = ++__$flag_leaf;
const $L_ID_for = ++__$flag_leaf;
const $L_ID_from = ++__$flag_leaf;
const $L_ID_function = ++__$flag_leaf;
const $L_ID_get = ++__$flag_leaf;
const $L_ID_if = ++__$flag_leaf;
const $L_ID_implements = ++__$flag_leaf;
const $L_ID_import = ++__$flag_leaf;
const $L_ID_in = ++__$flag_leaf;
const $L_ID_instanceof = ++__$flag_leaf;
const $L_ID_interface = ++__$flag_leaf;
const $L_ID_let = ++__$flag_leaf;
const $L_ID_new = ++__$flag_leaf;
const $L_ID_null = ++__$flag_leaf;
const $L_ID_of = ++__$flag_leaf;
const $L_ID_package = ++__$flag_leaf;
const $L_ID_private = ++__$flag_leaf;
const $L_ID_protected = ++__$flag_leaf;
const $L_ID_public = ++__$flag_leaf;
const $L_ID_return = ++__$flag_leaf;
const $L_ID_set = ++__$flag_leaf;
const $L_ID_static = ++__$flag_leaf;
const $L_ID_super = ++__$flag_leaf;
const $L_ID_switch = ++__$flag_leaf;
const $L_ID_target = ++__$flag_leaf;
const $L_ID_this = ++__$flag_leaf;
const $L_ID_throw = ++__$flag_leaf;
const $L_ID_true = ++__$flag_leaf;
const $L_ID_try = ++__$flag_leaf;
const $L_ID_typeof = ++__$flag_leaf;
const $L_ID_var = ++__$flag_leaf;
const $L_ID_void = ++__$flag_leaf;
const $L_ID_while = ++__$flag_leaf;
const $L_ID_with = ++__$flag_leaf;
const $L_ID_yield = ++__$flag_leaf;
// Punctuators
const $L_EXCL = ++__$flag_leaf;
const $L_EXCL_EQ = ++__$flag_leaf;
const $L_EXCL_EQ_EQ = ++__$flag_leaf;
const $L_PERCENT = ++__$flag_leaf;
const $L_PERCENT_EQ = ++__$flag_leaf;
const $L_AND = ++__$flag_leaf;
const $L_AND_AND = ++__$flag_leaf;
const $L_AND_AND_EQ = ++__$flag_leaf;
const $L_AND_EQ = ++__$flag_leaf;
const $L_PAREN_OPEN = ++__$flag_leaf;
const $L_PAREN_CLOSE = ++__$flag_leaf;
const $L_STAR = ++__$flag_leaf;
const $L_STAR_STAR = ++__$flag_leaf;
const $L_STAR_EQ = ++__$flag_leaf;
const $L_STAR_STAR_EQ = ++__$flag_leaf;
const $L_PLUS = ++__$flag_leaf;
const $L_PLUS_PLUS = ++__$flag_leaf;
const $L_PLUS_EQ = ++__$flag_leaf;
const $L_COMMA = ++__$flag_leaf;
const $L_MIN = ++__$flag_leaf;
const $L_MIN_MIN = ++__$flag_leaf;
const $L_MIN_EQ = ++__$flag_leaf;
const $L_MIN_MIN_GT = ++__$flag_leaf;
const $L_DOT = ++__$flag_leaf;
const $L_DOT_DOT_DOT = ++__$flag_leaf;
const $L_DIV = ++__$flag_leaf;
const $L_DIV_EQ = ++__$flag_leaf;
const $L_COLON = ++__$flag_leaf;
const $L_SEMI = ++__$flag_leaf;
const $L_LT = ++__$flag_leaf;
const $L_LT_LT = ++__$flag_leaf;
const $L_LT_EQ = ++__$flag_leaf;
const $L_LT_LT_EQ = ++__$flag_leaf;
const $L_LT_EXCL_MIN_MIN = ++__$flag_leaf;
const $L_EQ = ++__$flag_leaf;
const $L_EQ_EQ = ++__$flag_leaf;
const $L_EQ_EQ_EQ = ++__$flag_leaf;
const $L_EQ_GT = ++__$flag_leaf;
const $L_GT = ++__$flag_leaf;
const $L_GT_GT = ++__$flag_leaf;
const $L_GT_GT_GT = ++__$flag_leaf;
const $L_GT_EQ = ++__$flag_leaf;
const $L_GT_GT_EQ = ++__$flag_leaf;
const $L_GT_GT_GT_EQ = ++__$flag_leaf;
const $L_QMARK = ++__$flag_leaf;
const $L_QMARK_DOT = ++__$flag_leaf;
const $L_QMARK_QMARK = ++__$flag_leaf;
const $L_QMARK_QMARK_EQ = ++__$flag_leaf;
const $L_BRACKET_OPEN = ++__$flag_leaf;
const $L_BRACKET_CLOSE = ++__$flag_leaf;
const $L_CARET = ++__$flag_leaf;
const $L_CARET_EQ = ++__$flag_leaf;
const $L_CURLY_OPEN = ++__$flag_leaf;
const $L_OR = ++__$flag_leaf;
const $L_OR_OR = ++__$flag_leaf;
const $L_OR_OR_EQ = ++__$flag_leaf;
const $L_OR_EQ = ++__$flag_leaf;
const $L_CURLY_CLOSE = ++__$flag_leaf;
const $L_TILDE = ++__$flag_leaf;
ASSERT(__$flag_leaf < (1<<LEAF_BITS), 'cannot use more than LEAF_BITS (' + LEAF_BITS + ') bits of space (' + (1<<LEAF_BITS) + ') but am requesting ' + __$flag_leaf);
// These are the token types and you should be able to do strict comparison against specific token types with
// `curtok` or `token.type`. Every constant maps to a single number which is a combination of a bitwise field and
// a range of numbers, all within a 32bit space (which is a hard limitation due to bitwise ops in JS being 32bit)
// TODO: A future expansion, space permitting, would mark certain tokens as a particular string, like `in` or `=>`.
// TODO: For this we can reserve more flags as continuous space. How much depends on how many groups we really need.
// TODO: These token value constants would need their own continuous space to still be able to treat them generically.
const $UNTYPED = 0;
const $SPACE = $L_SPACE | $G_WHITE;
const $TAB = $L_TAB | $G_WHITE;
const $NL_SOLO = $L_NL_SINGLE | $G_WHITE | $G_NEWLINE; // Any specced line terminator that is not the combination of crlf
const $NL_CRLF = $L_NL_CRLF | $G_WHITE | $G_NEWLINE;
const $COMMENT_SINGLE = $L_COMMENT_SINGLE | $G_COMMENT | $G_WHITE;
const $COMMENT_MULTI = $L_COMMENT_MULTI | $G_COMMENT | $G_WHITE;
const $COMMENT_HTML = $L_COMMENT_HTML | $G_COMMENT | $G_WHITE;
const $IDENT = $L_IDENT | $G_IDENT;
const $ID_arguments = $L_ID_arguments | $G_IDENT;
const $ID_as = $L_ID_as | $G_IDENT;
const $ID_async = $L_ID_async | $G_IDENT;
const $ID_await = $L_ID_await | $G_IDENT;
const $ID_break = $L_ID_break | $G_IDENT;
const $ID_case = $L_ID_case | $G_IDENT;
const $ID_catch = $L_ID_catch | $G_IDENT;
const $ID_class = $L_ID_class | $G_IDENT;
const $ID_const = $L_ID_const | $G_IDENT;
const $ID_continue = $L_ID_continue | $G_IDENT;
const $ID_debugger = $L_ID_debugger | $G_IDENT;
const $ID_default = $L_ID_default | $G_IDENT;
const $ID_delete = $L_ID_delete | $G_IDENT;
const $ID_do = $L_ID_do | $G_IDENT;
const $ID_else = $L_ID_else | $G_IDENT;
const $ID_enum = $L_ID_enum | $G_IDENT;
const $ID_eval = $L_ID_eval | $G_IDENT;
const $ID_export = $L_ID_export | $G_IDENT;
const $ID_extends = $L_ID_extends | $G_IDENT;
const $ID_false = $L_ID_false | $G_IDENT;
const $ID_finally = $L_ID_finally | $G_IDENT;
const $ID_for = $L_ID_for | $G_IDENT;
const $ID_from = $L_ID_from | $G_IDENT;
const $ID_function = $L_ID_function | $G_IDENT;
const $ID_get = $L_ID_get | $G_IDENT;
const $ID_if = $L_ID_if | $G_IDENT;
const $ID_implements = $L_ID_implements | $G_IDENT;
const $ID_import = $L_ID_import | $G_IDENT;
const $ID_in = $L_ID_in | $G_BINOP_NONASSIGN | $G_IDENT;
const $ID_instanceof = $L_ID_instanceof | $G_BINOP_NONASSIGN | $G_IDENT;
const $ID_interface = $L_ID_interface | $G_IDENT;
const $ID_let = $L_ID_let | $G_IDENT;
const $ID_new = $L_ID_new | $G_IDENT;
const $ID_null = $L_ID_null | $G_IDENT;
const $ID_of = $L_ID_of | $G_IDENT;
const $ID_package = $L_ID_package | $G_IDENT;
const $ID_private = $L_ID_private | $G_IDENT;
const $ID_protected = $L_ID_protected | $G_IDENT;
const $ID_public = $L_ID_public | $G_IDENT;
const $ID_return = $L_ID_return | $G_IDENT;
const $ID_set = $L_ID_set | $G_IDENT;
const $ID_static = $L_ID_static | $G_IDENT;
const $ID_super = $L_ID_super | $G_IDENT;
const $ID_switch = $L_ID_switch | $G_IDENT;
const $ID_target = $L_ID_target | $G_IDENT;
const $ID_this = $L_ID_this | $G_IDENT;
const $ID_throw = $L_ID_throw | $G_IDENT;
const $ID_true = $L_ID_true | $G_IDENT;
const $ID_try = $L_ID_try | $G_IDENT;
const $ID_typeof = $L_ID_typeof | $G_IDENT;
const $ID_var = $L_ID_var | $G_IDENT;
const $ID_void = $L_ID_void | $G_IDENT;
const $ID_while = $L_ID_while | $G_IDENT;
const $ID_with = $L_ID_with | $G_IDENT;
const $ID_yield = $L_ID_yield | $G_IDENT;
const $NUMBER_HEX = $L_NUMBER_HEX | $G_NUMBER;
const $NUMBER_DEC = $L_NUMBER_DEC | $G_NUMBER;
const $NUMBER_BIN = $L_NUMBER_BIN | $G_NUMBER;
const $NUMBER_OCT = $L_NUMBER_OCT | $G_NUMBER;
const $NUMBER_OLD = $L_NUMBER_OLD | $G_NUMBER;
const $NUMBER_BIG_HEX = $L_NUMBER_HEX | $G_NUMBER | $G_NUMBER_BIG_INT;
const $NUMBER_BIG_DEC = $L_NUMBER_DEC | $G_NUMBER | $G_NUMBER_BIG_INT;
const $NUMBER_BIG_BIN = $L_NUMBER_BIN | $G_NUMBER | $G_NUMBER_BIG_INT;
const $NUMBER_BIG_OCT = $L_NUMBER_OCT | $G_NUMBER | $G_NUMBER_BIG_INT;
const $PUNC_EXCL = $L_EXCL | $G_PUNCTUATOR;
const $PUNC_EXCL_EQ = $L_EXCL_EQ | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_EXCL_EQ_EQ = $L_EXCL_EQ_EQ | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_PERCENT = $L_PERCENT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_PERCENT_EQ = $L_PERCENT_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_AND = $L_AND | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_AND_AND = $L_AND_AND | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_AND_AND_EQ = $L_AND_AND_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_AND_EQ = $L_AND_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_PAREN_OPEN = $L_PAREN_OPEN | $G_PUNCTUATOR;
const $PUNC_PAREN_CLOSE = $L_PAREN_CLOSE | $G_PUNCTUATOR;
const $PUNC_STAR = $L_STAR | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_STAR_STAR = $L_STAR_STAR | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_STAR_EQ = $L_STAR_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_STAR_STAR_EQ = $L_STAR_STAR_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_PLUS = $L_PLUS | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_PLUS_PLUS = $L_PLUS_PLUS | $G_PUNCTUATOR;
const $PUNC_PLUS_EQ = $L_PLUS_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_COMMA = $L_COMMA | $G_PUNCTUATOR;
const $PUNC_MIN = $L_MIN | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_MIN_MIN = $L_MIN_MIN | $G_PUNCTUATOR;
const $PUNC_MIN_EQ = $L_MIN_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_MIN_MIN_GT = $L_MIN_MIN_GT | $G_PUNCTUATOR;
const $PUNC_DOT = $L_DOT | $G_PUNCTUATOR;
const $PUNC_DOT_DOT_DOT = $L_DOT_DOT_DOT | $G_PUNCTUATOR;
const $PUNC_DIV = $L_DIV | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_DIV_EQ = $L_DIV_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_COLON = $L_COLON | $G_PUNCTUATOR;
const $PUNC_SEMI = $L_SEMI | $G_PUNCTUATOR;
const $PUNC_LT = $L_LT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_LT_LT = $L_LT_LT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_LT_EQ = $L_LT_EQ | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_LT_LT_EQ = $L_LT_LT_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_LT_EXCL_MIN_MIN = $L_LT_EXCL_MIN_MIN | $G_PUNCTUATOR;
const $PUNC_EQ = $L_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_EQ_EQ = $L_EQ_EQ | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_EQ_EQ_EQ = $L_EQ_EQ_EQ | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_EQ_GT = $L_EQ_GT | $G_PUNCTUATOR;
const $PUNC_GT = $L_GT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_GT_GT = $L_GT_GT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_GT_GT_GT = $L_GT_GT_GT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_GT_EQ = $L_GT_EQ | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_GT_GT_EQ = $L_GT_GT_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_GT_GT_GT_EQ = $L_GT_GT_GT_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_QMARK = $L_QMARK | $G_PUNCTUATOR;
const $PUNC_QMARK_DOT = $L_QMARK_DOT | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_QMARK_QMARK = $L_QMARK_QMARK | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_QMARK_QMARK_EQ = $L_QMARK_QMARK | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_BRACKET_OPEN = $L_BRACKET_OPEN | $G_PUNCTUATOR;
const $PUNC_BRACKET_CLOSE = $L_BRACKET_CLOSE | $G_PUNCTUATOR;
const $PUNC_CARET = $L_CARET | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_CARET_EQ = $L_CARET_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_CURLY_OPEN = $L_CURLY_OPEN | $G_PUNCTUATOR;
const $PUNC_OR = $L_OR | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_OR_OR = $L_OR_OR | $G_BINOP_NONASSIGN | $G_PUNCTUATOR;
const $PUNC_OR_OR_EQ = $L_OR_OR_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_OR_EQ = $L_OR_EQ | $G_BINOP_ASSIGN | $G_PUNCTUATOR;
const $PUNC_CURLY_CLOSE = $L_CURLY_CLOSE | $G_PUNCTUATOR;
const $PUNC_TILDE = $L_TILDE | $G_PUNCTUATOR;
const $REGEXN = $L_REGEXN | $G_REGEX; // No u-flag
const $REGEXU = $L_REGEXU | $G_REGEX; // With u-flag ("strict mode" for regular expressions)
const $STRING_SINGLE = $L_STRING_SINGLE | $G_STRING;
const $STRING_DOUBLE = $L_STRING_DOUBLE | $G_STRING;
const $TICK_HEAD = $L_TICK_HEAD | $G_TICK;
const $TICK_BODY = $L_TICK_BODY | $G_TICK;
const $TICK_TAIL = $L_TICK_TAIL | $G_TICK;
const $TICK_PURE = $L_TICK_PURE | $G_TICK;
const $TICK_BAD_HEAD = $L_TICK_HEAD | $G_TICK | $G_TICK_BAD_ESCAPE;
const $TICK_BAD_BODY = $L_TICK_BODY | $G_TICK | $G_TICK_BAD_ESCAPE;
const $TICK_BAD_TAIL = $L_TICK_TAIL | $G_TICK | $G_TICK_BAD_ESCAPE;
const $TICK_BAD_PURE = $L_TICK_PURE | $G_TICK | $G_TICK_BAD_ESCAPE;
const $EOF = $L_EOF | $G_OTHER;
const $ASI = $L_ASI | $G_OTHER;
const $ERROR = $L_ERROR | $G_OTHER;
let KEYWORD_TRIE_OBJLIT = {
0: {
17: { 6: { 20: { 12: { 4: { 13: { 19: { 18: { hit: $ID_arguments, canon: 'arguments' } } } } } } } },
18: {
24: { 13: { 2: { hit: $ID_async, canon: 'async' } } },
hit: $ID_as, canon: 'as'
},
22: { 0: { 8: { 19: { hit: $ID_await, canon: 'await' } } } }
},
1: { 17: { 4: { 0: { 10: { hit: $ID_break, canon: 'break' } } } } },
2: {
0: {
18: { 4: { hit: $ID_case, canon: 'case' } },
19: { 2: { 7: { hit: $ID_catch, canon: 'catch' } } }
},
11: { 0: { 18: { 18: { hit: $ID_class, canon: 'class' } } } },
14: {
13: { 18: { 19: { hit: $ID_const, canon: 'const' } },
19: { 8: { 13: { 20: { 4: { hit: $ID_continue, canon: 'continue' } } } } } }
}
},
3: {
4: {
1: { 20: { 6: { 6: { 4: { 17: { hit: $ID_debugger, canon: 'debugger' } } } } } },
5: { 0: { 20: { 11: { 19: { hit: $ID_default, canon: 'default' } } } } },
11: { 4: { 19: { 4: { hit: $ID_delete, canon: 'delete' } } } }
},
14: { hit: $ID_do, canon: 'do' }
},
4: {
11: { 18: { 4: { hit: $ID_else, canon: 'else' } } },
13: { 20: { 12: { hit: $ID_enum, canon: 'enum' } } },
21: { 0: { 11: { hit: $ID_eval, canon: 'eval' } } },
23: {
15: { 14: { 17: { 19: { hit: $ID_export, canon: 'export' } } } },
19: { 4: { 13: { 3: { 18: { hit: $ID_extends, canon: 'extends' } } } } }
}
},
5: {
0: { 11: { 18: { 4: { hit: $ID_false, canon: 'false' } } } },
8: { 13: { 0: { 11: { 11: { 24: { hit: $ID_finally, canon: 'finally' } } } } } },
14: { 17: { hit: $ID_for, canon: 'for' } },
17: { 14: { 12: { hit: $ID_from, canon: 'from' } } },
20: { 13: { 2: { 19: { 8: { 14: { 13: { hit: $ID_function, canon: 'function' } } } } } } }
},
6: { 4: { 19: { hit: $ID_get, canon: 'get' } } },
8: {
5: { hit: $ID_if, canon: 'if' },
12: { 15: { 11: {
4: { 12: { 4: { 13: { 19: { 18: { hit: $ID_implements, canon: 'implements' } } } } } } },
14: { 17: { 19: { hit: $ID_import, canon: 'import' } } } }
},
13: {
18: { 19: { 0: { 13: { 2: { 4: { 14: { 5: { hit: $ID_instanceof, canon: 'instanceof' } } } } } } } },
19: { 4: { 17: { 5: { 0: { 2: { 4: { hit: $ID_interface, canon: 'interface' } } } } } } },
hit: $ID_in, canon: 'in'
},
},
11: { 4: { 19: { hit: $ID_let, canon: 'let' } } },
13: {
4: { 22: { hit: $ID_new, canon: 'new' } },
20: { 11: { 11: { hit: $ID_null, canon: 'null' } } }
},
14: { 5: { hit: $ID_of, canon: 'of' } },
15: {
0: { 2: { 10: { 0: { 6: { 4: { hit: $ID_package, canon: 'package' } } } } } },
17: {
8: { 21: { 0: { 19: { 4: { hit: $ID_private, canon: 'private' } } } } },
14: { 19: { 4: { 2: { 19: { 4: { 3: { hit: $ID_protected, canon: 'protected' } } } } } } }
},
20: { 1: { 11: { 8: { 2: { hit: $ID_public, canon: 'public' } } } } }
},
17: { 4: { 19: { 20: { 17: { 13: { hit: $ID_return, canon: 'return' } } } } } },
18: {
4: { 19: { hit: $ID_set, canon: 'set' } },
19: { 0: { 19: { 8: { 2: { hit: $ID_static, canon: 'static' } } } } },
20: { 15: { 4: { 17: { hit: $ID_super, canon: 'super' } } } },
22: { 8: { 19: { 2: { 7: { hit: $ID_switch, canon: 'switch' } } } } }
},
19: {
0: { 17: { 6: { 4: { 19: { hit: $ID_target, canon: 'target' } } } } },
7: {
8: { 18: { hit: $ID_this, canon: 'this' } },
17: { 14: { 22: { hit: $ID_throw, canon: 'throw' } } }
},
17: {
20: { 4: { hit: $ID_true, canon: 'true' } },
24: { hit: $ID_try, canon: 'try' }
},
24: { 15: { 4: { 14: { 5: { hit: $ID_typeof, canon: 'typeof' } } } } }
},
21: {
0: { 17: { hit: $ID_var, canon: 'var' } },
14: { 8: { 3: { hit: $ID_void, canon: 'void' } } }
},
22: {
7: { 8: { 11: { 4: { hit: $ID_while, canon: 'while' } } } },
8: { 19: { 7: { hit: $ID_with, canon: 'with' } } }
},
24: { 8: { 4: { 11: { 3: { hit: $ID_yield, canon: 'yield' } } } } }
};
// let KEYWORD_TRIE_OC = Object.create(null, {
// 0: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 6: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 12: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// hit: {value: $ID_arguments},
// canon: {value: 'arguments'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 18: {
// value: Object.create(null, {
// 24: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// hit: {value: $ID_async},
// canon: {value: 'async'}
// })
// }
// })
// }
// })
// },
// hit: {value: $ID_as},
// canon: {value: 'as'}
// }),
// },
// 22: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_await},
// canon: {value: 'await'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 1: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 10: {
// value: Object.create(null, {
// hit: {value: $ID_break},
// canon: {value: 'break'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 2: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_case},
// canon: {value: 'case'}
// })
// }
// })
// },
// 19: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 7: {
// value: Object.create(null, {
// hit: {value: $ID_catch},
// canon: {value: 'catch'}
// })
// }
// })
// }
// })
// }
// })
// },
// 11: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// hit: {value: $ID_class},
// canon: {value: 'class'}
// })
// }
// })
// }
// })
// }
// })
// },
// 14: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_const},
// canon: {value: 'const'}
// })
// }
// })
// },
// 19: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_continue},
// canon: {value: 'continue'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 3: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 1: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 6: {
// value: Object.create(null, {
// 6: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// hit: {value: $ID_debugger},
// canon: {value: 'debugger'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 5: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_default},
// canon: {value: 'default'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 11: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_delete},
// canon: {value: 'delete'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 14: {value: Object.create(null, {hit: {value: $ID_do}, canon: {value: 'do'}})}
// })
// },
// 4: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_else},
// canon: {value: 'else'}
// })
// }
// })
// }
// })
// },
// 13: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 12: {
// value: Object.create(null, {
// hit: {value: $ID_enum},
// canon: {value: 'enum'}
// })
// }
// })
// }
// })
// },
// 21: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// hit: {value: $ID_eval},
// canon: {value: 'eval'}
// })
// }
// })
// }
// })
// },
// 23: {
// value: Object.create(null, {
// 15: {
// value: Object.create(null, {
// 14: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_export},
// canon: {value: 'export'}
// })
// }
// })
// }
// })
// }
// })
// },
// 19: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 3: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// hit: {value: $ID_extends},
// canon: {value: 'extends'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 5: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_false},
// canon: {value: 'false'}
// })
// }
// })
// }
// })
// }
// })
// },
// 8: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 24: {
// value: Object.create(null, {
// hit: {value: $ID_finally},
// canon: {value: 'finally'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 14: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// hit: {value: $ID_for},
// canon: {value: 'for'}
// })
// }
// })
// },
// 17: {
// value: Object.create(null, {
// 14: {
// value: Object.create(null, {
// 12: {
// value: Object.create(null, {
// hit: {value: $ID_from},
// canon: {value: 'from'}
// })
// }
// })
// }
// })
// },
// 20: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 14: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// hit: {value: $ID_function},
// canon: {value: 'function'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 6: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_get},
// canon: {value: 'get'}
// })
// }
// })
// }
// })
// },
// 8: {
// value: Object.create(null, {
// 5: {value: Object.create(null, {hit: {value: $ID_if}, canon: {value: 'if'}})},
// 12: {
// value: Object.create(null, {
// 15: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 12: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// hit: {value: $ID_implements},
// canon: {value: 'implements'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 14: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_import},
// canon: {value: 'import'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 13: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 14: {
// value: Object.create(null, {
// 5: {
// value: Object.create(null, {
// hit: {value: $ID_instanceof},
// canon: {value: 'instanceof'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 19: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 5: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_interface},
// canon: {value: 'interface'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// hit: {value: $ID_in},
// canon: {value: 'in'},
// })
// },
// })
// },
// 11: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_let},
// canon: {value: 'let'}
// })
// }
// })
// }
// })
// },
// 13: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 22: {
// value: Object.create(null, {
// hit: {value: $ID_new},
// canon: {value: 'new'}
// })
// }
// })
// },
// 20: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// hit: {value: $ID_null},
// canon: {value: 'null'}
// })
// }
// })
// }
// })
// }
// })
// },
// 14: {value: Object.create(null, {5: {value: Object.create(null, {hit: {value: $ID_of}, canon: {value: 'of'}})}})},
// 15: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 10: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 6: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_package},
// canon: {value: 'package'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 17: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 21: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_private},
// canon: {value: 'private'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 14: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 3: {
// value: Object.create(null, {
// hit: {value: $ID_protected},
// canon: {value: 'protected'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 20: {
// value: Object.create(null, {
// 1: {
// value: Object.create(null, {
// 11: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// hit: {value: $ID_public},
// canon: {value: 'public'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 17: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 13: {
// value: Object.create(null, {
// hit: {value: $ID_return},
// canon: {value: 'return'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 18: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_set},
// canon: {value: 'set'}
// })
// }
// })
// },
// 19: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// hit: {value: $ID_static},
// canon: {value: 'static'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 20: {
// value: Object.create(null, {
// 15: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// hit: {value: $ID_super},
// canon: {value: 'super'}
// })
// }
// })
// }
// })
// }
// })
// },
// 22: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// 2: {
// value: Object.create(null, {
// 7: {
// value: Object.create(null, {
// hit: {value: $ID_switch},
// canon: {value: 'switch'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 19: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// 6: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 19: {
// value: Object.create(null, {
// hit: {value: $ID_target},
// canon: {value: 'target'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 7: {
// value: Object.create(null, {
// 8: {
// value: Object.create(null, {
// 18: {
// value: Object.create(null, {
// hit: {value: $ID_this},
// canon: {value: 'this'}
// })
// }
// })
// },
// 17: {
// value: Object.create(null, {
// 14: {
// value: Object.create(null, {
// 22: {
// value: Object.create(null, {
// hit: {value: $ID_throw},
// canon: {value: 'throw'}
// })
// }
// })
// }
// })
// }
// })
// },
// 17: {
// value: Object.create(null, {
// 20: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// hit: {value: $ID_true},
// canon: {value: 'true'}
// })
// }
// })
// },
// 24: {value: Object.create(null, {hit: {value: $ID_try}, canon: {value: 'try'}})}
// })
// },
// 24: {
// value: Object.create(null, {
// 15: {
// value: Object.create(null, {
// 4: {
// value: Object.create(null, {
// 14: {
// value: Object.create(null, {
// 5: {
// value: Object.create(null, {
// hit: {value: $ID_typeof},
// canon: {value: 'typeof'}
// })
// }
// })
// }
// })
// }
// })
// }
// })
// }
// })
// },
// 21: {
// value: Object.create(null, {
// 0: {
// value: Object.create(null, {
// 17: {
// value: Object.create(null, {
// hit: {value: $ID_var},
// canon: {v