NATIVE_RULE

BACKTRACEの修正とネイティブルール関連処理の追加を行いました。

  • ルール呼び出し時の行番号設定忘れを修正
  • 再帰的なルール呼び出しで行番号がずれる問題を修正
  • rule_definitionをshared_ptrでなく、そのまま管理するように変更
  • 組み込みルール"NATIVE_RULE"、"HAS_NATIVE_RULE"を追加


これまで組み込みルールとネイティブルールをごっちゃにしていたのですが、調べてみると別物でした。

種別 モジュール 既定で有効か? バージョン
組み込み ルート 有効 なし
ネイティブ ルート以外 無効 あり

ネイティブルールは既定では無効になっていて、NATIVE_RULEで明示的に設定しない限り呼び出せません。
また、HAS_NATIVE_RULEを使うと、ネイティブルールが実装されているか、期待するバージョンかどうかを確認することができます。

if [ HAS_NATIVE_RULE regex : transform : 2 ]
{
    # バージョン2のregex.transformがあれば使う
    NATIVE_RULE regex : transform ;
}
else
{
    rule transform
    {
        # ネイティブルールがないので自分で実装する
    }
}

BBv2を見る限り、基本的にネイティブルールはbjamでも実装できるけれど遅すぎるものを高速化するために使用されているようです。
実際、bjamで実装したバージョンもBBv2には含まれています。
bjamで実現できないものは組み込みルールを追加するというスタンスなのだと思います。