|
colderさんどうもです。最初からやれば良かったことですが、今さらながらデ
バッガーでトレースして追っかけてみたら、やはりHmJre.dll側がバグってまし
た。
おかげさまでまた1つバグを見つけていただいてしまいました。修正させてい
ただきますとともに、似たようなミスが無いか他も探してみます。
トレースした結果:
(a|)+\1で"a"に検索させた場合:
patternAが (a|) で、\2がpatternBとして、マッチングさせる関数を仮に
trymatch( パターン, 文字列, x座標, 長さ ) --> 返り値=ヒットした長さ
とすると、
patternAの1巡目:
trymatch( patternA, "a", 0, 0 ) --> OK, length=0
trymatch( patternB, "a", 1, 0 ) --> OK, length=0
--> 結果候補 x=0,len=0
trymatch( patternA, "a", 0, 1 ) --> OK, length=1
trymatch( patternB, "a", 1, 0 ) --> NG
patternAの2巡目:
trymatch( patternA, "a", 1, 0 ) --> OK, length=0
trymatch( patternB, "a", 1, 0 ) --> OK, length=0
--> 結果候補 x=0, len=1
となるべき所が、HmJre.dll内部に過去のマッチング履歴を再利用する処理が
あって、上記例だと、
trymatch( patternB, "a", 1, 0 )
が以前NGだったということでヒットしない扱いにしてしまってました。
patternBがpatternAに依存するタグを使ってる場合は例外扱いする必要がありま
した。
|
|