这可能是一个非常简单的问题,特别是因为我已经成功地使用QI解析了一段时间的简单结构,并且可能应该已经知道了答案,但是无论如何我都不知道......
假设我们有一个容器,如:
struct GenderTally
{
std::vector<std::string> males;
std::vector<std::string> females;
};
和
之类的输入文件m:Steve;
f:Dora;
f:Martha;
m:Joe;
...
特定类别的对象以任何顺序出现,而不是所有对象都可能出现。
我将在这里跳过Fusion改编,但它将是两个字符串向量。
我的问题是,构建一个填充像这样的条件容器的语法。 到目前为止,我通过多次解析输入来解决这个问题,每次都使用专门的语法。 在这个例子中,这将是男性和女性。
在QI mini-XML教程中,我得到的印象是自动规则会消除语义操作,但不可否认,我是一名新手,仍然受到QI使用的核心(模板)魔术API的威胁。 所以,即使我知道这是糟糕的,糟糕的形式......我会非常感激在这里得到一个真实的例子,因为我在头灯堵塞时遇到了一些主要的鹿。 编辑: 不必完全适用于这个结构,只是...一个使用自动规则的语法的实际例子,并将事物放入适当的桶中。
答案 0 :(得分:5)
我在你的案子中做的是:
BOOST_FUSION_ADAPT_STRUCT(
GenderTally,
(std::vector<std::string>, males)
(std::vector<std::string>, females)
);
rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g =
*( ("f:" >> r)[phx::push_back(at_c<0>(_val), _1)]
| ("m:" >> r)[phx::push_back(at_c<1>(_val), _1)]
);
不好,但仍然是处理你所拥有的最简单的方法。
如果您有不同的数据结构,例如
struct Gender {
char gender;
std::string name;
};
typedef std::vector<Gender> GenderTally;
BOOST_FUSION_ADAPT_STRUCT(
Gender,
(char, gender)
(std::string, name)
);
你可以用不同的方式写出来:
rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g = *(char_('f') >> ':' >> r | char_('m') >> ':' >> r);
但是这段代码可能只适用于SVN中继,因为我们对最近才提交的属性处理有很多修复。
缺点是你需要一个单独的后处理步骤来整理男性和女性。