From: mput Date: 2003-10-23T04:50:03+09:00 Subject: [ruby-dev:21679] Proposal: string literal concatenation mput です。 文字リテラルの結合で、間に改行が挟めるようになると * http://pc2.2ch.net/test/read.cgi/tech/1063028224/747 みたいなのが動くようになる * リテラル同士の間にコメントが書けるようになる * Python にできて Ruby にできないことがひとつ減る といったあたりが嬉しいのですが、ダメでしょうか? Index: parse.y =================================================================== RCS file: /src/ruby/parse.y,v retrieving revision 1.296 diff -u -1 -r1.296 parse.y --- parse.y 15 Oct 2003 02:25:44 -0000 1.296 +++ parse.y 22 Oct 2003 19:26:42 -0000 @@ -73,2 +73,3 @@ EXPR_MID, /* newline significant, +/- is a operator. */ + EXPR_STR, /* ignore newline, +/- is a operator. */ EXPR_FNAME, /* ignore newline, no reserved words. */ @@ -85,2 +86,4 @@ +static stack_type paren_nest = 0; + static stack_type cond_stack = 0; @@ -3299,3 +3302,3 @@ lex_strterm = 0; - lex_state = EXPR_END; + lex_state = EXPR_STR; } @@ -3333,2 +3336,5 @@ goto retry; + case EXPR_STR: + if (paren_nest & 1) + goto retry; default: @@ -3928,2 +3934,3 @@ lex_state = EXPR_END; + paren_nest >>= 1; return c; @@ -4038,2 +4045,3 @@ lex_state = EXPR_BEG; + paren_nest = (paren_nest << 1) | 1; return c; @@ -4062,2 +4070,3 @@ CMDARG_PUSH(0); + paren_nest = (paren_nest << 1) | 1; return c; @@ -4065,8 +4074,14 @@ case '{': - if (IS_ARG() || lex_state == EXPR_END) + if (IS_ARG() || lex_state == EXPR_END) { c = '{'; /* block (primary) */ - else if (lex_state == EXPR_ENDARG) + paren_nest = (paren_nest << 1) | 0; + } + else if (lex_state == EXPR_ENDARG) { c = tLBRACE_ARG; /* block (expr) */ - else + paren_nest = (paren_nest << 1) | 0; + } + else { c = tLBRACE; /* hash */ + paren_nest = (paren_nest << 1) | 1; + } COND_PUSH(0); -- mput