1 enum {
2     tIGNORED_NL  = tLAST_TOKEN + 1,
3     tCOMMENT,
4     tEMBDOC_BEG,
5     tEMBDOC,
6     tEMBDOC_END,
7     tHEREDOC_BEG,
8     tHEREDOC_END,
9     k__END__
10 };
11 
12 typedef struct {
13     ID ripper_id_backref;
14     ID ripper_id_backtick;
15     ID ripper_id_comma;
16     ID ripper_id_const;
17     ID ripper_id_cvar;
18     ID ripper_id_embexpr_beg;
19     ID ripper_id_embexpr_end;
20     ID ripper_id_embvar;
21     ID ripper_id_float;
22     ID ripper_id_gvar;
23     ID ripper_id_ident;
24     ID ripper_id_imaginary;
25     ID ripper_id_int;
26     ID ripper_id_ivar;
27     ID ripper_id_kw;
28     ID ripper_id_lbrace;
29     ID ripper_id_lbracket;
30     ID ripper_id_lparen;
31     ID ripper_id_nl;
32     ID ripper_id_op;
33     ID ripper_id_period;
34     ID ripper_id_rbrace;
35     ID ripper_id_rbracket;
36     ID ripper_id_rparen;
37     ID ripper_id_semicolon;
38     ID ripper_id_symbeg;
39     ID ripper_id_tstring_beg;
40     ID ripper_id_tstring_content;
41     ID ripper_id_tstring_end;
42     ID ripper_id_words_beg;
43     ID ripper_id_qwords_beg;
44     ID ripper_id_qsymbols_beg;
45     ID ripper_id_symbols_beg;
46     ID ripper_id_words_sep;
47     ID ripper_id_rational;
48     ID ripper_id_regexp_beg;
49     ID ripper_id_regexp_end;
50     ID ripper_id_label;
51     ID ripper_id_label_end;
52     ID ripper_id_tlambda;
53     ID ripper_id_tlambeg;
54 
55     ID ripper_id_ignored_nl;
56     ID ripper_id_comment;
57     ID ripper_id_embdoc_beg;
58     ID ripper_id_embdoc;
59     ID ripper_id_embdoc_end;
60     ID ripper_id_sp;
61     ID ripper_id_heredoc_beg;
62     ID ripper_id_heredoc_end;
63     ID ripper_id___end__;
64     ID ripper_id_CHAR;
65 } ripper_scanner_ids_t;
66 
67 static ripper_scanner_ids_t ripper_scanner_ids;
68 
69 #include "eventids2table.c"
70 
71 static void
ripper_init_eventids2(void)72 ripper_init_eventids2(void)
73 {
74 #define set_id2(name) ripper_scanner_ids.ripper_id_##name = rb_intern_const("on_"#name)
75     set_id2(backref);
76     set_id2(backtick);
77     set_id2(comma);
78     set_id2(const);
79     set_id2(cvar);
80     set_id2(embexpr_beg);
81     set_id2(embexpr_end);
82     set_id2(embvar);
83     set_id2(float);
84     set_id2(gvar);
85     set_id2(ident);
86     set_id2(imaginary);
87     set_id2(int);
88     set_id2(ivar);
89     set_id2(kw);
90     set_id2(lbrace);
91     set_id2(lbracket);
92     set_id2(lparen);
93     set_id2(nl);
94     set_id2(op);
95     set_id2(period);
96     set_id2(rbrace);
97     set_id2(rbracket);
98     set_id2(rparen);
99     set_id2(semicolon);
100     set_id2(symbeg);
101     set_id2(tstring_beg);
102     set_id2(tstring_content);
103     set_id2(tstring_end);
104     set_id2(words_beg);
105     set_id2(qwords_beg);
106     set_id2(qsymbols_beg);
107     set_id2(symbols_beg);
108     set_id2(words_sep);
109     set_id2(rational);
110     set_id2(regexp_beg);
111     set_id2(regexp_end);
112     set_id2(label);
113     set_id2(label_end);
114     set_id2(tlambda);
115     set_id2(tlambeg);
116 
117     set_id2(ignored_nl);
118     set_id2(comment);
119     set_id2(embdoc_beg);
120     set_id2(embdoc);
121     set_id2(embdoc_end);
122     set_id2(sp);
123     set_id2(heredoc_beg);
124     set_id2(heredoc_end);
125     set_id2(__end__);
126     set_id2(CHAR);
127 }
128 
129 STATIC_ASSERT(k__END___range, k__END__ < SHRT_MAX);
130 STATIC_ASSERT(ripper_scanner_ids_size, sizeof(ripper_scanner_ids) < SHRT_MAX);
131 #define O(member) (int)offsetof(ripper_scanner_ids_t, ripper_id_##member)
132 
133 static const struct token_assoc {
134     unsigned short token;
135     unsigned short id_offset;
136 } token_to_eventid[] = {
137     {' ',			O(words_sep)},
138     {'!',			O(op)},
139     {'%',			O(op)},
140     {'&',			O(op)},
141     {'*',			O(op)},
142     {'+',			O(op)},
143     {'-',			O(op)},
144     {'/',			O(op)},
145     {'<',			O(op)},
146     {'=',			O(op)},
147     {'>',			O(op)},
148     {'?',			O(op)},
149     {'^',			O(op)},
150     {'|',			O(op)},
151     {'~',			O(op)},
152     {':',			O(op)},
153     {',',			O(comma)},
154     {'.',			O(period)},
155     {';',			O(semicolon)},
156     {'`',			O(backtick)},
157     {'\n',			O(nl)},
158     {keyword_alias,		O(kw)},
159     {keyword_and,		O(kw)},
160     {keyword_begin,		O(kw)},
161     {keyword_break,		O(kw)},
162     {keyword_case,		O(kw)},
163     {keyword_class,		O(kw)},
164     {keyword_def,		O(kw)},
165     {keyword_defined,		O(kw)},
166     {keyword_do,		O(kw)},
167     {keyword_do_block,		O(kw)},
168     {keyword_do_cond,		O(kw)},
169     {keyword_else,		O(kw)},
170     {keyword_elsif,		O(kw)},
171     {keyword_end,		O(kw)},
172     {keyword_ensure,		O(kw)},
173     {keyword_false,		O(kw)},
174     {keyword_for,		O(kw)},
175     {keyword_if,		O(kw)},
176     {modifier_if,		O(kw)},
177     {keyword_in,		O(kw)},
178     {keyword_module,		O(kw)},
179     {keyword_next,		O(kw)},
180     {keyword_nil,		O(kw)},
181     {keyword_not,		O(kw)},
182     {keyword_or,		O(kw)},
183     {keyword_redo,		O(kw)},
184     {keyword_rescue,		O(kw)},
185     {modifier_rescue,		O(kw)},
186     {keyword_retry,		O(kw)},
187     {keyword_return,		O(kw)},
188     {keyword_self,		O(kw)},
189     {keyword_super,		O(kw)},
190     {keyword_then,		O(kw)},
191     {keyword_true,		O(kw)},
192     {keyword_undef,		O(kw)},
193     {keyword_unless,		O(kw)},
194     {modifier_unless,		O(kw)},
195     {keyword_until,		O(kw)},
196     {modifier_until,		O(kw)},
197     {keyword_when,		O(kw)},
198     {keyword_while,		O(kw)},
199     {modifier_while,		O(kw)},
200     {keyword_yield,		O(kw)},
201     {keyword__FILE__,		O(kw)},
202     {keyword__LINE__,		O(kw)},
203     {keyword__ENCODING__,	O(kw)},
204     {keyword_BEGIN,		O(kw)},
205     {keyword_END,		O(kw)},
206     {keyword_do_LAMBDA,		O(kw)},
207     {tAMPER,			O(op)},
208     {tANDOP,			O(op)},
209     {tAREF,			O(op)},
210     {tASET,			O(op)},
211     {tASSOC,			O(op)},
212     {tBACK_REF,			O(backref)},
213     {tCHAR,			O(CHAR)},
214     {tCMP,			O(op)},
215     {tCOLON2,			O(op)},
216     {tCOLON3,			O(op)},
217     {tCONSTANT,			O(const)},
218     {tCVAR,			O(cvar)},
219     {tDOT2,			O(op)},
220     {tDOT3,			O(op)},
221     {tEQ,			O(op)},
222     {tEQQ,			O(op)},
223     {tFID,			O(ident)},
224     {tFLOAT,			O(float)},
225     {tGEQ,			O(op)},
226     {tGVAR,			O(gvar)},
227     {tIDENTIFIER,		O(ident)},
228     {tIMAGINARY,		O(imaginary)},
229     {tINTEGER,			O(int)},
230     {tIVAR,			O(ivar)},
231     {tLBRACE,			O(lbrace)},
232     {tLBRACE_ARG,		O(lbrace)},
233     {'{',			O(lbrace)},
234     {'}',			O(rbrace)},
235     {tLBRACK,			O(lbracket)},
236     {'[',			O(lbracket)},
237     {']',			O(rbracket)},
238     {tLEQ,			O(op)},
239     {tLPAREN,			O(lparen)},
240     {tLPAREN_ARG,		O(lparen)},
241     {'(',			O(lparen)},
242     {')',			O(rparen)},
243     {tLSHFT,			O(op)},
244     {tMATCH,			O(op)},
245     {tNEQ,			O(op)},
246     {tNMATCH,			O(op)},
247     {tNTH_REF,			O(backref)},
248     {tOP_ASGN,			O(op)},
249     {tOROP,			O(op)},
250     {tPOW,			O(op)},
251     {tQWORDS_BEG,		O(qwords_beg)},
252     {tQSYMBOLS_BEG,		O(qsymbols_beg)},
253     {tSYMBOLS_BEG,		O(symbols_beg)},
254     {tRATIONAL,			O(rational)},
255     {tREGEXP_BEG,		O(regexp_beg)},
256     {tREGEXP_END,		O(regexp_end)},
257     {tRPAREN,			O(rparen)},
258     {tRSHFT,			O(op)},
259     {tSTAR,			O(op)},
260     {tDSTAR,			O(op)},
261     {tANDDOT,			O(op)},
262     {tSTRING_BEG,		O(tstring_beg)},
263     {tSTRING_CONTENT,		O(tstring_content)},
264     {tSTRING_DBEG,		O(embexpr_beg)},
265     {tSTRING_DEND,		O(embexpr_end)},
266     {tSTRING_DVAR,		O(embvar)},
267     {tSTRING_END,		O(tstring_end)},
268     {tSYMBEG,			O(symbeg)},
269     {tUMINUS,			O(op)},
270     {tUMINUS_NUM,		O(op)},
271     {tUPLUS,			O(op)},
272     {tWORDS_BEG,		O(words_beg)},
273     {tXSTRING_BEG,		O(backtick)},
274     {tLABEL,			O(label)},
275     {tLABEL_END,		O(label_end)},
276     {tLAMBDA,			O(tlambda)},
277     {tLAMBEG,			O(tlambeg)},
278 
279     /* ripper specific tokens */
280     {tIGNORED_NL,		O(ignored_nl)},
281     {tCOMMENT,			O(comment)},
282     {tEMBDOC_BEG,		O(embdoc_beg)},
283     {tEMBDOC,			O(embdoc)},
284     {tEMBDOC_END,		O(embdoc_end)},
285     {tSP,			O(sp)},
286     {tHEREDOC_BEG,		O(heredoc_beg)},
287     {tHEREDOC_END,		O(heredoc_end)},
288     {k__END__,			O(__end__)},
289 };
290 
291 static ID
ripper_token2eventid(int tok)292 ripper_token2eventid(int tok)
293 {
294     int i;
295 
296     for (i = 0; i < numberof(token_to_eventid); i++) {
297 	const struct token_assoc *const a = &token_to_eventid[i];
298         if (a->token == tok)
299             return *(const ID *)((const char *)&ripper_scanner_ids + a->id_offset);
300     }
301     if (tok < 256) {
302         return ripper_scanner_ids.ripper_id_CHAR;
303     }
304     rb_raise(rb_eRuntimeError, "[Ripper FATAL] unknown token %d", tok);
305 
306     UNREACHABLE_RETURN(0);
307 }
308