From: toyofuku@... Date: 1998-04-02T18:38:55+09:00 Subject: [ruby-list:7310] Re: modulo 豊福@パパイヤです。 私 > +!, -!, *!, /! みたいなのに alias できて演算子として > 使えればいいんですがダメですかね。 "+!other" は "+! other" と "+ !other" で ambiguous でまずいかとも思ったんですが、 "foo.bar!other" は "foo.bar!(other)" と解釈されるんで、 "+!" もいいかと parse.y をいじってみました。 採用されないような気がするので全演算をいじるのは やめて "+!" と "*!" だけにしました。 *** parse.y.orig Mon Feb 9 19:56:33 1998 --- parse.y Tue Mar 17 09:43:56 1998 *************** *** 199,204 **** --- 199,206 ---- %token LBRACK /* [ */ %token LBRACE /* { */ %token STAR /* * */ + %token APLUS /* +! */ + %token AMULT /* *! */ %token SYMBEG /* *************** *** 219,226 **** %left '|' '^' %left '&' %left LSHFT RSHFT ! %left '+' '-' ! %left '*' '/' '%' %right '!' '~' UPLUS UMINUS %right POW --- 221,228 ---- %left '|' '^' %left '&' %left LSHFT RSHFT ! %left '+' '-' APLUS ! %left '*' '/' '%' AMULT %right '!' '~' UPLUS UMINUS %right POW *************** *** 506,513 **** --- 508,517 ---- | LSHFT { $$ = LSHFT; } | RSHFT { $$ = RSHFT; } | '+' { $$ = '+'; } + | APLUS { $$ = APLUS; } | '-' { $$ = '-'; } | '*' { $$ = '*'; } + | AMULT { $$ = AMULT; } | STAR { $$ = '*'; } | '/' { $$ = '/'; } | '%' { $$ = '%'; } *************** *** 585,590 **** --- 589,598 ---- { $$ = call_op($1, '+', 1, $3); } + | arg APLUS arg + { + $$ = call_op($1, APLUS, 1, $3); + } | arg '-' arg { $$ = call_op($1, '-', 1, $3); *************** *** 593,598 **** --- 601,610 ---- { $$ = call_op($1, '*', 1, $3); } + | arg AMULT arg + { + $$ = call_op($1, AMULT, 1, $3); + } | arg '/' arg { $$ = call_op($1, '/', 1, $3); *************** *** 2188,2193 **** --- 2200,2209 ---- lex_state = EXPR_BEG; return OP_ASGN; } + else if (c == '!') { + lex_state = EXPR_BEG; + return AMULT; + } pushback(c); if (lex_state == EXPR_ARG && space_seen && !isspace(c)){ arg_ambiguous(); *************** *** 2362,2367 **** --- 2378,2386 ---- if (c == '@') { return UPLUS; } + else if (c == '!') { + return APLUS; + } pushback(c); return '+'; } *************** *** 2370,2375 **** --- 2389,2398 ---- yylval.id = '+'; return OP_ASGN; } + else if (c == '!') { + lex_state = EXPR_BEG; + return APLUS; + } if (lex_state == EXPR_ARG) { if (space_seen && !isspace(c)) { arg_ambiguous(); *************** *** 3709,3718 **** --- 3732,3744 ---- static struct op_tbl rb_op_tbl[] = { DOT2, "..", '+', "+", + APLUS, "+!", '-', "-", '+', "+(binary)", + APLUS, "+!(binary)", '-', "-(binary)", '*', "*", + AMULT, "*!", '/', "/", '%', "%", POW, "**", --- 豊福@パパイヤ unbound@papaya.juice.or.jp toyofuku@juice.or.jp