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は空白の扱いが特殊なので結局ダメです。