プロジェクトに boost::spirit を実装してきましたが、私の課題の 1 つは、次のタイプのコンテナーに直接解析することです。
map<string, string>
私はほとんどそこにいます。私が直面した問題は、 std::pair のキー値を自動的に割り当てることです。つまり、入力文字列の各トークンには事前に決定されたキーがあり、トークンが解析されるときにペアに自動的に挿入されるようにします。
私は近いと思いますが、そうではないかもしれません... これが(切り捨てられた)文法です:
command =
string( "select" )
;
key = string( "command" ) | qi::attr( std::string("command") );
command_pair = key >> ' ' >> command;
start =
command_pair >> *command_pair
;
qi::rule<Iterator, std::string()> command;
qi::rule<Iterator, std::pair<std::string, std::string>()> command_pair;
qi::rule<Iterator,parserMap()> start;
最終的な結果は、コマンド ラインで次のように入力することです。
select
パーサーに「コマンド」をキーとして挿入させます。次のように入力します。
command select
したがって、map["command"] 要素にアクセスすると、値 "select" が返されます。
問題は、qi::attr() に仕事をさせることができないことです。つまり、「コマンド選択」と入力しても機能しますが、「選択」だけでは機能しません。