Astraia

AstraiaはJSON形式のオブジェクトを簡約するライブラリです。
規定された規則に従ってオブジェクトを簡約していきます。
JSONオブジェクトで表された構文木(AST)の最適化等に使用することができます。

インストール

Astraiaのインストール:

npm install astraia

モジュールの使用(node.js):

var A = require('astraia');

モジュールの使用(ブラウザ):

<script src='astraia.js'></script>

概要

Astraiaは規則を基にしてオブジェクトを簡約します。
例として、足し算と引き算からなるASTを簡約するプログラムを以下に示します。


var rules = [{
  pattern: {
    "type": A.eqv("add"),
    "left": A.number,
    "right": A.number
  },
  action: function(obj) {
    return obj.left + obj.right;
  }
}, {
  pattern: {
    "type": A.eqv("sub"),
    "left": A.number,
    "right": A.number
  },
  action: function(obj) {
    return obj.left - obj.right;
  }
}];

// outputs 2
A.scan(rules, {
  "type": "add",
  "left": {
    "type": "add",
    "left": 1,
    "right": 2
  },
  "right": {
    "type": "sub",
    "left": 3,
    "right": 4
  }
});
        
規則はpatternとactionからなるオブジェクトからなる配列です。
patternには構造を記したオブジェクト、またはプレースホルダからなります。
上記の最初の規則では、「属性typeは値"add"に、leftとrightは数値であるオブジェクトにマッチする」 ことを表しています。
規則にマッチしたオブジェクトは対応するactionで表される関数を呼び出します。
上記の例では、"left"の属性であるオブジェクトがactionに渡され、 obj.left + obj.right = 1 + 2 = 3が計算され、結果として数値3がleftの属性としておき変わります。
scanメソッドは規則を深さ優先順に探索し、順にマッチした規則を置き換えます。

プレースホルダには以下のものがあります。
詳細はリファレンスを参照してください。

名称内容
eqv 走査中に出現した値が与えられた値と等しい
equal 走査中に出現したオブジェクトが与えられたオブジェクトと構造も含めて等しい
any nullか未定義でない
number 数値であるか
string 文字列であるか
object 配列でないオブジェクトか
array 配列か
regex 正規表現とマッチするか
range 与えられた範囲内にあるか
all 配列の全ての要素が与えられた述語を満たすか
exists 配列の1つの要素が与えられた述語を満たすか

リファレンス

Astraiaのリファレンスはここにあります。