構文木を作る その4

変数展開処理と文法の事前インスタンス化を追加しました。
今日の差分
前のコードとほとんど同じです。
前のバージョンでは、内部は行番号カウント付きの反復子で処理し、結果を返すときに元の反復子に戻していましたが、今回はパース結果に構文木が含まれるためこの方法が使えません。
とりあえず行番号なしになっていますが、不便なので後で対策を考えます。


その他、時間がなくてコミットできてませんが、

  • 変数への代入
  • 変数の展開
  • ルール(関数)の呼び出し
  • ルールの定義

辺りが実装できました。
ルールの本体はユーザー定義のものも組み込みのものと同じboost::function1に集約しています。

// ruleを評価する関数
bj::string_list eval_rule(bj::context& ctx, const node_t& tree);

// ruleの定義を評価する関数
void eval_rule_stmt(bj::context& ctx, const node_t& tree)
{
    bj::rule_definition def;
    // ...
    def.body = boost::bind(&eval_rule, _1, boost::cref(node));
    // ...
}

eval_ruleにbindするだけで、ルールを実行する関数の出来上がりです。楽チン。