2007-05-01から1ヶ月間の記事一覧

eval_in_module_d

module文を実装しました。 今日の差分 module文は続くブロックを指定したモジュール中で実行します。 これは、ブロックに入る前にモジュールを切り替え、ブロックから出たら元のモジュールに戻すことで実装できます。 これをそのまま実装すると、 module_stm…

optional_iterator

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…

phoenix::logical_not_op

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; のように書けるよう…

shared_ptrでCOW

昨日はベクタのコピーを避けるようにしたわけですが、bjam_grammarでクロージャを使い出すとどうしてもコピーが発生してしまうので、Copy On Write(COW)の最適化を施すことにしました。 <hamigaki/bjam/util/list.hpp> 実装にはboost::shared_ptrを使っていて、必要に応じてオブジェクトを</hamigaki/bjam/util/list.hpp>…

get_variable_values

昨日の参照を返せない問題は、次のインタフェースで簡単に解決できました。 typedef std::vector<std::string> list_type; const list_type& get_variable_values( list_type& buf, // 組み込み変数の場合に使うバッファ const std::string& name, // 変数の名前 const va</std::string>…

expand_variable その2

変数の展開処理がほぼ実装完了しました。 変数展開修飾子E,T,W,P,Jを実装 $(1)〜$(9)、$()に対応 variable_expansion.cppの差分 expand_variable_test.cppの差分 残りは、TMPDIRやTMPNAME等の組み込みの変数だけです。 現在、変数テーブルから値を取得するイ…

expand_variable

新しい変数展開コードがある程度動くようになったのでコミットしました。 今日の成果物 まだ、未実装の箇所がたくさんあります。 最初は変数のインデックス処理をbjamの動作通りに実装していたのですが、明らかにバグっぽかったので途中で方針を変更しました…

stringのpop_back()

C++

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) …

split_path/make_path

変数展開で使うパスの分解/連結関数を実装しました。 今日の成果物 bjamのPATHNAME構造体と微妙に仕様が違っています。 struct path_components { std::string grist; std::string root; // 末尾のデリミタを含む std::string dir; // 末尾のデリミタを含む …

IMPORT_MODULE

ようやく考えがまとまってきたので、小物から実装し始めました。 今日の成果物 ほとんどオリジナルと似たものになっています。 さて、今日の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により、他の…

bjam_parserリライト中

昨日作成したarg_p等を使ってbjam_parserをリライトしました。 今日の差分 とりあえずセマンティックアクションなしの文法チェックのみの状態です。 今回はなるべく正確に実装するため、bjamのjamgram.yを参考にしています。 jamgram.yをよく読むと、いくつ…

arg_p

Hamigaki.Bjamを再開しました。 昨日も悩んでいたbjamのトークン切り出しですが、bjamのソースを眺めていたところ、εパーサーを使って独自のパーサーを定義し、スキップパーサーと組み合わせることで解決できることに気が付きました。 bjamの字句解析は、 空…

bjamの字句解析

moduleとclassの実装はそれほど面倒でもなさそうなので、Hamigaki.Bjamを復活させてフルスペックのbjamを実装してみようかなという気になってきました。 手始めに、bjamの字句解析部分(scan.cとscan.h)を読んでいたところ、 # define SCAN_NORMAL 0 // 通常 …

class

bjam_grammarの精度を上げるにはmoduleとclassの実装が不可欠な気がしてきたので、bjamのclassについて調べてみました。

MATCH

bjam_grammarにMATCHルールを実装するのを忘れていたので追加しました。 差分 MATCHルールは拡張正規表現のマッチングを行い、マッチした場合は部分式のリストを返します。 ECHO [ MATCH (.)b(.) : abc ] ; # 「a c」を表示正規表現に括弧を含めていないと、…

bjam_target_path

property.as-path相当のパス生成アルゴリズムを実装しました。 今日の差分 property.as-pathは、グリスト化されたプロパティのリストを渡すと、 デフォルト値またはABIに関係のないプロパティを削除、featureの属性がimplicitなら非グリスト化(feature.minim…

1.34

Boost 1.34がリリースされました。 Hamigakiライブラリも1.34の新機能に対応したいところですが、CygwinやFedoraのパッケージが揃うまで1.33.1との両対応でいきたいと思います。 TODO: BOOST_FILESYSTEM_NO_DEPRECATEDを定義した状態でコンパイルできるよう…

bjam_target

ターゲット名だけでなく、とりあえずターゲットの種類、requirement、usage-requirementを取得するようにしました。 今日の差分 テストプログラムやbjam_winではまだ名前しか使っていないので、見た目は変わっていません。 これを元に出力先ディレクトリを割…

bjam_win その19

今日はあまり進みませんでした。 UIにはほとんど手が付かず、バグ修正メインです。 事前定義変数(OS,NT,CYGWIN,OSPLAT)を追加 project-root.jamの検索でカレントディレクトリも見るように修正 os.nameルールを追加 "Target"コンボボックスの高さを大きくした…

bjam_win その18

今日は環境変数と設定ファイル等に対応しました。 今日の差分 環境変数の内容をグローバル変数に反映させた 設定ファイル(site-config.jamとuser-config.jam)を読み込むようにした プロジェクトルートの設定(project-root.jam/Jamroot/jamroot.jam)を読み込…

peek/poke/constant

bjam_grammarに以下のルールを追加しました。 pathモジュール(make/glob) project-rulesモジュール(glob/path-constant/constant) modulesモジュール(poke/peek) 以下、実装していて分かったpeek/poke/constantの解説です。

bjam_win その17 GLOB

bjam_grammarの組み込みルールにGLOBとGLOB-RECURSIVELYを追加しました。 bjam_grammar.hppの差分 glob.hppの差分 2つの違いは、GLOBは特定のディレクトリのファイル名にマッチするのに対し、GLOB-RECURSIVELYはパスの構成要素それぞれでマッチングを行うと…

Hamigaki.Bjam 中止

えー、Hamigaki.Bjam構想は1日で中止になりました。 元々、「ある程度パースできればいい」という程度のものを作っていたため、ライブラリとしてキッチリとしたものに仕上げるにはかなり厳しそうです。 いくつか問題点を挙げておくと、 bjamのソースを見る…

Hamigaki.Bjam

bjam_grammarの組み込みルールはカスタマイズ可能にしたほうが便利そうなので、Hamigaki.Bjamとしてライブラリにすることにしました。 ひとまず、Boost.Waveを参考にディレクトリ構成と名前空間を変更しています。 今日の差分 まだ古いコードは残しています…

nocalc

Boost.Spiritの利用例としてBoost.Waveのソースを少し読みました。(Waveの存在自体を忘れていました。) Boost.Spiritのサンプルでは単純すぎる場合が多いので、いろいろと参考になります。 Boost.Waveでもパースと値の評価を同時進行で行っているようで、「…

bjam_win その16 クロージャの初期値

bjam_grammarのwhile、ルールの名前付き引数、ローカル変数/ルールを実装しました。 bjam_grammar.hppの差分 これでBoost.SerializationやBoost.Statechart等の複雑なJamfileでもターゲットのリストを取得できるようになりました。 今日気が付いたことは、ク…