text: enum {
      tIGNORED_NL  = tLAST_TOKEN + 1,
      tCOMMENT,
      tEMBDOC_BEG,
      tEMBDOC,
      tEMBDOC_END,
      tHEREDOC_BEG,
      tHEREDOC_END,
      k__END__
  };
  
  typedef struct {
      ID ripper_id_backref;
      ID ripper_id_backtick;
      ID ripper_id_comma;
      ID ripper_id_const;
      ID ripper_id_cvar;
      ID ripper_id_embexpr_beg;
      ID ripper_id_embexpr_end;
      ID ripper_id_embvar;
      ID ripper_id_float;
      ID ripper_id_gvar;
      ID ripper_id_ident;
      ID ripper_id_imaginary;
      ID ripper_id_int;
      ID ripper_id_ivar;
      ID ripper_id_kw;
      ID ripper_id_lbrace;
      ID ripper_id_lbracket;
      ID ripper_id_lparen;
      ID ripper_id_nl;
      ID ripper_id_op;
      ID ripper_id_period;
      ID ripper_id_rbrace;
      ID ripper_id_rbracket;
      ID ripper_id_rparen;
      ID ripper_id_semicolon;
      ID ripper_id_symbeg;
      ID ripper_id_tstring_beg;
      ID ripper_id_tstring_content;
      ID ripper_id_tstring_end;
      ID ripper_id_words_beg;
      ID ripper_id_qwords_beg;
      ID ripper_id_qsymbols_beg;
      ID ripper_id_symbols_beg;
      ID ripper_id_words_sep;
      ID ripper_id_rational;
      ID ripper_id_regexp_beg;
      ID ripper_id_regexp_end;
      ID ripper_id_label;
      ID ripper_id_label_end;
      ID ripper_id_tlambda;
      ID ripper_id_tlambeg;
  
      ID ripper_id_ignored_nl;
      ID ripper_id_comment;
      ID ripper_id_embdoc_beg;
      ID ripper_id_embdoc;
      ID ripper_id_embdoc_end;
      ID ripper_id_sp;
      ID ripper_id_heredoc_beg;
      ID ripper_id_heredoc_end;
      ID ripper_id___end__;
      ID ripper_id_CHAR;
  } ripper_scanner_ids_t;
  
  static ripper_scanner_ids_t ripper_scanner_ids;
  
  #include "eventids2table.c"
  
  static void
  ripper_init_eventids2(void)
  {
  #define set_id2(name) ripper_scanner_ids.ripper_id_##name = rb_intern_const("on_"#name)
      set_id2(backref);
      set_id2(backtick);
      set_id2(comma);
      set_id2(const);
      set_id2(cvar);
      set_id2(embexpr_beg);
      set_id2(embexpr_end);
      set_id2(embvar);
      set_id2(float);
      set_id2(gvar);
      set_id2(ident);
      set_id2(imaginary);
      set_id2(int);
      set_id2(ivar);
      set_id2(kw);
      set_id2(lbrace);
      set_id2(lbracket);
      set_id2(lparen);
      set_id2(nl);
      set_id2(op);
      set_id2(period);
      set_id2(rbrace);
      set_id2(rbracket);
      set_id2(rparen);
      set_id2(semicolon);
      set_id2(symbeg);
      set_id2(tstring_beg);
      set_id2(tstring_content);
      set_id2(tstring_end);
      set_id2(words_beg);
      set_id2(qwords_beg);
      set_id2(qsymbols_beg);
      set_id2(symbols_beg);
      set_id2(words_sep);
      set_id2(rational);
      set_id2(regexp_beg);
      set_id2(regexp_end);
      set_id2(label);
      set_id2(label_end);
      set_id2(tlambda);
      set_id2(tlambeg);
  
      set_id2(ignored_nl);
      set_id2(comment);
      set_id2(embdoc_beg);
      set_id2(embdoc);
      set_id2(embdoc_end);
      set_id2(sp);
      set_id2(heredoc_beg);
      set_id2(heredoc_end);
      set_id2(__end__);
      set_id2(CHAR);
  }
  
  STATIC_ASSERT(k__END___range, k__END__ < SHRT_MAX);
  STATIC_ASSERT(ripper_scanner_ids_size, sizeof(ripper_scanner_ids) < SHRT_MAX);
  
  static ID
  ripper_token2eventid(enum yytokentype tok)
  {
  #define O(member) (int)offsetof(ripper_scanner_ids_t, ripper_id_##member)+1
      static const unsigned short offsets[] = {
          [' ']			= O(words_sep),
          ['!']			= O(op),
          ['%']			= O(op),
          ['&']			= O(op),
          ['*']			= O(op),
          ['+']			= O(op),
          ['-']			= O(op),
          ['/']			= O(op),
          ['<']			= O(op),
          ['=']			= O(op),
          ['>']			= O(op),
          ['?']			= O(op),
          ['^']			= O(op),
          ['|']			= O(op),
          ['~']			= O(op),
          [':']			= O(op),
          [',']			= O(comma),
          ['.']			= O(period),
          [';']			= O(semicolon),
          ['`']			= O(backtick),
          ['\n']			= O(nl),
          [keyword_alias] 	= O(kw),
          [keyword_and]		= O(kw),
          [keyword_begin] 	= O(kw),
          [keyword_break] 	= O(kw),
          [keyword_case]		= O(kw),
          [keyword_class] 	= O(kw),
          [keyword_def]		= O(kw),
          [keyword_defined]	= O(kw),
          [keyword_do]		= O(kw),
          [keyword_do_block]	= O(kw),
          [keyword_do_cond]	= O(kw),
          [keyword_else]		= O(kw),
          [keyword_elsif] 	= O(kw),
          [keyword_end]		= O(kw),
          [keyword_ensure]	= O(kw),
          [keyword_false] 	= O(kw),
          [keyword_for]		= O(kw),
          [keyword_if]		= O(kw),
          [modifier_if]		= O(kw),
          [keyword_in]		= O(kw),
          [keyword_module]	= O(kw),
          [keyword_next]		= O(kw),
          [keyword_nil]		= O(kw),
          [keyword_not]		= O(kw),
          [keyword_or]		= O(kw),
          [keyword_redo]		= O(kw),
          [keyword_rescue]	= O(kw),
          [modifier_rescue]	= O(kw),
          [keyword_retry] 	= O(kw),
          [keyword_return]	= O(kw),
          [keyword_self]		= O(kw),
          [keyword_super] 	= O(kw),
          [keyword_then]		= O(kw),
          [keyword_true]		= O(kw),
          [keyword_undef] 	= O(kw),
          [keyword_unless]	= O(kw),
          [modifier_unless]	= O(kw),
          [keyword_until] 	= O(kw),
          [modifier_until]	= O(kw),
          [keyword_when]		= O(kw),
          [keyword_while] 	= O(kw),
          [modifier_while]	= O(kw),
          [keyword_yield] 	= O(kw),
          [keyword__FILE__]	= O(kw),
          [keyword__LINE__]	= O(kw),
          [keyword__ENCODING__]	= O(kw),
          [keyword_BEGIN] 	= O(kw),
          [keyword_END]		= O(kw),
          [keyword_do_LAMBDA]	= O(kw),
          [tAMPER]		= O(op),
          [tANDOP]		= O(op),
          [tAREF] 		= O(op),
          [tASET] 		= O(op),
          [tASSOC]		= O(op),
          [tBACK_REF]		= O(backref),
          [tCHAR] 		= O(CHAR),
          [tCMP]			= O(op),
          [tCOLON2]		= O(op),
          [tCOLON3]		= O(op),
          [tCONSTANT]		= O(const),
          [tCVAR] 		= O(cvar),
          [tDOT2] 		= O(op),
          [tDOT3] 		= O(op),
          [tBDOT2]		= O(op),
          [tBDOT3]		= O(op),
          [tEQ]			= O(op),
          [tEQQ]			= O(op),
          [tFID]			= O(ident),
          [tFLOAT]		= O(float),
          [tGEQ]			= O(op),
          [tGVAR] 		= O(gvar),
          [tIDENTIFIER]		= O(ident),
          [tIMAGINARY]		= O(imaginary),
          [tINTEGER]		= O(int),
          [tIVAR] 		= O(ivar),
          [tLBRACE]		= O(lbrace),
          [tLBRACE_ARG]		= O(lbrace),
          ['{']			= O(lbrace),
          ['}']			= O(rbrace),
          [tLBRACK]		= O(lbracket),
          ['[']			= O(lbracket),
          [']']			= O(rbracket),
          [tLEQ]			= O(op),
          [tLPAREN]		= O(lparen),
          [tLPAREN_ARG]		= O(lparen),
          ['(']			= O(lparen),
          [')']			= O(rparen),
          [tLSHFT]		= O(op),
          [tMATCH]		= O(op),
          [tNEQ]			= O(op),
          [tNMATCH]		= O(op),
          [tNTH_REF]		= O(backref),
          [tOP_ASGN]		= O(op),
          [tOROP] 		= O(op),
          [tPOW]			= O(op),
          [tQWORDS_BEG]		= O(qwords_beg),
          [tQSYMBOLS_BEG] 	= O(qsymbols_beg),
          [tSYMBOLS_BEG]		= O(symbols_beg),
          [tRATIONAL]		= O(rational),
          [tREGEXP_BEG]		= O(regexp_beg),
          [tREGEXP_END]		= O(regexp_end),
          [tRPAREN]		= O(rparen),
          [tRSHFT]		= O(op),
          [tSTAR] 		= O(op),
          [tDSTAR]		= O(op),
          [tANDDOT]		= O(op),
          [tSTRING_BEG]		= O(tstring_beg),
          [tSTRING_CONTENT]	= O(tstring_content),
          [tSTRING_DBEG]		= O(embexpr_beg),
          [tSTRING_DEND]		= O(embexpr_end),
          [tSTRING_DVAR]		= O(embvar),
          [tSTRING_END]		= O(tstring_end),
          [tSYMBEG]		= O(symbeg),
          [tUMINUS]		= O(op),
          [tUMINUS_NUM]		= O(op),
          [tUPLUS]		= O(op),
          [tWORDS_BEG]		= O(words_beg),
          [tXSTRING_BEG]		= O(backtick),
          [tLABEL]		= O(label),
          [tLABEL_END]		= O(label_end),
          [tLAMBDA]		= O(tlambda),
          [tLAMBEG]		= O(tlambeg),
  
          /* ripper specific tokens */
          [tIGNORED_NL]		= O(ignored_nl),
          [tCOMMENT]		= O(comment),
          [tEMBDOC_BEG]		= O(embdoc_beg),
          [tEMBDOC]		= O(embdoc),
          [tEMBDOC_END]		= O(embdoc_end),
          [tSP]			= O(sp),
          [tHEREDOC_BEG]		= O(heredoc_beg),
          [tHEREDOC_END]		= O(heredoc_end),
          [k__END__]		= O(__end__),
      };
  #undef O
  
      int i = (int)tok;
      if (i >= 0 && i < numberof(offsets) && (i = offsets[i]) > 0) {
          return *(const ID *)((const char *)&ripper_scanner_ids-1+i);
      }
      /* 128..256 are used as operator tokens */
      if (tok < 128) {
          return ripper_scanner_ids.ripper_id_CHAR;
      }
      rb_raise(rb_eRuntimeError, "[Ripper FATAL] unknown token %d", tok);
  
      UNREACHABLE_RETURN(0);
  }
  