このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

抽出操作

Eが抽出式のとき、extract(a, E) は次のように評価される。

  • aとEから決まる検索範囲のノードセット(XPathで言う軸)をSとする。Sが空のときもある。
  • Eから決まるパターンをPとする。

概念的には(実装とは違う)、検索範囲Sをスキャンして配列として結果を得て、その配列の特定項目またはスライスを最終結果とする。よって、全配列を求めるアルゴリズムを示す。

  1. 結果配列rを r = [] と初期化する。
  2. 検索範囲Sが空のときは[]を結果として終わり。
  3. x(カレントノード)を検索範囲Sの最初のノードとする。
  4. eval(x, P) を評価する。
  5. 値がundefined(つまりパターンマッチングが失敗)のときは、次のノードに移り、新しいノードをx(カレントノード)とする。
  6. 値がundefined以外(つまりパターンマッチングが成功)のときは、得られた値をrにアペンドして、成功時の次のノードに移り、新しいノードをxとする。
  7. 次のノードがなくなったら、その時点のrを結果とする。

失敗時の「次のノード」と成功時の「次のノード」は違うかもしれない。その点は「ツリーの水平順序とパターンの侵入性 - 檜山正幸のキマイラ飼育記 メモ編」を参照。

eval(x, P) では、パターンマッチが成功したなら、パターンの内容を新しい評価環境で評価する。内容の評価で再びextractが使われるので、evalとextractは相互再帰的に呼び出し合う。