From: Inaba Hiroto Date: 1999-06-23T15:08:04+09:00 Subject: [ruby-dev:7193] ruby-1.3.x can't parse %Q{a{b}c} 稲葉です. ruby-1.3.x で %Q{a{b}c}のようなカッコのネストした文字列のparseが 失敗します. 1.2.6ではできるのですが… パッチを作ってみました. ついでに1.2.6でもだめだった %r{a{b}c} もできる ようにしてみました. --- parse.y.org Wed Jun 9 18:21:26 1999 +++ parse.y Wed Jun 23 13:55:00 1999 @@ -1977,7 +1977,7 @@ static int parse_regx(term, paren) - int term; + int term, paren; { register int c; char kcode = 0; @@ -1990,7 +1990,7 @@ newtok(); while ((c = nextc()) != -1) { - if ((!in_brack && c == term) || nest > 0) { + if (!in_brack && c == term && nest == 0) { goto regx_end; } @@ -2040,10 +2040,6 @@ } /* fall through */ default: - if (paren && !in_black) { - if (c == paren) nest++; - if (c == term) nest--; - } if (c == term) { tokadd(c); } @@ -2072,6 +2068,10 @@ return 0; default: + if (paren) { + if (c == paren) nest++; + if (c == term) nest--; + } if (ismbchar(c)) { int i, len = mbclen(c)-1; @@ -2198,10 +2198,7 @@ } if (paren) { if (c == paren) nest++; - if (c == term) { - nest--; - if (nest == 0) break; - } + if (c == term && nest-- == 0) break; } tokadd(c); } @@ -2276,10 +2273,7 @@ } if (paren) { if (c == paren) nest++; - if (c == term) { - nest--; - if (nest == 0) break; - } + if (c == term && nest-- == 0) break; } tokadd(c); } @@ -3034,11 +3028,12 @@ rb_compile_error("unterminated quoted string meets end of file"); return 0; } - paren = 0; + paren = term; if (term == '(') term = ')'; else if (term == '[') term = ']'; else if (term == '{') term = '}'; else if (term == '<') term = '>'; + else paren = 0; switch (c) { case 'Q': -- 稲葉 浩人