From: "K.Kosako" Date: 2002-12-10T16:11:43+09:00 Subject: [ruby-dev:19043] Re: [ONIGURUMA] \G mismatch nobu.nakada@nifty.ne.jpさんの <200212100625.gBA6Pho12140@sharui.nakada.kanuma.tochigi.jp>から > Oniguruma 20021130で、/_|\Ga/ =~ "x_a" がマッチしません。"_a"に > はマッチするところから、どうも\Gが_のほうまで影響してるような気 > がしますが…。 ありがとうございます。 またも最適化情報が間違っていました。 最適化情報生成の部分は、完全に作り直さないと駄目のような気がします。 (最適化にもなっていない) -- 小迫@ソフネック 渋谷区恵比寿1-15-1 --- regcomp.c.old Sat Nov 30 14:38:04 2002 +++ regcomp.c Tue Dec 10 15:57:53 2002 @@ -4492,6 +4492,7 @@ typedef struct { RegDistance dmax; /* max-distance from head */ int pos_id; /* position counter (for same position check) */ int anchor; + int in_alt; RegCharEncoding code; RegOptionType options; @@ -4529,6 +4530,7 @@ optbuf_init(OptBuf* obuf, regex_t* reg, obuf->dmin = obuf->dmax = 0; obuf->pos_id = 0; obuf->anchor = 0; + obuf->in_alt = 0; obuf->code = reg->code; obuf->options = reg->options; obuf->transtable = reg->transtable; @@ -4542,6 +4544,7 @@ optbuf_copy(OptBuf* obuf, OptBuf* from) obuf->dmax = from->dmax; obuf->pos_id = from->pos_id; obuf->anchor = from->anchor; + obuf->in_alt = from->in_alt; obuf->code = from->code; obuf->options = from->options; obuf->transtable = from->transtable; @@ -4878,6 +4881,7 @@ set_exact_info_node(regex_t* reg, OptBuf optbuf_copy(&save, obuf); do { optbuf_copy(&zobuf, &save); + zobuf.in_alt = 1; exactbuf_copy(&zebuf, econt); exactbuf_init(&tbest, &save); r = set_exact_info_node(reg, &zobuf, &zebuf, &tbest, NCONS(x).left); @@ -5076,12 +5080,12 @@ set_exact_info_node(regex_t* reg, OptBuf switch (NANCHOR(node).type) { case ANCHOR_BEGIN_BUF: - reg->anchor |= ANCHOR_BEGIN_BUF; + if (! obuf->in_alt) reg->anchor |= ANCHOR_BEGIN_BUF; optbuf_reset(obuf, 0, 0); break; case ANCHOR_BEGIN_POSITION: - reg->anchor |= ANCHOR_BEGIN_POSITION; + if (! obuf->in_alt) reg->anchor |= ANCHOR_BEGIN_POSITION; optbuf_reset(obuf, 0, 0); break; @@ -5091,18 +5095,22 @@ set_exact_info_node(regex_t* reg, OptBuf case ANCHOR_END_BUF: if (obuf->dmax != INFINITE_DISTANCE) { - reg->anchor |= ANCHOR_END_BUF; - reg->anchor_dmin = obuf->dmin; - reg->anchor_dmax = obuf->dmax; + if (! obuf->in_alt) { + reg->anchor |= ANCHOR_END_BUF; + reg->anchor_dmin = obuf->dmin; + reg->anchor_dmax = obuf->dmax; + } } break; case ANCHOR_SEMI_END_BUF: if (obuf->dmax != INFINITE_DISTANCE && ((reg->anchor & ANCHOR_END_BUF) == 0)) { - reg->anchor |= ANCHOR_SEMI_END_BUF; - reg->anchor_dmin = obuf->dmin; - reg->anchor_dmax = obuf->dmax; + if (! obuf->in_alt) { + reg->anchor |= ANCHOR_SEMI_END_BUF; + reg->anchor_dmin = obuf->dmin; + reg->anchor_dmax = obuf->dmax; + } } break;