bjam_win その10
今度はBoostのルートJamfile.v2で問題が発生しました。
libraries = [ libraries-to-install $(all-libraries) ] ;
これが、スキップパーサーのせいで、
lib raries = [ lib raries-to-install $(all-libraries) ] ;
のように分割されてしまいました。
libルールが
lib = "lib" >> literal[push_back_target_actor(self.storage)] >> ':' >> *( varexp | ':' ) ;
となっているのを、
lib // "lib"の直後に空白を要求するが、スキャナの位置は空白の前のまま = lexeme_d["lib" >> eps_p(space_p)] >> literal[push_back_target_actor(self.storage)] >> ':' >> *( varexp | ':' ) ;
とすればとりあえず解決できますが、これをあらゆるトークンに適用する必要が出てきます。
そもそも、Boost.Spiritのスキップパーサーは「フレーズ間の空白類を必要に応じてスキップする」ものですが、トークン間の空白類が必須なbjamには合っていません。
そこで、スキップパーサーを使うのをやめて明示的に空白を読み飛ばすことにしました。
最終的に、libルールはこうなりました。
lib = "lib" >> space >> literal[push_back_target_actor(self.storage)] >> space >> ':' >> *( space >> (varexp | ':') ) ;
bjam_grammarが字句レベルのパーサーから文字レベルのパーサーに変ったので、至る所にあったlexeme_dディレクティブもいらなくなりました。
bjam_grammar.hpp
(5/1:追記)
上記の"libraries"を"lib"で切ってしまう問題は、Boost1.34でドキュメント化されたdistinct_parserで解決できます。
それでも、bjamは空白の扱いが特殊なので結局ダメです。