首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost::Spirit::Qi自动规则和条件操作

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

Stack Overflow用户
提问于 2011-03-22 11:43:31
回答 1查看 630关注 0票数 2

这可能是一个非常简单的问题,特别是因为我已经成功地使用QI解析了一段时间的简单结构,并且可能已经知道了答案,但无论如何我都无法理解它……

假设我们有一个容器,比如:

代码语言:javascript
复制
struct GenderTally
{
 std::vector<std::string> males;
 std::vector<std::string> females;
};

和一个输入文件,如

代码语言:javascript
复制
m:Steve;
f:Dora;
f:Martha;
m:Joe;
...

其中特定类别的对象以任何顺序出现,而不是所有对象都可能出现。

我将在这里跳过Fusion适配,但它将是两个字符串向量。

我的问题是,构造一个像这样填充条件容器的语法。到目前为止,我已经通过多次解析输入来解决这个问题,每次都使用特定的语法。在这个例子中,这将是一个男性和女性。

在QI mini-XML教程中,我得到的印象是自动规则去除了语义操作,但无可否认,我是一个新手,仍然被像QI使用的核心(模板)神奇的API吓倒。所以,即使我知道这是不好的,不好的形式…我会非常感激在这里得到一个真正的实际例子,因为我正在经历一些主要的鹿在前灯阻塞。edit:不必完全针对此结构,只需...一个使用自动规则的语法的实际示例,并将内容放入适当的存储桶中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-22 21:44:00

在你的情况下,我会这样做:

代码语言:javascript
复制
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)]
     );

不是很好,但仍然是处理你所拥有的东西的最简单的方法。

如果你有一个不同的数据结构,比如

代码语言:javascript
复制
struct Gender {
    char gender;
    std::string name;
};

typedef std::vector<Gender> GenderTally;

BOOST_FUSION_ADAPT_STRUCT(
    Gender,
    (char, gender)
    (std::string, name)
);

你可以用不同的方式写它:

代码语言:javascript
复制
rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g = *(char_('f') >> ':' >> r | char_('m') >> ':' >> r);

但这段代码可能只适用于SVN主干,因为我们最近才提交了许多属性处理的修复。

缺点是,您需要单独的后处理步骤来对男性和女性进行排序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5386513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档