インタプリタの実装はできました。
今日の差分
あとはこのインタプリタをライブラリ側に移動させないといけません。
このとき、どこまで汎用化させるべきかをフレーム情報(ファイル名、行番号)との兼ね合いから考えてみました。
ファイル名が変わるタイミング
- include文の前後
- (他のファイルで定義された)ルール呼び出しの前後
include文の評価時にはファイル名は自明なのでいいとして、ルール呼び出しの方はルール定義にファイル名を保存しておく必要があります。
行番号が変わるタイミング
ルールの呼び出しは構文木の評価時に発生するので、構文木に行番号を残しておく必要があります。
結論
構文木に行番号付きの反復子を記録する必要があるので、反復子はhamigaki::line_counting_iteratorでラップして、parse_treeのNodeFactoryTにはnode_iter_data_factoryを適用することにします。(node_val_data_factoryでは反復子が保存されない)
また、node_iter_data_factoryを使う場合は評価中も反復子が有効でなければならないため、構文木だけでなくjamソースもメモリ上に残しておかなければなりません。