Feature #4935 » label_patch.diff
parse.y (working copy) | ||
---|---|---|
#define new_evstr(n) new_evstr_gen(parser,(n))
|
||
static NODE *evstr2dstr_gen(struct parser_params*,NODE*);
|
||
#define evstr2dstr(n) evstr2dstr_gen(parser,(n))
|
||
static NODE *dstr_to_dsym_gen(struct parser_params*, NODE*);
|
||
#define dstr_to_dsym(n) dstr_to_dsym_gen(parser,(n))
|
||
static NODE *splat_array(NODE*);
|
||
static NODE *call_bin_op_gen(struct parser_params*,NODE*,ID,NODE*);
|
||
... | ... | |
%token tAMPER /* & */
|
||
%token tLAMBDA /* -> */
|
||
%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG
|
||
%token tSTRING_DBEG tSTRING_DVAR tSTRING_END tLAMBEG
|
||
%token tSTRING_DBEG tSTRING_DVAR tSTRING_END tLAMBEG tLABEL_END
|
||
/*
|
||
* precedence table
|
||
... | ... | |
{
|
||
lex_state = EXPR_END;
|
||
/*%%%*/
|
||
if (!($$ = $2)) {
|
||
$$ = NEW_LIT(ID2SYM(rb_intern("")));
|
||
}
|
||
else {
|
||
VALUE lit;
|
||
switch (nd_type($$)) {
|
||
case NODE_DSTR:
|
||
nd_set_type($$, NODE_DSYM);
|
||
break;
|
||
case NODE_STR:
|
||
lit = $$->nd_lit;
|
||
$$->nd_lit = ID2SYM(rb_intern_str(lit));
|
||
nd_set_type($$, NODE_LIT);
|
||
break;
|
||
default:
|
||
$$ = NEW_NODE(NODE_DSYM, Qnil, 1, NEW_LIST($$));
|
||
break;
|
||
}
|
||
}
|
||
$$ = dstr_to_dsym($2);
|
||
/*%
|
||
$$ = dispatch1(dyna_symbol, $2);
|
||
%*/
|
||
... | ... | |
$$ = dispatch2(assoc_new, $1, $2);
|
||
%*/
|
||
}
|
||
;
|
||
| tSTRING_BEG string_contents tLABEL_END arg_value
|
||
{
|
||
/*%%%*/
|
||
$$ = list_append(NEW_LIST(dstr_to_dsym($2)), $4);
|
||
/*%
|
||
$$ = dispatch2(assoc_new, dispatch1(dyna_symbol, $2), $4);
|
||
%*/
|
||
};
|
||
operation : tIDENTIFIER
|
||
| tCONSTANT
|
||
... | ... | |
}
|
||
else {
|
||
token = parse_string(lex_strterm);
|
||
if (token == tSTRING_END || token == tREGEXP_END) {
|
||
if (token == tSTRING_END && (peek_n('\'', -1) || peek_n('"', -1))) {
|
||
if (peek(':') && (lex_state == EXPR_BEG || lex_state == EXPR_ENDARG || IS_ARG())) {
|
||
nextc();
|
||
token = tLABEL_END;
|
||
}
|
||
}
|
||
if (token == tSTRING_END || token == tREGEXP_END || token == tLABEL_END) {
|
||
rb_gc_force_recycle((VALUE)lex_strterm);
|
||
lex_strterm = 0;
|
||
lex_state = EXPR_END;
|
||
... | ... | |
}
|
||
static NODE *
|
||
dstr_to_dsym_gen(struct parser_params *parser, NODE *node) {
|
||
NODE *key;
|
||
if (!(key = node)) {
|
||
key = NEW_LIT(ID2SYM(rb_intern("")));
|
||
}
|
||
else {
|
||
VALUE lit;
|
||
|
||
switch (nd_type(key)) {
|
||
case NODE_DSTR:
|
||
nd_set_type(key, NODE_DSYM);
|
||
break;
|
||
case NODE_STR:
|
||
lit = key->nd_lit;
|
||
key->nd_lit = ID2SYM(rb_intern_str(lit));
|
||
nd_set_type(key, NODE_LIT);
|
||
break;
|
||
default:
|
||
key = NEW_NODE(NODE_DSYM, Qnil, 1, NEW_LIST(key));
|
||
break;
|
||
}
|
||
}
|
||
return key;
|
||
}
|
||
static NODE *
|
||
call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1)
|
||
{
|
||
value_expr(recv);
|
ext/ripper/eventids2.c (working copy) | ||
---|---|---|
static ID ripper_id_regexp_beg;
|
||
static ID ripper_id_regexp_end;
|
||
static ID ripper_id_label;
|
||
static ID ripper_id_label_end;
|
||
static ID ripper_id_tlambda;
|
||
static ID ripper_id_tlambeg;
|
||
... | ... | |
ripper_id_regexp_beg = rb_intern_const("on_regexp_beg");
|
||
ripper_id_regexp_end = rb_intern_const("on_regexp_end");
|
||
ripper_id_label = rb_intern_const("on_label");
|
||
ripper_id_label_end = rb_intern_const("on_label_end");
|
||
ripper_id_tlambda = rb_intern_const("on_tlambda");
|
||
ripper_id_tlambeg = rb_intern_const("on_tlambeg");
|
||
... | ... | |
{tWORDS_BEG, &ripper_id_words_beg},
|
||
{tXSTRING_BEG, &ripper_id_backtick},
|
||
{tLABEL, &ripper_id_label},
|
||
{tLABEL_END, &ripper_id_label_end},
|
||
{tLAMBDA, &ripper_id_tlambda},
|
||
{tLAMBEG, &ripper_id_tlambeg},
|
||