2007-05-01から1ヶ月間の記事一覧
module文を実装しました。 今日の差分 module文は続くブロックを指定したモジュール中で実行します。 これは、ブロックに入る前にモジュールを切り替え、ブロックから出たら元のモジュールに戻すことで実装できます。 これをそのまま実装すると、 module_stm…
bjam_grammarをテストしていて、string_listのバグを見つけました。 hamigaki::bjam::string_list ls; ls.begin() == ls.end(); // VC8のデバッグモードだとassert落ち 原因は、string_listが空の場合、begin()もend()も空(どのvectorの要素も指していない)…
bjam_grammarにセマンティックアクションを組み込み中です。 今回は、string_listやlist_of_listに演算子を定義している分、簡潔に記述できています。 特に楽なのは+=演算子で、push_back()やinsert()の呼び出しが必要だったのが、 lol = list [lol.val += a…
Safe Bool Idiomを使って、string_listをbjamの変数と同じように成否判定できるようにしてみました。 要するに、 string_list a("true"), b; if (a) std::cout << "if (a)" << std::endl; if (!b) std::cout << "if (!b)" << std::endl; のように書けるよう…
昨日はベクタのコピーを避けるようにしたわけですが、bjam_grammarでクロージャを使い出すとどうしてもコピーが発生してしまうので、Copy On Write(COW)の最適化を施すことにしました。 <hamigaki/bjam/util/list.hpp> 実装にはboost::shared_ptrを使っていて、必要に応じてオブジェクトを</hamigaki/bjam/util/list.hpp>…
昨日の参照を返せない問題は、次のインタフェースで簡単に解決できました。 typedef std::vector<std::string> list_type; const list_type& get_variable_values( list_type& buf, // 組み込み変数の場合に使うバッファ const std::string& name, // 変数の名前 const va</std::string>…
変数の展開処理がほぼ実装完了しました。 変数展開修飾子E,T,W,P,Jを実装 $(1)〜$(9)、$()に対応 variable_expansion.cppの差分 expand_variable_test.cppの差分 残りは、TMPDIRやTMPNAME等の組み込みの変数だけです。 現在、変数テーブルから値を取得するイ…
新しい変数展開コードがある程度動くようになったのでコミットしました。 今日の成果物 まだ、未実装の箇所がたくさんあります。 最初は変数のインデックス処理をbjamの動作通りに実装していたのですが、明らかにバグっぽかったので途中で方針を変更しました…
C++のstringにはpush_back()はあるのにpop_back()がないので、大抵「s.resize(s.size()-1)」で代用していたのですが、これって効率いいのか疑問に思ってちょっと実験してみました。 式 msvc-8.0 gcc-mingw-3.4.2 cw-8.3 borland-5.8.2 s.resize(s.size()-1) …
変数展開で使うパスの分解/連結関数を実装しました。 今日の成果物 bjamのPATHNAME構造体と微妙に仕様が違っています。 struct path_components { std::string grist; std::string root; // 末尾のデリミタを含む std::string dir; // 末尾のデリミタを含む …
ようやく考えがまとまってきたので、小物から実装し始めました。 今日の成果物 ほとんどオリジナルと似たものになっています。 さて、今日のbjam豆知識はIMPORT_MODULEルールです。 これはIMPORTモジュールと違い、モジュール中のルールを全てインポートする…
今日は変数の扱いを考えていて、やっぱり進んでいません。 bjamには$(1)や$(<)などの特殊な変数がありますが、この扱いはちょっと特殊です。 rule test1 ( * ) { 1 = hogehoge ; if $(1) != hogehoge { ECHO oops! ; # ここが実行される! } } test1 arg1 ;$…
今日はルールの持ち方とセマンティックアクションのカスタマイズを考えていたものの考えがまとまらず、結局bjam_grammarを少し手直ししただけです。 今日の差分 ルールの単純化のためにリストパーサーを使ってみました。 and_expr = eq_expr % ( keyword_p("…
今度は、モジュールを考慮しながら変数/ルールテーブルを再設計しています。 変数に関してはモジュール毎にテーブルを持つだけで済みそうなのですが、ルールは少々複雑です。 ユーザー定義のルールと組み込みルールがある 組み込みルールIMPORTにより、他の…
昨日作成したarg_p等を使ってbjam_parserをリライトしました。 今日の差分 とりあえずセマンティックアクションなしの文法チェックのみの状態です。 今回はなるべく正確に実装するため、bjamのjamgram.yを参考にしています。 jamgram.yをよく読むと、いくつ…
Hamigaki.Bjamを再開しました。 昨日も悩んでいたbjamのトークン切り出しですが、bjamのソースを眺めていたところ、εパーサーを使って独自のパーサーを定義し、スキップパーサーと組み合わせることで解決できることに気が付きました。 bjamの字句解析は、 空…
moduleとclassの実装はそれほど面倒でもなさそうなので、Hamigaki.Bjamを復活させてフルスペックのbjamを実装してみようかなという気になってきました。 手始めに、bjamの字句解析部分(scan.cとscan.h)を読んでいたところ、 # define SCAN_NORMAL 0 // 通常 …
bjam_grammarの精度を上げるにはmoduleとclassの実装が不可欠な気がしてきたので、bjamのclassについて調べてみました。
bjam_grammarにMATCHルールを実装するのを忘れていたので追加しました。 差分 MATCHルールは拡張正規表現のマッチングを行い、マッチした場合は部分式のリストを返します。 ECHO [ MATCH (.)b(.) : abc ] ; # 「a c」を表示正規表現に括弧を含めていないと、…
property.as-path相当のパス生成アルゴリズムを実装しました。 今日の差分 property.as-pathは、グリスト化されたプロパティのリストを渡すと、 デフォルト値またはABIに関係のないプロパティを削除、featureの属性がimplicitなら非グリスト化(feature.minim…
Boost 1.34がリリースされました。 Hamigakiライブラリも1.34の新機能に対応したいところですが、CygwinやFedoraのパッケージが揃うまで1.33.1との両対応でいきたいと思います。 TODO: BOOST_FILESYSTEM_NO_DEPRECATEDを定義した状態でコンパイルできるよう…
ターゲット名だけでなく、とりあえずターゲットの種類、requirement、usage-requirementを取得するようにしました。 今日の差分 テストプログラムやbjam_winではまだ名前しか使っていないので、見た目は変わっていません。 これを元に出力先ディレクトリを割…
今日はあまり進みませんでした。 UIにはほとんど手が付かず、バグ修正メインです。 事前定義変数(OS,NT,CYGWIN,OSPLAT)を追加 project-root.jamの検索でカレントディレクトリも見るように修正 os.nameルールを追加 "Target"コンボボックスの高さを大きくした…
今日は環境変数と設定ファイル等に対応しました。 今日の差分 環境変数の内容をグローバル変数に反映させた 設定ファイル(site-config.jamとuser-config.jam)を読み込むようにした プロジェクトルートの設定(project-root.jam/Jamroot/jamroot.jam)を読み込…
bjam_grammarに以下のルールを追加しました。 pathモジュール(make/glob) project-rulesモジュール(glob/path-constant/constant) modulesモジュール(poke/peek) 以下、実装していて分かったpeek/poke/constantの解説です。
bjam_grammarの組み込みルールにGLOBとGLOB-RECURSIVELYを追加しました。 bjam_grammar.hppの差分 glob.hppの差分 2つの違いは、GLOBは特定のディレクトリのファイル名にマッチするのに対し、GLOB-RECURSIVELYはパスの構成要素それぞれでマッチングを行うと…
えー、Hamigaki.Bjam構想は1日で中止になりました。 元々、「ある程度パースできればいい」という程度のものを作っていたため、ライブラリとしてキッチリとしたものに仕上げるにはかなり厳しそうです。 いくつか問題点を挙げておくと、 bjamのソースを見る…
bjam_grammarの組み込みルールはカスタマイズ可能にしたほうが便利そうなので、Hamigaki.Bjamとしてライブラリにすることにしました。 ひとまず、Boost.Waveを参考にディレクトリ構成と名前空間を変更しています。 今日の差分 まだ古いコードは残しています…
Boost.Spiritの利用例としてBoost.Waveのソースを少し読みました。(Waveの存在自体を忘れていました。) Boost.Spiritのサンプルでは単純すぎる場合が多いので、いろいろと参考になります。 Boost.Waveでもパースと値の評価を同時進行で行っているようで、「…
bjam_grammarのwhile、ルールの名前付き引数、ローカル変数/ルールを実装しました。 bjam_grammar.hppの差分 これでBoost.SerializationやBoost.Statechart等の複雑なJamfileでもターゲットのリストを取得できるようになりました。 今日気が付いたことは、ク…