【发布时间】:2015-01-07 05:04:17
【问题描述】:
我正在尝试为一种语言的多个子集定义一些 Boost::spirit::qi 解析器,并且代码重复最少。为此,我创建了一些基本的规则构建函数。原始解析器工作正常,但一旦我开始使用组合函数,我的解析器似乎不再工作。
一般语言的形式是:
A B: C
有些语言的子集,其中A、B 或C 必须是特定类型,例如A 是int 而B 和C 是浮点数。这是我用于该子语言的解析器:
using entry = boost::tuple<int, float, float>;
template <typename Iterator>
struct sublang : grammar<Iterator, entry(), ascii::space_type>
{
sublang() : sublang::base_type(start)
{
start = int_ >> float_ >> ':' >> float_;
}
rule<Iterator, entry(), ascii::space_type> start;
};
但由于子集很多,我尝试创建一个函数来构建我的解析器规则:
template<typename AttrName, typename Value>
auto attribute(AttrName attrName, Value value)
{
return attrName >> ':' >> value;
}
这样我就可以更轻松地为每个子集构建解析器,而无需重复信息:
// in sublang
start = int_ >> attribute(float_, float_);
但是这失败了,我不知道为什么。在我的 clang 测试中,解析失败了。在 g++ 中,程序似乎崩溃了。
这是完整的示例代码:http://coliru.stacked-crooked.com/a/8636f19b2e9bff8d
当前代码有什么问题,解决这个问题的正确方法是什么?我想避免在每个子语言解析器中指定属性和其他元素的语法。
【问题讨论】:
标签: c++ boost boost-spirit boost-spirit-qi