有限と無限の間で(2)

前回の日記で、有限回の繰り返しは、そのループの中でチェックできない。ループから出た位置でチェックするしかない、と書いた。

例: B{0,10}の展開
PUSH           /* JUMPの直後からの再実行をスタックに登録 */
...Bの展開...
JUMP           /* PUSHの位置に戻る */
CHECK_STATE

(有限回で停止するための処理は省いて書いた)
ここで、繰り返しの対象であるBの中に繰り返しがあった場合にも、チェックできなくなることに今日になって気付いた。
従って、以下のパターンはチェックが働かなくなる。

/((a*)*){0,2}/

{0,1}の場合は、例外的にチェック可能。(何故でしょう?)

/((a*)*){0,1}/