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