UNPKG

tenko

Version:

A "pixel perfect" 100% spec compliant ES2021 JavaScript parser written in JS.

1,396 lines (1,382 loc) 131 kB
// 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