2011-03-22 84 views
2

这可能是一个很容易的问题,尤其是因为我已经成功使用QI来解析简单结构一段时间了,并且可能应该已经知道答案,但它躲开我不管......Boost :: Spirit :: Qi自动规则和条件操作

比方说,我们有这样一个容器:

struct GenderTally 
{ 
std::vector<std::string> males; 
std::vector<std::string> females; 
}; 

和像

m:Steve; 
f:Dora; 
f:Martha; 
m:Joe; 
... 

输入文件随着出现特定类别的对象以任何顺序,并不是所有的对象都可能出现。

我会在这里跳过融合适应,但它会是两个字符串向量。

我的问题是,构造一个语法来填充这样的条件容器。 到目前为止,我通过多次解析输入来解决此问题,每次都使用专门的语法。 在这个例子中,这将是一个男性和女性。在QI迷你XML教程中,我得到了自动规则带走语义动作的印象,但我承认,我是一名新手,仍然被QI使用的核心(模板)魔法API吓倒。所以,即使我知道这是坏的,糟糕的形式......我会非常感激在这里得到一个真实的实例,因为我正在经历一些大灯堵塞的主要鹿。 编辑: 不一定非得是这个结构,只是......一个使用自动规则的语法的实际例子,并将其放入适当的桶中。

回答

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主干工作仅在最近提交的属性处理。

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

+0

谢谢你的回答。是的,到目前为止,我使用第二种方法,简单的结构与单独的后处理步骤。我只是想知道这样一个基本无关紧要的问题是否可以用同样微不足道的方法来解决,而方法1看起来微不足道,但它仍然以一种实际的方式在我的头上。那么,我认为即使是复杂的解析器几乎总是这样吗?只是解析和没有计算,如排序,而不是使用后处理? – Erius 2011-03-22 14:06:28

相关问题