空白で区切られた、オプションでタグ付けされたキーワードの文字列を解析しようとしています。例えば、Boost.Spirit解析オプション接頭辞
descr:expense type:receivable customer 27.3
ここで、コロンの前の式はタグであり、任意である(すなわち、デフォルトのタグが仮定される)。
私はパーサーに自分がしたいことをすることはできません。私はcanonical exampleからいくつかのマイナーチェンジを行いましたが、その目的はキー/値のペア(HTTPクエリ文字列とよく似ています)を解析することです。タグが省略されて、私はそれを解析しかし
typedef std::pair<boost::optional<std::string>, std::string> pair_type;
typedef std::vector<pair_type> pairs_type;
template <typename Iterator>
struct field_value_sequence_default_field
: qi::grammar<Iterator, pairs_type()>
{
field_value_sequence_default_field()
: field_value_sequence_default_field::base_type(query)
{
query = pair >> *(qi::lit(' ') >> pair);
pair = -(field >> ':') >> value;
field = +qi::char_("a-zA-Z0-9");
value = +qi::char_("a-zA-Z0-9+-\\.");
}
qi::rule<Iterator, pairs_type()> query;
qi::rule<Iterator, pair_type()> pair;
qi::rule<Iterator, std::string()> field, value;
};
、、、optional<string>
は偽/空ではありません。むしろ、それは価値のコピーを持っています。ペアの2番目の部分にも値があります。
タグなしのキーワードをタグ(構文規則など、小数点など)にすることはできません。
私は間違っていますか?これはPEGと概念的に間違っていますか?