ruby-changes:45525
From: nobu <ko1@a...>
Date: Sat, 11 Feb 2017 11:14:18 +0900 (JST)
Subject: [ruby-changes:45525] nobu:r57598 (trunk): parse.y: TOKEN2ID
nobu 2017-02-11 11:14:06 +0900 (Sat, 11 Feb 2017) New Revision: 57598 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57598 Log: parse.y: TOKEN2ID * parse.y (TOKEN2ID): add macro which maps static tokens to IDs. * template/id.h.tmpl (TOKEN2*ID, DEFINE_*ID_FROM_TOKEN): separate into macros, token to ID mapping and enum definitions. Modified files: trunk/parse.y trunk/template/id.h.tmpl Index: parse.y =================================================================== --- parse.y (revision 57597) +++ parse.y (revision 57598) @@ -653,6 +653,15 @@ static int lvar_defined_gen(struct parse https://github.com/ruby/ruby/blob/trunk/parse.y#L653 #define nd_paren(node) (char)((node)->u2.id >> CHAR_BIT*2) #define nd_nest u3.cnt +#define TOKEN2ID(tok) ( \ + tTOKEN_LOCAL_BEGIN<(tok)&&(tok)<tTOKEN_LOCAL_END ? TOKEN2LOCALID(tok) : \ + tTOKEN_INSTANCE_BEGIN<(tok)&&(tok)<tTOKEN_INSTANCE_END ? TOKEN2INSTANCEID(tok) : \ + tTOKEN_GLOBAL_BEGIN<(tok)&&(tok)<tTOKEN_GLOBAL_END ? TOKEN2GLOBALID(tok) : \ + tTOKEN_CONST_BEGIN<(tok)&&(tok)<tTOKEN_CONST_END ? TOKEN2CONSTID(tok) : \ + tTOKEN_CLASS_BEGIN<(tok)&&(tok)<tTOKEN_CLASS_END ? TOKEN2CLASSID(tok) : \ + tTOKEN_ATTRSET_BEGIN<(tok)&&(tok)<tTOKEN_ATTRSET_END ? TOKEN2ATTRSETID(tok) : \ + ((tok) / ((tok)<tPRESERVED_ID_END && ((tok)>=128 || rb_ispunct(tok))))) + /****** Ripper *******/ #ifdef RIPPER @@ -683,12 +692,8 @@ static void ripper_error_gen(struct pars https://github.com/ruby/ruby/blob/trunk/parse.y#L692 #define yyparse ripper_yyparse -#define ripper_intern(s) ID2SYM(rb_intern(s)) -static VALUE ripper_id2sym(ID); -#ifdef __GNUC__ -#define ripper_id2sym(id) (rb_ispunct((int)(id)) ? \ - ID2SYM(id) : ripper_id2sym(id)) -#endif +#define ripper_intern(s) STATIC_ID2SYM(rb_intern(s)) +#define TOKEN2VAL(t) STATIC_ID2SYM(TOKEN2ID(t)) #define arg_new() dispatch0(args_new) #define arg_add(l,a) dispatch2(args_add, (l), (a)) @@ -744,7 +749,7 @@ static VALUE parser_heredoc_dedent(struc https://github.com/ruby/ruby/blob/trunk/parse.y#L749 #define FIXME 0 #else -#define ripper_id2sym(id) id +#define TOKEN2VAL(id) id #endif /* RIPPER */ #ifndef RIPPER @@ -1372,7 +1377,7 @@ command_asgn : lhs '=' command_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L1377 | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs { value_expr($5); - $$ = new_attr_op_assign($1, ripper_id2sym(idCOLON2), $3, $4, $5); + $$ = new_attr_op_assign($1, TOKEN2VAL(tCOLON2), $3, $4, $5); } | backref tOP_ASGN command_rhs { @@ -1431,7 +1436,7 @@ expr : command_call https://github.com/ruby/ruby/blob/trunk/parse.y#L1436 /*%%%*/ $$ = call_uni_op(method_cond($2), '!'); /*% - $$ = dispatch2(unary, ripper_id2sym('!'), $2); + $$ = dispatch2(unary, TOKEN2VAL('!'), $2); %*/ } | arg @@ -1540,7 +1545,7 @@ command : fcall command_args %pre https://github.com/ruby/ruby/blob/trunk/parse.y#L1545 $$ = NEW_CALL($1, $3, $4); fixpos($$, $1); /*% - $$ = dispatch4(command_call, $1, ID2SYM(idCOLON2), $3, $4); + $$ = dispatch4(command_call, $1, TOKEN2VAL(tCOLON2), $3, $4); %*/ } | primary_value tCOLON2 operation2 command_args cmd_brace_block @@ -1551,7 +1556,7 @@ command : fcall command_args %pre https://github.com/ruby/ruby/blob/trunk/parse.y#L1556 $$ = $5; fixpos($$, $1); /*% - $$ = dispatch4(command_call, $1, ID2SYM(idCOLON2), $3, $4); + $$ = dispatch4(command_call, $1, TOKEN2VAL(tCOLON2), $3, $4); $$ = method_add_block($$, $5); %*/ } @@ -1848,7 +1853,7 @@ lhs : user_variable https://github.com/ruby/ruby/blob/trunk/parse.y#L1853 /*%%%*/ $$ = attrset($1, idCOLON2, $3); /*% - $$ = dispatch3(field, $1, ID2SYM(idCOLON2), $3); + $$ = dispatch3(field, $1, TOKEN2VAL(tCOLON2), $3); %*/ } | primary_value call_op tCONSTANT @@ -2057,7 +2062,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2062 | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs { value_expr($5); - $$ = new_attr_op_assign($1, ripper_id2sym(idCOLON2), $3, $4, $5); + $$ = new_attr_op_assign($1, TOKEN2VAL(tCOLON2), $3, $4, $5); } | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs { @@ -2099,7 +2104,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2104 /*%%%*/ $$ = call_bin_op($1, '+', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('+'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('+'), $3); %*/ } | arg '-' arg @@ -2107,7 +2112,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2112 /*%%%*/ $$ = call_bin_op($1, '-', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('-'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('-'), $3); %*/ } | arg '*' arg @@ -2115,7 +2120,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2120 /*%%%*/ $$ = call_bin_op($1, '*', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('*'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('*'), $3); %*/ } | arg '/' arg @@ -2123,7 +2128,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2128 /*%%%*/ $$ = call_bin_op($1, '/', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('/'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('/'), $3); %*/ } | arg '%' arg @@ -2131,7 +2136,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2136 /*%%%*/ $$ = call_bin_op($1, '%', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('%'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('%'), $3); %*/ } | arg tPOW arg @@ -2139,7 +2144,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2144 /*%%%*/ $$ = call_bin_op($1, tPOW, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idPow), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tPOW), $3); %*/ } | tUMINUS_NUM simple_numeric tPOW arg @@ -2147,8 +2152,8 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2152 /*%%%*/ $$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0); /*% - $$ = dispatch3(binary, $2, ID2SYM(idPow), $4); - $$ = dispatch2(unary, ID2SYM(idUMinus), $$); + $$ = dispatch3(binary, $2, TOKEN2VAL(tPOW), $4); + $$ = dispatch2(unary, TOKEN2VAL(tUMINUS), $$); %*/ } | tUPLUS arg @@ -2156,7 +2161,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2161 /*%%%*/ $$ = call_uni_op($2, tUPLUS); /*% - $$ = dispatch2(unary, ID2SYM(idUPlus), $2); + $$ = dispatch2(unary, TOKEN2VAL(tUPLUS), $2); %*/ } | tUMINUS arg @@ -2164,7 +2169,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2169 /*%%%*/ $$ = call_uni_op($2, tUMINUS); /*% - $$ = dispatch2(unary, ID2SYM(idUMinus), $2); + $$ = dispatch2(unary, TOKEN2VAL(tUMINUS), $2); %*/ } | arg '|' arg @@ -2172,7 +2177,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2177 /*%%%*/ $$ = call_bin_op($1, '|', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('|'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('|'), $3); %*/ } | arg '^' arg @@ -2180,7 +2185,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2185 /*%%%*/ $$ = call_bin_op($1, '^', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('^'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('^'), $3); %*/ } | arg '&' arg @@ -2188,7 +2193,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2193 /*%%%*/ $$ = call_bin_op($1, '&', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('&'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('&'), $3); %*/ } | arg tCMP arg @@ -2196,7 +2201,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2201 /*%%%*/ $$ = call_bin_op($1, tCMP, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idCmp), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tCMP), $3); %*/ } | arg '>' arg @@ -2204,7 +2209,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2209 /*%%%*/ $$ = call_bin_op($1, '>', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('>'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('>'), $3); %*/ } | arg tGEQ arg @@ -2212,7 +2217,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2217 /*%%%*/ $$ = call_bin_op($1, tGEQ, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idGE), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tGEQ), $3); %*/ } | arg '<' arg @@ -2220,7 +2225,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2225 /*%%%*/ $$ = call_bin_op($1, '<', $3); /*% - $$ = dispatch3(binary, $1, ID2SYM('<'), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL('<'), $3); %*/ } | arg tLEQ arg @@ -2228,7 +2233,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2233 /*%%%*/ $$ = call_bin_op($1, tLEQ, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idLE), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tLEQ), $3); %*/ } | arg tEQ arg @@ -2236,7 +2241,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2241 /*%%%*/ $$ = call_bin_op($1, tEQ, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idEq), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tEQ), $3); %*/ } | arg tEQQ arg @@ -2244,7 +2249,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2249 /*%%%*/ $$ = call_bin_op($1, tEQQ, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idEqq), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tEQQ), $3); %*/ } | arg tNEQ arg @@ -2252,7 +2257,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2257 /*%%%*/ $$ = call_bin_op($1, tNEQ, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idNeq), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tNEQ), $3); %*/ } | arg tMATCH arg @@ -2260,7 +2265,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2265 /*%%%*/ $$ = match_op($1, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idEqTilde), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tMATCH), $3); %*/ } | arg tNMATCH arg @@ -2268,7 +2273,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2273 /*%%%*/ $$ = call_bin_op($1, tNMATCH, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idNeqTilde), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tNMATCH), $3); %*/ } | '!' arg @@ -2276,7 +2281,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2281 /*%%%*/ $$ = call_uni_op(method_cond($2), '!'); /*% - $$ = dispatch2(unary, ID2SYM('!'), $2); + $$ = dispatch2(unary, TOKEN2VAL('!'), $2); %*/ } | '~' arg @@ -2284,7 +2289,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2289 /*%%%*/ $$ = call_uni_op($2, '~'); /*% - $$ = dispatch2(unary, ID2SYM('~'), $2); + $$ = dispatch2(unary, TOKEN2VAL('~'), $2); %*/ } | arg tLSHFT arg @@ -2292,7 +2297,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2297 /*%%%*/ $$ = call_bin_op($1, tLSHFT, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idLTLT), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tLSHFT), $3); %*/ } | arg tRSHFT arg @@ -2300,7 +2305,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2305 /*%%%*/ $$ = call_bin_op($1, tRSHFT, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idGTGT), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tRSHFT), $3); %*/ } | arg tANDOP arg @@ -2308,7 +2313,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2313 /*%%%*/ $$ = logop(NODE_AND, $1, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idANDOP), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tANDOP), $3); %*/ } | arg tOROP arg @@ -2316,7 +2321,7 @@ arg : lhs '=' arg_rhs https://github.com/ruby/ruby/blob/trunk/parse.y#L2321 /*%%%*/ $$ = logop(NODE_OR, $1, $3); /*% - $$ = dispatch3(binary, $1, ID2SYM(idOROP), $3); + $$ = dispatch3(binary, $1, TOKEN2VAL(tOROP), $3); %*/ } | keyword_defined opt_nl {in_defined = 1;} arg @@ -3642,7 +3647,7 @@ method_call : fcall paren_args https://github.com/ruby/ruby/blob/trunk/parse.y#L3647 $$ = NEW_CALL($1, $3, $5); nd_set_line($$, $<num>4); /*% - $$ = dispatch3(call, $1, ripper_id2sym(idCOLON2), $3); + $$ = dispatch3(call, $1, TOKEN2VAL(tCOLON2), $3); $$ = method_optarg($$, $5); %*/ } @@ -3651,7 +3656,7 @@ method_call : fcall paren_args https://github.com/ruby/ruby/blob/trunk/parse.y#L3656 /*%%%*/ $$ = NEW_CALL($1, $3, 0); /*% - $$ = dispatch3(call, $1, ID2SYM(idCOLON2), $3); + $$ = dispatch3(call, $1, TOKEN2VAL(tCOLON2), $3); %*/ } | primary_value call_op @@ -4281,7 +4286,7 @@ numeric : simple_numeric https://github.com/ruby/ruby/blob/trunk/parse.y#L4286 $$ = $2; $$->nd_lit = negate_lit($$->nd_lit); /*% - $$ = dispatch2(unary, ID2SYM(idUMinus), $2); + $$ = dispatch2(unary, TOKEN2VAL(tUMINUS), $2); %*/ } ; @@ -4987,30 +4992,18 @@ dot_or_colon : '.' https://github.com/ruby/ruby/blob/trunk/parse.y#L4992 call_op : '.' { - /*%%%*/ - $$ = '.'; - /*% - $$ = ripper_id2sym('.'); - %*/ + $$ = TOKEN2VAL('.'); } | tANDDOT { - /*%%%*/ - $$ = tANDDOT; - /*% - $$ = ripper_id2sym(idANDDOT); - %*/ + $$ = TOKEN2VAL(tANDDOT); } ; call_op2 : call_op | tCOLON2 { - /*%%%*/ - $$ = tCOLON2; - /*% - $$ = ripper_id2sym(idCOLON2); - %*/ + $$ = TOKEN2VAL(tCOLON2); } ; @@ -11202,94 +11195,6 @@ ripper_dispatch7(struct parser_params *p https://github.com/ruby/ruby/blob/trunk/parse.y#L11195 return rb_funcall(parser->value, mid, 7, a, b, c, d, e, f, g); } -static const struct kw_assoc { - ID id; - const char *name; -} keyword_to_name[] = { - {keyword_class, "class"}, - {keyword_module, "module"}, - {keyword_def, "def"}, - {keyword_undef, "undef"}, - {keyword_begin, "begin"}, - {keyword_rescue, "rescue"}, - {keyword_ensure, "ensure"}, - {keyword_end, "end"}, - {keyword_if, "if"}, - {keyword_unless, "unless"}, - {keyword_then, "then"}, - {keyword_elsif, "elsif"}, - {keyword_else, "else"}, - {keyword_case, "case"}, - {keyword_when, "when"}, - {keyword_while, "while"}, - {keyword_until, "until"}, - {keyword_for, "for"}, - {keyword_break, "break"}, - {keyword_next, "next"}, - {keyword_redo, "redo"}, - {keyword_retry, "retry"}, - {keyword_in, "in"}, - {keyword_do, "do"}, - {keyword_do_cond, "do"}, - {keyword_do_block, "do"}, - {keyword_return, "return"}, - {keyword_yield, "yield"}, - {keyword_super, "super"}, - {keyword_self, "self"}, - {keyword_nil, "nil"}, - {keyword_true, "true"}, - {keyword_false, "false"}, - {keyword_and, "and"}, - {keyword_or, "or"}, - {keyword_not, "not"}, - {modifier_if, "if"}, - {modifier_unless, "unless"}, - {modifier_while, "while"}, - {modifier_until, "until"}, - {modifier_rescue, "rescue"}, - {keyword_alias, "alias"}, - {keyword_defined, "defined?"}, - {keyword_BEGIN, "BEGIN"}, - {keyword_END, "END"}, - {keyword__LINE__, "__LINE__"}, - {keyword__FILE__, "__FILE__"}, - {keyword__ENCODING__, "__ENCODING__"}, - {0, NULL} -}; - -static const char* -keyword_id_to_str(ID id) -{ - const struct kw_assoc *a; - - for (a = keyword_to_name; a->id; a++) { - if (a->id == id) - return a->name; - } - return NULL; -} - -#undef ripper_id2sym -static VALUE -ripper_id2sym(ID id) -{ - const char *name; - char buf[8]; - - if (id == (ID)(signed char)id) { - buf[0] = (char)id; - buf[1] = '\0'; - return ID2SYM(rb_intern2(buf, 1)); - } - if ((name = keyword_id_to_str(id))) { - return ID2SYM(rb_intern(name)); - } - if (!rb_id2str(id)) { - rb_bug("cannot convert ID to string: %ld", (unsigned long)id); - } - return ID2SYM(id); -} - static ID ripper_get_id(VALUE v) { Index: template/id.h.tmpl =================================================================== --- template/id.h.tmpl (revision 57597) +++ template/id.h.tmpl (revision 57598) @@ -57,6 +57,11 @@ enum ruby_id_types { https://github.com/ruby/ruby/blob/trunk/template/id.h.tmpl#L57 % end #define RUBY_TOKEN(t) RUBY_TOKEN_##t +#define RUBY_TOKEN2ID_TYPE(tok, type) ((tok<<RUBY_ID_SCOPE_SHIFT)|type|RUBY_ID_STATIC_SYM) +% types.each do |type| +#define TOKEN2<%=type%>ID(tok) RUBY_TOKEN2ID_TYPE(tok, RUBY_ID_<%=type%>) +% end + enum ruby_method_ids { % ids[:token_op].uniq {|_, op| op}.each do |id, op, token| id<%=id%> = <%=token ? "RUBY_TOKEN(#{token})" : "'#{op}'"%>, @@ -66,16 +71,23 @@ enum ruby_method_ids { https://github.com/ruby/ruby/blob/trunk/template/id.h.tmpl#L71 id<%=token%>, % end tPRESERVED_ID_END, -% ids.values_at(*types).flatten.each do |token| +% prev = 'tPRESERVED_ID_END' +% types.each do |type| +% tokens = ids[type] + tTOKEN_<%=type%>_BEGIN = <%=prev%>-1, +% tokens.each do |token| t<%=token%>, +% end +% prev = "tTOKEN_#{type}_END" + <%=prev%>, % end - tNEXT_ID, + tNEXT_ID = <%=prev%>, % types.each do |type| -% types = ids[type] or next -% types.empty? and next -#define TOKEN2<%=type%>ID(n) id##n = ((t##n<<ID_SCOPE_SHIFT)|ID_<%=type%>|ID_STATIC_SYM) -% types.each do |token| - TOKEN2<%=type%>ID(<%=token%>), +% tokens = ids[type] +#define DEFINE_<%=type%>ID_FROM_TOKEN(n) id##n = TOKEN2<%=type%>ID(t##n) +% tokens or next +% tokens.each do |token| + DEFINE_<%=type%>ID_FROM_TOKEN(<%=token%>), % end % end tLAST_OP_ID = tPRESERVED_ID_END-1, -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/