(epoj)CCRE


Prev: Teaching EPO a new language Up: Teaching EPO a new language

文脈確認正規表現
================

文脈確認正規表現(以後CCREと表記)は、ある正規表現で見付かったパターンが位置
する周囲の文脈を調べることによってより正確に検索対象物を厳密に絞れるように
設計した表現です。たとえばC言語の関数定義は正規表現で指定するととても大変
です(話すととても長くなるので省略します)。しかしとても簡単な規則で探すこと
により関数定義の本体を検索することが出来ます。

最初にC言語の識別子となりうるパターン `[A-Za-z_][0-9A-Za-z_]*' で検索しま
す。そしてその直後が開き丸括弧であるかどうか確認します。ここで、開き括弧が
来ない場合、そこに書いてあるものは変数です。括弧が来た場合、それは関数の参
照、もしくは関数の定義です。ここでさらに、その括弧を一個分スキップし、さら
に(改行を含めた)空白を読み飛ばした位置の文字を調べます。ここに来るものが開
き中括弧 `{' である場合、それはその場所での関数定義だといえます。

純粋なEmacsの正規表現では、改行を含む検索に難がある点と、括弧の対応を記述
できないのでこの文脈確認正規表現が有効になります。


文脈確認正規表現の構成
----------------------

CCREは先頭に正規表現文字列を含む任意長のリストです。(正規表現文字列 文脈確
認リスト) CCRE検索では、まず最初にリスト先頭の正規表現を検索し、マッチした
位置についてさらに文脈を確認します。調査する文脈は、以下のものがあります。

   * box, !box

     その位置が特定の箱の内部にあるかどうかを調べます。たとえばLaTeXで、
     enumerate 環境の内部にある `\item' なら真、という検索をしたい場合は
     `("\\\\item\\>" (box . "enumerate"))' とします。`!box' はその箱の内部
     でないときに真となります。

   * 整数

     `(整数 . "正規表現")'のように指定し、整数で指定した行以内に、指定した
     パターンが見付かれば真。そうでなければ偽となります。負数を指定すると
     バッファ先頭方向を調べます。

   * before, !before

     `(before . "正規表現")' のように指定し、最初にマッチしたものの直前(改
     行・空白は無視する)が指定したパターンにマッチすれば真、そうでなければ
     偽となります。!before の場合はマッチしなければ真となります。

   * after, !after

     `(after . "正規表現")' のように指定し、最初にマッチしたものの直後(改
     行・空白は無視する)が指定したパターンにマッチすれば真、そうでなければ
     偽となります。!after の場合はマッチしなければ真となります。

   * paren, !paren

     `(paren 数値 "正規表現")' のように指定し、最初にマッチしたものの位置
     から「数値」個分だけ括弧を飛ばし、改行・空白を飛ばした部分が指定した
     パターンにマッチすれば真、そうでなければ偽となります。!paren の場合は
     マッチしなければ真となります。数値に負を指定した場合はバッファ先頭方
     向に括弧を「数値」個戻ります。

   * upparen, !upparen

     `(upparen 数値 "正規表現")' のように指定し、最初にマッチしたものの位
     置から「数値」個分だけ括弧を外側に出て、改行・空白を飛ばした部分が指
     定したパターンにマッチすれば真、そうでなければ偽となります。!upparen 
     の場合はマッチしなければ真となります。数値に負を指定した場合はバッファ
     先頭方向に括弧を「数値」個分出ます。

   * exclude `(exclude 数値 "正規表現")'のように指定し、最初の正規表現のグ
     ループ番号「数値」にマッチしたものが、「正規表現」にマッチした場合は
     偽となります。識別子を検索して、予約語を除外したいような場合に利用し
     ます。

   * require `(require 数値 "正規表現")'のように指定し、最初の正規表現のグ
     ループ番号「数値」にマッチしたものが、「正規表現」にマッチした場合に
     真となります。excludeの逆です。

   * context `(context . 文脈確認正規表現)'のように指定し、最初にマッチし
     た位置から、再帰的にさらにCCRE検索をします。

   * or `(or . 文脈確認リストのリスト)'のように指定し、複数の文脈確認リス
     トのうちどれかが真を返したときに真を返します。

   * return これは文脈確認ではなく、CCRE検索全体のマッチ情報値を変更すると
     きに利用します。`(return)' とすると、直前の文脈確認でおこなわれた正規
     表現検査の結果の値がマッチ情報として設定される。`(return 方向 正規表
     現)'とすると、その位置から「正規表現」検索を行った結果がマッチ情報と
     して設定される。「方向」は forward または backward のいずれか。

最初の例で説明したように、Cの関数定義を探す場合に簡単な、「直後に丸括弧が
来て、その括弧を飛ばした位置に `{' がくるものというCCREパターンは次のよう
になります。

     ("[A-Za-z_][0-9A-Za-z_]*" (after . "(") (paren 1 "{"))



automatically generated by info2www.cgi version 1.2