Spirit

行数のカウント

引き続き、組み込みルールを実装中です。 UPDATE DELETE_MODULE CALLER_MODULE 現在、コールスタックを返すBACKTRACEルールを実装しているところなのですが、これまで行数をカウントしていなくて、どう実装すべきか悩んでいます。 Boost.Spirit的には、反復…

eval_in_module_d

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

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

リストパーサー

今日はルールの持ち方とセマンティックアクションのカスタマイズを考えていたものの考えがまとまらず、結局bjam_grammarを少し手直ししただけです。 今日の差分 ルールの単純化のためにリストパーサーを使ってみました。 and_expr = eq_expr % ( keyword_p("…

nocalc

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

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

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

bjam_win その15 Grammarの戻り値

bjam_grammarのブロック、if、forを実装しました。 bjam_grammar.hppの差分 変数とルールのスコープがおかしかったバグとルール呼び出しの結果が常に空になるバグも修正しています。 今日ハマったのはSpiritのGrammarの戻り値に関してです。 struct bjam_gra…

短絡評価の実装

引き続きbjamインタプリタの実装中です。 現在、if/whileの条件部分と変数の代入までは出来ていて、あとはルール呼び出しを実装できればそれなりに動くはずというところです。 bjamの「&&」と「||」は優先順位が同じで、短絡評価もされるので次のようになり…

no_actions_d

前にno_actions_dは使わないと書いてましたが、使い方が分かったので、これを使ってbjam_grammarを書き直しています。 no_actions_dディレクティブを使う場合、対象となるパーサーのスキャナがno_actions_scanner<Scanner>::typeである必要があります。 この制約は再</scanner>…

var_expand_grammar その2

var_expand_grammarをいくつかの修飾子に対応させました。 今日の成果物 修飾子は変数を展開するときに適用されるフィルタのようなもので、 X = abc ; ECHO $(X:U) ; # 「ABC」を出力のように使います。 実装した修飾子は以下の通りです。 [n]、[n-]、[n-m] …

bjam_win その13

bjamインタプリタの実装を検討中です。 bjamの実行の単位/スコープとしては、 グローバル ({〜}による)明示的なブロック if/for/while/switchのブロック rule(関数に相当) などがあります。 パースの段階でこれらを文字列のまま保存しておいて、必要に応じて…

var_expand_grammar

簡易bjamインタプリタ実装の手始めとして、変数の展開を行うパーサー(?)var_expand_grammarを作りました。 bjam(というかjam)の変数展開は直積集合を形成するのが特徴的です。 X = a b c ; ECHO t$(X) ; # 「ta tb tc」を出力これを素直に表現するため、変数…

bjam_win その10

今度はBoostのルートJamfile.v2で問題が発生しました。 libraries = [ libraries-to-install $(all-libraries) ] ;これが、スキップパーサーのせいで、 lib raries = [ lib raries-to-install $(all-libraries) ] ;のように分割されてしまいました。 libルー…

bjam_win その9

昨日の予想通りの方法で、テストのターゲット名取得を実装しました。 これでBoostのtest用Jamfile.v2の大半はパースできるようになりました。 以下、実装の解説です。

Boost 1.34 のスキップパーサー

昨日のBoost 1.34で上手くパースできない問題ですが、CVSの履歴を二分探索で追ったところ、2005/10/18の変更が影響していました。 http://boost.cvs.sourceforge.net/boost/boost/boost/spirit/core/scanner/impl/skipper.ipp?r1=1.8&r2=1.9 Boost 1.33.1ま…

bjam_win その6

bjam_grammarがそれなりに動くようになったので、bjam_winに組み込んでみました。 今日の差分 名前はbjam_grammarですが、exe/libのターゲット名を取り出すことにしか使えません。 exe = "exe" >> literal[push_back_a(self.storage)] >> ':' >> *( varexp |…

bjam_grammar

bjamのパーサーをBoost.Spiritで書いています。 これまでBoost.Spiritで大きなパーサーは書いたことなかったので四苦八苦しています。 ↓とりあえず、これでかなり悩みました。 Boost.Spirit FAQ: The lexeme_d directive and rules FAQに従うと、jamのリテラ…