06/05/17 15:02:06
$NEST(start_match,end_match)
は
{start_match(●|(^start_match|end_match)?)+end_match}
という形式に一般化できるんじゃないかな。
●は {} の中のパターン自身を展開する(再帰呼び出し)
(^start_match|end_match)?の部分は実際には
1.今見ているところがstart_matchにマッチしたら再帰呼び出し
2.今見ているところがend_matchにマッチしたらリターン(ネスト成功)
3.どっちでもなければバッファ上の参照位置を1バイト進める
4.バッファ末尾に達したらリターン(ネスト失敗)
5.1に戻る
という動作でしょう。
こういう内部動作であれば、<a\s*> がオーバーランする挙動も
「<a\s*> が特別扱いされていないから」ということで自然に説明できます。