0

プロジェクトに 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() に仕事をさせることができないことです。つまり、「コマンド選択」と入力しても機能しますが、「選択」だけでは機能しません。

4

1 に答える 1

0

必要以上に難しくしていたようです。

解決策は、引用していないコードの一部にありました。私は自分の文法を、phrase_parse() ではなく parse を使って呼び出していました。自動スペーススキップを有効にします。

于 2012-01-28T15:02:26.900 に答える