【发布时间】:2013-02-19 20:15:32
【问题描述】:
我正在尝试简单地解析这个并使用 Boost::Spirit 简化基于 xml 的结构,
One{
Two{
Three{
}
}
}
并且代码组织如下:
结构定义以保留精神材料:
struct config;
typedef boost::variant< boost::recursive_wrapper<config> , std::string > config_node;
struct config
{
std::string name;
std::vector<config_node> children;
};
BOOST_FUSION_ADAPT_STRUCT(
config,
(std::string, name)
(std::vector<config_node>, children)
)
(无耻地从xml介绍中窃取)
规则声明(在解析器类上)
qi::rule<Iterator, config(), qi::locals<std::string>, ascii::space_type> cfg;
qi::rule<Iterator, config_node(), ascii::space_type> node;
qi::rule<Iterator, std::string(), ascii::space_type> start_tag;
qi::rule<Iterator, void(std::string), ascii::space_type> end_tag;
在解析器'parse'方法中定义规则。
node = cfg;
start_tag = +(char_ -'{') >> '{';
end_tag = char_('}');
cfg %= start_tag[_a = _1]
>> *node
>> end_tag(_a);
_a 和 _1 是 boost::phoenix 变量。
此规则适用于上面粘贴的小片段,但如果我将其更改为:
One{
Two{
}
Three{
}
}
(同一范围内的两个组,而不是其他组内的组)解析器失败。 我不知道为什么。
【问题讨论】:
标签: c++ boost boost-spirit boost-spirit-qi