From: Nobuyoshi Nakada Date: 2007-07-24T14:40:38+09:00 Subject: [ruby-dev:31294] Re: a = -(1) : warning: empty expression なかだです。 At Tue, 24 Jul 2007 11:22:33 +0900, Tanaka Akira wrote in [ruby-dev:31293]: > 以下のように、-(1) で warning: empty expression となります。 ripperをマージしたときのミスのようです。 ついでなのでvalue_expr()関連をちょっと見直してみましたが、 a|=break や while break; end などで何回も void value expression と繰り返されるのはあまり嬉しくなさそうです。 Index: parse.y =================================================================== --- parse.y (revision 12843) +++ parse.y (working copy) @@ -318,4 +318,5 @@ static NODE* node_newnode(struct parser_ static NODE *cond_gen(struct parser_params*,NODE*); #define cond(node) cond_gen(parser, node) +#define cond_value(node) cond(value_expr(node)) static NODE *logop_gen(struct parser_params*,enum node_type,NODE*,NODE*); #define logop(type,node1,node2) logop_gen(parser, type, node1, node2) @@ -326,5 +327,5 @@ static NODE *newline_node(NODE*); static void fixpos(NODE*,NODE*); -static int value_expr_gen(struct parser_params*,NODE*); +static NODE *value_expr_gen(struct parser_params*,NODE*); static void void_expr_gen(struct parser_params*,NODE*); static NODE *remove_begin(NODE*); @@ -355,6 +356,8 @@ static NODE *evstr2dstr_gen(struct parse #define evstr2dstr(n) evstr2dstr_gen(parser,n) -static NODE *call_op_gen(struct parser_params*,NODE*,ID,int,NODE*); -#define call_op(recv,id,narg,arg1) call_op_gen(parser, recv,id,narg,arg1) +static NODE *call_bin_op_gen(struct parser_params*,NODE*,ID,NODE*); +#define call_bin_op(recv,id,arg1) call_bin_op_gen(parser, recv,id,arg1) +static NODE *call_uni_op_gen(struct parser_params*,NODE*,ID); +#define call_uni_op(recv,id) call_uni_op_gen(parser, recv,id) static NODE *new_args_gen(struct parser_params*,NODE*,NODE*,ID,NODE*,ID); @@ -369,4 +372,6 @@ static NODE *arg_blk_pass(NODE*,NODE*); static NODE *new_yield_gen(struct parser_params*,NODE*); #define new_yield(node) new_yield_gen(parser, node) +static NODE *new_not_gen(struct parser_params*,NODE*); +#define new_not(node) new_not_gen(parser, node) static NODE *gettable_gen(struct parser_params*,ID); @@ -963,5 +968,5 @@ stmt : keyword_alias fitem {lex_state = { /*%%%*/ - $$ = node_assign($1, $3); + $$ = node_assign($1, value_expr($3)); /*% $$ = dispatch2(assign, $1, $3); @@ -997,5 +1002,5 @@ stmt : keyword_alias fitem {lex_state = else { $$ = $1; - $$->nd_value = call_op(gettable(vid),$2,1,$3); + $$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3)); } } @@ -1092,5 +1097,5 @@ stmt : keyword_alias fitem {lex_state = { /*%%%*/ - $$ = node_assign($1, $3); + $$ = node_assign($1, value_expr($3)); /*% $$ = dispatch2(assign, $1, $3); @@ -1138,5 +1143,5 @@ expr : command_call { /*%%%*/ - $$ = NEW_NOT(cond($2)); + $$ = new_not($2); /*% $$ = dispatch2(unary, ripper_intern("not"), $2); @@ -1146,5 +1151,5 @@ expr : command_call { /*%%%*/ - $$ = NEW_NOT(cond($2)); + $$ = new_not($2); /*% $$ = dispatch2(unary, ID2SYM('!'), $2); @@ -1758,5 +1763,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = node_assign($1, $3); + $$ = node_assign($1, value_expr($3)); /*% $$ = dispatch2(assign, $1, $3); @@ -1774,4 +1779,5 @@ arg : lhs '=' arg { /*%%%*/ + value_expr($3); if ($1) { ID vid = $1->nd_vid; @@ -1789,5 +1795,5 @@ arg : lhs '=' arg else { $$ = $1; - $$->nd_value = call_op(gettable(vid),$2,1,$3); + $$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3)); } } @@ -1941,5 +1947,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '+', 1, $3); + $$ = call_bin_op($1, '+', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('+'), $3); @@ -1949,5 +1955,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '-', 1, $3); + $$ = call_bin_op($1, '-', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('-'), $3); @@ -1957,5 +1963,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '*', 1, $3); + $$ = call_bin_op($1, '*', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('*'), $3); @@ -1965,5 +1971,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '/', 1, $3); + $$ = call_bin_op($1, '/', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('/'), $3); @@ -1973,5 +1979,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '%', 1, $3); + $$ = call_bin_op($1, '%', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('%'), $3); @@ -1981,5 +1987,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tPOW, 1, $3); + $$ = call_bin_op($1, tPOW, $3); /*% $$ = dispatch3(binary, $1, ripper_intern("**"), $3); @@ -1989,5 +1995,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op(call_op($2, tPOW, 1, $4), tUMINUS, 0, 0); + $$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0); /*% $$ = dispatch3(binary, $2, ripper_intern("**"), $4); @@ -1998,5 +2004,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op(call_op($2, tPOW, 1, $4), tUMINUS, 0, 0); + $$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0); /*% $$ = dispatch3(binary, $2, ripper_intern("**"), $4); @@ -2011,5 +2017,5 @@ arg : lhs '=' arg } else { - $$ = call_op($2, tUPLUS, 0, 0); + $$ = call_uni_op($2, tUPLUS); } /*% @@ -2020,5 +2026,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($2, tUMINUS, 0, 0); + $$ = call_uni_op($2, tUMINUS); /*% $$ = dispatch2(unary, ripper_intern("-@"), $2); @@ -2028,5 +2034,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '|', 1, $3); + $$ = call_bin_op($1, '|', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('!'), $3); @@ -2036,5 +2042,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '^', 1, $3); + $$ = call_bin_op($1, '^', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('^'), $3); @@ -2044,5 +2050,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '&', 1, $3); + $$ = call_bin_op($1, '&', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('&'), $3); @@ -2052,5 +2058,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tCMP, 1, $3); + $$ = call_bin_op($1, tCMP, $3); /*% $$ = dispatch3(binary, $1, ripper_intern("<=>"), $3); @@ -2060,5 +2066,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '>', 1, $3); + $$ = call_bin_op($1, '>', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('>'), $3); @@ -2068,5 +2074,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tGEQ, 1, $3); + $$ = call_bin_op($1, tGEQ, $3); /*% $$ = dispatch3(binary, $1, ripper_intern(">="), $3); @@ -2076,5 +2082,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, '<', 1, $3); + $$ = call_bin_op($1, '<', $3); /*% $$ = dispatch3(binary, $1, ID2SYM('<'), $3); @@ -2084,5 +2090,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tLEQ, 1, $3); + $$ = call_bin_op($1, tLEQ, $3); /*% $$ = dispatch3(binary, $1, ripper_intern("<="), $3); @@ -2092,5 +2098,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tEQ, 1, $3); + $$ = call_bin_op($1, tEQ, $3); /*% $$ = dispatch3(binary, $1, ripper_intern("=="), $3); @@ -2100,5 +2106,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tEQQ, 1, $3); + $$ = call_bin_op($1, tEQQ, $3); /*% $$ = dispatch3(binary, $1, ripper_intern("==="), $3); @@ -2108,5 +2114,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = NEW_NOT(call_op($1, tEQ, 1, $3)); + $$ = NEW_NOT(call_bin_op($1, tEQ, $3)); /*% $$ = dispatch3(binary, $1, ripper_intern("!="), $3); @@ -2132,5 +2138,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = NEW_NOT(cond($2)); + $$ = new_not($2); /*% $$ = dispatch2(unary, ID2SYM('!'), $2); @@ -2140,5 +2146,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($2, '~', 0, 0); + $$ = call_uni_op($2, '~'); /*% $$ = dispatch2(unary, ID2SYM('~'), $2); @@ -2148,5 +2154,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tLSHFT, 1, $3); + $$ = call_bin_op($1, tLSHFT, $3); /*% $$ = dispatch3(binary, $1, ripper_intern("<<"), $3); @@ -2156,5 +2162,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = call_op($1, tRSHFT, 1, $3); + $$ = call_bin_op($1, tRSHFT, $3); /*% $$ = dispatch3(binary, $1, ripper_intern(">>"), $3); @@ -2190,5 +2196,5 @@ arg : lhs '=' arg { /*%%%*/ - $$ = NEW_IF(cond($1), $3, $6); + $$ = NEW_IF(cond_value($1), $3, $6); fixpos($$, $1); /*% @@ -2737,5 +2743,5 @@ primary : literal NODE *zero = NEW_LIST(NEW_LIT(INT2FIX(0))); m->nd_next = block_append( - NEW_IF(cond( + NEW_IF( NEW_NODE(NODE_AND, NEW_CALL(NEW_CALL(NEW_DVAR(id), rb_intern("length"), 0), @@ -2743,5 +2749,5 @@ primary : literal NEW_CALL(NEW_CALL(NEW_DVAR(id), rb_intern("[]"), zero), rb_intern("kind_of?"), NEW_LIST(NEW_LIT(rb_cArray))), - 0)), + 0), NEW_DASGN_CURR(id, NEW_CALL(NEW_DVAR(id), rb_intern("[]"), zero)), @@ -7139,15 +7145,16 @@ new_evstr_gen(struct parser_params *pars static NODE * -call_op_gen(struct parser_params *parser, NODE *recv, ID id, int narg, NODE *arg1) +call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1) { + value_expr(recv); value_expr(arg1); - if (narg == 1) { - value_expr(arg1); - arg1 = NEW_LIST(arg1); - } - else { - arg1 = 0; - } - return NEW_CALL(recv, id, arg1); + return NEW_CALL(recv, id, NEW_LIST(arg1)); +} + +static NODE * +call_uni_op_gen(struct parser_params *parser, NODE *recv, ID id) +{ + value_expr(recv); + return NEW_CALL(recv, id, 0); } @@ -7327,6 +7334,4 @@ aryset_gen(struct parser_params *parser, if (recv && nd_type(recv) == NODE_SELF) recv = (NODE *)1; - else - value_expr(recv); return NEW_ATTRASGN(recv, tASET, idx); } @@ -7353,6 +7358,4 @@ attrset_gen(struct parser_params *parser if (recv && nd_type(recv) == NODE_SELF) recv = (NODE *)1; - else - value_expr(recv); return NEW_ATTRASGN(recv, rb_id_attrset(id), 0); } @@ -7413,10 +7416,9 @@ arg_add_gen(struct parser_params *parser } -static NODE* +static NODE * node_assign_gen(struct parser_params *parser, NODE *lhs, NODE *rhs) { if (!lhs) return 0; - value_expr(rhs); switch (nd_type(lhs)) { case NODE_GASGN: @@ -7445,8 +7447,9 @@ node_assign_gen(struct parser_params *pa } -static int +static NODE * value_expr_gen(struct parser_params *parser, NODE *node) { int cond = 0; + NODE *node0 = node; if (!node) { @@ -7458,5 +7461,5 @@ value_expr_gen(struct parser_params *par case NODE_DEFS: parser_warning(node, "void value expression"); - return Qfalse; + return 0; case NODE_RETURN: @@ -7467,5 +7470,5 @@ value_expr_gen(struct parser_params *par if (!cond) yyerror("void value expression"); /* or "control never reach"? */ - return Qfalse; + return 0; case NODE_BLOCK: @@ -7481,5 +7484,5 @@ value_expr_gen(struct parser_params *par case NODE_IF: - if (!value_expr(node->nd_body)) return Qfalse; + if (!value_expr(node->nd_body)) return 0; node = node->nd_else; break; @@ -7492,9 +7495,9 @@ value_expr_gen(struct parser_params *par default: - return Qtrue; + return node0; } } - return Qtrue; + return node0; } @@ -7739,5 +7742,5 @@ range_op(struct parser_params *parser, N if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) { warn_unless_e_option(node, "integer literal in conditional range"); - return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$."))); + return NEW_CALL(node, tEQ, NEW_LIST(NEW_GVAR(rb_intern("$.")))); } return node; @@ -7826,5 +7829,4 @@ cond_gen(struct parser_params *parser, N { if (node == 0) return 0; - value_expr(node); return cond0(parser, node); } @@ -7901,4 +7903,10 @@ new_yield_gen(struct parser_params *pars } +static NODE * +new_not_gen(struct parser_params *parser, NODE *node) +{ + return NEW_NOT(cond_value(node)); +} + static NODE* negate_lit(NODE *node) -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦