構文木を作る その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するだけで、ルールを実行する関数の出来上がりです。楽チン。