3
我试图解析一个由空格分隔的,可选标记的关键字字符串。例如,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>
不是空/假。相反,它有一个价值的副本。这一对的第二部分也具有价值。
如果untagged关键字不能是标签(语法规则,例如有一个小数点),那么事情就像我所期望的那样工作。
我在做什么错?这是PEG的概念错误吗?