5

boost.spiritを使用して、フォームの単純なコマンドラインを解析しようとしますcommand:param1 param2...

そうするために、私はこのパーサーを作成しました:

(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]

2つの複合パーサーの属性タイプはベクトルであるため、cmdとparamsがベクトルタイプの場合はこれが機能します。ただし、タイプがstd :: stringの場合は、そうではありません。Webでこのソリューションを検索しているときに、文字列でも機能するはずだというヒントを見つけました。とにかく私はこれを文字列で動作させることができますか?

4

1 に答える 1

9

もちろん、セマンティックアクションを使用する場合、自動属性伝播は発生しません。両方のパーサー(+(char_ - ':')および*char_)は、属性としてを公開std::vector<char>します。したがって、も_1参照しstd::vector<char>ます。cmdおよびparamsがそのインスタンスである場合、aからaへの割り当てが定義されstd::stringていないため、コンパイルされません。std::vector<char>std::string

ただし、セマンティックアクションを取り除くと、次のように機能します。

std::string s("command:param1 param2");
std::string cmd, params;
parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params);

これは単純であるだけでなく、高速でもあります。パーサーは、一致した文字を指定された文字列に直接配置します。

于 2010-10-20T16:31:10.217 に答える