     1→export const enum Token {
     2→  Type = 0xFF,
     3→
     4→  /* Precedence for binary operators (always positive) */
     5→  PrecedenceStart         = 8,
     6→  Precedence              = 15 << PrecedenceStart, // 8-11
     7→
     8→  /* Attribute names */
     9→  Keyword                 = 1 << 12,
    10→  Contextual              = 1 << 13 | Keyword,
    11→  Reserved                = 1 << 14 | Keyword,
    12→  FutureReserved          = 1 << 15 | Keyword,
    13→
    14→  IsExpressionStart        = 1 << 16,
    15→  IsIdentifier             = 1 << 17 | Contextual,
    16→  IsInOrOf                 = 1 << 18, // 'in' or 'of'
    17→  IsLogical                = 1 << 19,
    18→  IsAutoSemicolon          = 1 << 20,
    19→  IsPatternStart           = 1 << 21, // Start of pattern, '[' or '{'
    20→  IsAssignOp               = 1 << 22,
    21→  IsBinaryOp               = 1 << 23,
    22→  IsUnaryOp                = 1 << 24 | IsExpressionStart,
    23→  IsUpdateOp               = 1 << 25 | IsExpressionStart,
    24→  IsMemberOrCallExpression = 1 << 26,
    25→  IsStringOrNumber         = 1 << 27,
    26→  IsCoalesce               = 1 << 28,
    27→  IsEvalOrArguments        = 1 << 29 | IsExpressionStart | IsIdentifier,
    28→  IsClassField             = 1 << 30,
    29→  IsEscaped                = 1 << 31, // Note 1 << 31 is negative integer
    30→
    31→  // Note: 1 << 31... turns to negative
    32→
    33→  /* Node types */
    34→  EOF = 0 | IsAutoSemicolon,
    35→
    36→  /* Constants/Bindings */
    37→  Identifier        = 1 | IsExpressionStart | IsIdentifier,
    38→  NumericLiteral    = 2 | IsExpressionStart | IsStringOrNumber,
    39→  StringLiteral     = 3 | IsExpressionStart | IsStringOrNumber,
    40→  RegularExpression = 4 | IsExpressionStart,
    41→  FalseKeyword      = 5 | Reserved | IsExpressionStart,
    42→  TrueKeyword       = 6 | Reserved | IsExpressionStart,
    43→  NullKeyword       = 7 | Reserved | IsExpressionStart,
    44→
    45→  /* Template nodes */
    46→  TemplateContinuation = 8 | IsExpressionStart | IsMemberOrCallExpression,
    47→  TemplateSpan = 9 | IsExpressionStart | IsMemberOrCallExpression,
    48→
    49→  /* Punctuators */
    50→  Arrow        = 10, // =>
    51→  LeftParen    = 11 | IsExpressionStart | IsMemberOrCallExpression, // (
    52→  LeftBrace    = 12 | IsExpressionStart | IsPatternStart, // {
    53→  Period       = 13 | IsMemberOrCallExpression, // .
    54→  Ellipsis     = 14, // ...
    55→  RightBrace   = 15 | IsAutoSemicolon | IsClassField, // }
    56→  RightParen   = 16, // )
    57→  Semicolon    = 17 | IsAutoSemicolon | IsClassField, // ;
    58→  Comma        = 18, // ,
    59→  LeftBracket  = 19 | IsExpressionStart | IsPatternStart | IsMemberOrCallExpression, // [
    60→  RightBracket = 20, // ]
    61→  Colon        = 21, // :
    62→  QuestionMark = 22, // ?
    63→  SingleQuote  = 23, // '
    64→  DoubleQuote  = 24, // "
    65→
    66→  /* Update operators */
    67→  Increment = 25 | IsUpdateOp, // ++
    68→  Decrement = 26 | IsUpdateOp, // --
    69→
    70→  /* Assign operators */
    71→  Assign                  = 27 | IsAssignOp | IsClassField, // =
    72→  ShiftLeftAssign         = 28 | IsAssignOp, // <<=
    73→  ShiftRightAssign        = 29 | IsAssignOp, // >>=
    74→  LogicalShiftRightAssign = 30 | IsAssignOp, // >>>=
    75→  ExponentiationAssign    = 31 | IsAssignOp, // **=
    76→  AddAssign               = 32 | IsAssignOp, // +=
    77→  SubtractAssign          = 33 | IsAssignOp, // -=
    78→  MultiplyAssign          = 34 | IsAssignOp, // *=
    79→  DivideAssign            = 35 | IsAssignOp | IsExpressionStart, // /=
    80→  ModuloAssign            = 36 | IsAssignOp, // %=
    81→  BitwiseXorAssign        = 37 | IsAssignOp, // ^=
    82→  BitwiseOrAssign         = 38 | IsAssignOp, // |=
    83→  BitwiseAndAssign        = 39 | IsAssignOp, // &=
    84→  LogicalOrAssign         = 40 | IsAssignOp, // ||=
    85→  LogicalAndAssign        = 41 | IsAssignOp, // &&=
    86→  CoalesceAssign          = 42 | IsAssignOp, // ??=
    87→
    88→  /* Unary/binary operators */
    89→  TypeofKeyword      = 43 | IsUnaryOp | Reserved,
    90→  DeleteKeyword      = 44 | IsUnaryOp | Reserved,
    91→  VoidKeyword        = 45 | IsUnaryOp | Reserved,
    92→  Negate             = 46 | IsUnaryOp, // !
    93→  Complement         = 47 | IsUnaryOp, // ~
    94→  Add                = 48 | IsUnaryOp | IsBinaryOp | IsExpressionStart | 10 << PrecedenceStart, // +
    95→  Subtract           = 49 | IsUnaryOp | IsBinaryOp | IsExpressionStart | 10 << PrecedenceStart, // -
    96→  InKeyword          = 50 | IsBinaryOp | 8 << PrecedenceStart | Reserved | IsInOrOf,
    97→  InstanceofKeyword  = 51 | IsBinaryOp | 8 << PrecedenceStart | Reserved,
    98→  Multiply           = 52 | IsBinaryOp | 11 << PrecedenceStart, // *
    99→  Modulo             = 53 | IsBinaryOp | 11 << PrecedenceStart, // %
   100→  Divide             = 54 | IsBinaryOp | IsExpressionStart | 11 << PrecedenceStart, // /
   101→  Exponentiation     = 55 | IsBinaryOp | 12 << PrecedenceStart, // **
   102→  LogicalAnd         = 56 | IsBinaryOp | IsLogical | 3 << PrecedenceStart, // &&
   103→  LogicalOr          = 57 | IsBinaryOp | IsLogical | 2 << PrecedenceStart, // ||
   104→  StrictEqual        = 58 | IsBinaryOp | 7 << PrecedenceStart, // ===
   105→  StrictNotEqual     = 59 | IsBinaryOp | 7 << PrecedenceStart, // !==
   106→  LooseEqual         = 60 | IsBinaryOp | 7 << PrecedenceStart, // ==
   107→  LooseNotEqual      = 61 | IsBinaryOp | 7 << PrecedenceStart, // !=
   108→  LessThanOrEqual    = 62 | IsBinaryOp | 8 << PrecedenceStart, // <=
   109→  GreaterThanOrEqual = 63 | IsBinaryOp | 8 << PrecedenceStart, // >=
   110→  LessThan           = 64 | IsBinaryOp | IsExpressionStart | 8 << PrecedenceStart, // <
   111→  GreaterThan        = 65 | IsBinaryOp | 8 << PrecedenceStart, // >
   112→  ShiftLeft          = 66 | IsBinaryOp | 9 << PrecedenceStart, // <<
   113→  ShiftRight         = 67 | IsBinaryOp | 9 << PrecedenceStart, // >>
   114→  LogicalShiftRight  = 68 | IsBinaryOp | 9 << PrecedenceStart, // >>>
   115→  BitwiseAnd         = 69 | IsBinaryOp | 6 << PrecedenceStart, // &
   116→  BitwiseOr          = 70 | IsBinaryOp | 4 << PrecedenceStart, // |
   117→  BitwiseXor         = 71 | IsBinaryOp | 5 << PrecedenceStart, // ^
   118→
   119→  /* Variable declaration kinds */
   120→  VarKeyword   = 72 | IsExpressionStart | Reserved,
   121→  LetKeyword   = 73 | IsExpressionStart | FutureReserved | IsIdentifier,
   122→  ConstKeyword = 74 | IsExpressionStart | Reserved,
   123→
   124→  /* Other reserved words */
   125→  BreakKeyword    = 75 | Reserved,
   126→  CaseKeyword     = 76 | Reserved,
   127→  CatchKeyword    = 77 | Reserved,
   128→  ClassKeyword    = 78 | IsExpressionStart | Reserved,
   129→  ContinueKeyword = 79 | Reserved,
   130→  DebuggerKeyword = 80 | Reserved,
   131→  DefaultKeyword  = 81 | Reserved,
   132→  DoKeyword       = 82 | Reserved,
   133→  ElseKeyword     = 83 | Reserved,
   134→  ExportKeyword   = 84 | Reserved,
   135→  ExtendsKeyword  = 85 | Reserved,
   136→  FinallyKeyword  = 86 | Reserved,
   137→  ForKeyword      = 87 | Reserved,
   138→  FunctionKeyword = 88 | IsExpressionStart | Reserved,
   139→  IfKeyword       = 89 | Reserved,
   140→  ImportKeyword   = 90 | IsExpressionStart | Reserved,
   141→  NewKeyword      = 91 | IsExpressionStart | Reserved,
   142→  ReturnKeyword   = 92 | Reserved,
   143→  SuperKeyword    = 93 | IsExpressionStart | Reserved,
   144→  SwitchKeyword   = 94 | IsExpressionStart | Reserved,
   145→  ThisKeyword     = 95 | IsExpressionStart | Reserved,
   146→  ThrowKeyword    = 96 | IsExpressionStart | Reserved,
   147→  TryKeyword      = 97 | Reserved,
   148→  WhileKeyword    = 98 | Reserved,
   149→  WithKeyword     = 99 | Reserved,
   150→
   151→  /* Strict mode reserved words */
   152→  ImplementsKeyword = 100 | FutureReserved,
   153→  InterfaceKeyword  = 101 | FutureReserved,
   154→  PackageKeyword    = 102 | FutureReserved,
   155→  PrivateKeyword    = 103 | FutureReserved,
   156→  ProtectedKeyword  = 104 | FutureReserved,
   157→  PublicKeyword     = 105 | FutureReserved,
   158→  StaticKeyword     = 106 | FutureReserved,
   159→  YieldKeyword      = 107 | FutureReserved | IsExpressionStart | IsIdentifier,
   160→
   161→  /* Contextual keywords */
   162→  AsKeyword          = 108 | Contextual | IsExpressionStart,
   163→  AsyncKeyword       = 109 | Contextual | IsExpressionStart | IsIdentifier,
   164→  AwaitKeyword       = 110 | Contextual | IsExpressionStart | IsIdentifier, // await is only reserved word in async functions or modules
   165→  ConstructorKeyword = 111 | Contextual,
   166→  GetKeyword         = 112 | Contextual | IsExpressionStart | IsIdentifier,
   167→  SetKeyword         = 113 | Contextual | IsExpressionStart | IsIdentifier,
   168→  AccessorKeyword    = 114 | Contextual,
   169→  FromKeyword        = 115 | Contextual | IsExpressionStart | IsIdentifier,
   170→  OfKeyword          = 116 | Contextual | IsInOrOf | IsExpressionStart | IsIdentifier,
   171→  EnumKeyword        = 117 | Reserved | IsExpressionStart,
   172→
   173→  Eval               = 118 | IsEvalOrArguments,
   174→  Arguments          = 119 | IsEvalOrArguments,
   175→
   176→  EscapedReserved       = 120 | IsEscaped,
   177→  EscapedFutureReserved = 121 | IsEscaped,
   178→  AnyIdentifier      = 122 | IsExpressionStart | IsIdentifier,
   179→
   180→  PrivateIdentifier  = 123,
   181→  BigIntLiteral      = 124 | IsExpressionStart | IsStringOrNumber,
   182→  Coalesce           = 125 | IsBinaryOp | IsCoalesce | 1 << PrecedenceStart, // ??
   183→  QuestionMarkPeriod = 126 | IsMemberOrCallExpression, // ?.
   184→
   185→  // Others
   186→  WhiteSpace        = 127,
   187→  Illegal           = 128,
   188→  CarriageReturn    = 129,
   189→  PrivateField      = 130,
   190→  Template          = 131,
   191→  Decorator         = 132,
   192→  Target            = 133 | IsExpressionStart | IsIdentifier,
   193→  Meta              = 134 | IsExpressionStart | IsIdentifier,
   194→  LineFeed          = 135,
   195→  EscapeStart       = 136,
   196→
   197→  // JSX
   198→  JSXText           = 137,
   199→}
   200→
   201→export const KeywordDescTable = [
   202→  'end of source',
   203→
   204→  /* Constants/Bindings */
   205→  'identifier', 'number', 'string', 'regular expression',
   206→  'false', 'true', 'null',
   207→
   208→  /* Template nodes */
   209→  'template continuation', 'template tail',
   210→
   211→  /* Punctuators */
   212→  '=>', '(', '{', '.', '...', '}', ')', ';', ',', '[', ']', ':', '?', '\'', '"',
   213→
   214→  /* Update operators */
   215→  '++', '--',
   216→
   217→  /* Assign operators */
   218→  '=', '<<=', '>>=', '>>>=', '**=', '+=', '-=', '*=', '/=', '%=', '^=', '|=',
   219→  '&=', '||=', '&&=', '??=',
   220→
   221→  /* Unary/binary operators */
   222→  'typeof', 'delete', 'void', '!', '~', '+', '-', 'in', 'instanceof', '*', '%', '/', '**', '&&',
   223→  '||', '===', '!==', '==', '!=', '<=', '>=', '<', '>', '<<', '>>', '>>>', '&', '|', '^',
   224→
   225→  /* Variable declaration kinds */
   226→  'var', 'let', 'const',
   227→
   228→  /* Other reserved words */
   229→  'break', 'case', 'catch', 'class', 'continue', 'debugger', 'default', 'do', 'else', 'export',
   230→  'extends', 'finally', 'for', 'function', 'if', 'import', 'new', 'return', 'super', 'switch',
   231→  'this', 'throw', 'try', 'while', 'with',
   232→
   233→  /* Strict mode reserved words */
   234→  'implements', 'interface', 'package', 'private', 'protected', 'public', 'static', 'yield',
   235→
   236→  /* Contextual keywords */
   237→  'as', 'async', 'await', 'constructor', 'get', 'set', 'accessor', 'from', 'of',
   238→
   239→  /* Others */
   240→  'enum', 'eval', 'arguments', 'escaped keyword', 'escaped future reserved keyword', 'reserved if strict', '#',
   241→
   242→  'BigIntLiteral', '??', '?.', 'WhiteSpace', 'Illegal', 'LineTerminator', 'PrivateField',
   243→
   244→  'Template', '@', 'target', 'meta', 'LineFeed', 'Escaped', 'JSXText'
   245→];
   246→
   247→export const descKeywordTable: { [key: string]: Token } =  {
   248→  this: Token.ThisKeyword,
   249→  function: Token.FunctionKeyword,
   250→  if: Token.IfKeyword,
   251→  return: Token.ReturnKeyword,
   252→  var: Token.VarKeyword,
   253→  else: Token.ElseKeyword,
   254→  for: Token.ForKeyword,
   255→  new: Token.NewKeyword,
   256→  in: Token.InKeyword,
   257→  typeof: Token.TypeofKeyword,
   258→  while: Token.WhileKeyword,
   259→  case: Token.CaseKeyword,
   260→  break: Token.BreakKeyword,
   261→  try: Token.TryKeyword,
   262→  catch: Token.CatchKeyword,
   263→  delete: Token.DeleteKeyword,
   264→  throw: Token.ThrowKeyword,
   265→  switch: Token.SwitchKeyword,
   266→  continue: Token.ContinueKeyword,
   267→  default: Token.DefaultKeyword,
   268→  instanceof: Token.InstanceofKeyword,
   269→  do: Token.DoKeyword,
   270→  void: Token.VoidKeyword,
   271→  finally: Token.FinallyKeyword,
   272→  async: Token.AsyncKeyword,
   273→  await: Token.AwaitKeyword,
   274→  class: Token.ClassKeyword,
   275→  const: Token.ConstKeyword,
   276→  constructor: Token.ConstructorKeyword,
   277→  debugger: Token.DebuggerKeyword,
   278→  export: Token.ExportKeyword,
   279→  extends: Token.ExtendsKeyword,
   280→  false: Token.FalseKeyword,
   281→  from: Token.FromKeyword,
   282→  get: Token.GetKeyword,
   283→  implements: Token.ImplementsKeyword,
   284→  import: Token.ImportKeyword,
   285→  interface: Token.InterfaceKeyword,
   286→  let: Token.LetKeyword,
   287→  null: Token.NullKeyword,
   288→  of: Token.OfKeyword,
   289→  package: Token.PackageKeyword,
   290→  private: Token.PrivateKeyword,
   291→  protected: Token.ProtectedKeyword,
   292→  public: Token.PublicKeyword,
   293→  set: Token.SetKeyword,
   294→  static: Token.StaticKeyword,
   295→  super: Token.SuperKeyword,
   296→  true: Token.TrueKeyword,
   297→  with: Token.WithKeyword,
   298→  yield: Token.YieldKeyword,
   299→  enum: Token.EnumKeyword,
   300→  eval: Token.Eval,
   301→  as: Token.AsKeyword,
   302→  arguments: Token.Arguments,
   303→  target: Token.Target,
   304→  meta: Token.Meta,
   305→  accessor: Token.AccessorKeyword,
   306→}
