チェックの位置

繰り返しのチェックは、繰り返しの回数が無限の場合と有限の場合で同じ扱いができないことに今頃気付いた。

 A*B*
 A*B{0,100000}

上のB*の部分は、以下のように展開できる。

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

これと同じ方法を有限回の繰り返しB{0,100000}に使用すると正しくない。
何故かと言うと、CHECK_STATEの時点で入力文字列の同じ位置がマッチング対象になっていたとしても、残りの可能な繰り返し回数が異なっていれば、同じ状態ではないからである。