Boost :: Spirit :: Qi自动规则和条件操作

时间:2011-03-22 03:43:31

标签: c++ boost-spirit-qi

这可能是一个非常简单的问题,特别是因为我已经成功地使用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的威胁。 所以,即使我知道这是糟糕的,糟糕的形式......我会非常感激在这里得到一个真实的例子,因为我在头灯堵塞时遇到了一些主要的鹿。 编辑: 不必完全适用于这个结构,只是...一个使用自动规则的语法的实际例子,并将事物放入适当的桶中。

1 个答案:

答案 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中继,因为我们对最近才提交的属性处理有很多修复。

缺点是你需要一个单独的后处理步骤来整理男性和女性。