有限と無限の間で(2)
前回の日記で、有限回の繰り返しは、そのループの中でチェックできない。ループから出た位置でチェックするしかない、と書いた。
例: B{0,10}の展開 PUSH /* JUMPの直後からの再実行をスタックに登録 */ ...Bの展開... JUMP /* PUSHの位置に戻る */ CHECK_STATE
(有限回で停止するための処理は省いて書いた)
ここで、繰り返しの対象であるBの中に繰り返しがあった場合にも、チェックできなくなることに今日になって気付いた。
従って、以下のパターンはチェックが働かなくなる。
/((a*)*){0,2}/
{0,1}の場合は、例外的にチェック可能。(何故でしょう?)
/((a*)*){0,1}/