1

我目前正在使用 boost spirit x3 和这个解析器解析双打:

boost::spirit::x3::real_parser<double, x3::strict_real_policies<double> > const strict_double = {};

但它也会解析双精度数.356356.我想避免这种情况,而是让用户编写0.356and 356.0。我怎样才能对这个现有的解析器应用这样的限制?有没有办法不从头开始编写我自己的双解析器?

4

1 回答 1

2

您可以非常轻松地创建执行您想要的自定义策略:

template <typename ValueType>
struct really_strict_real_policies : boost::spirit::x3::strict_real_policies<ValueType>
{
    static bool const allow_leading_dot = false;
    static bool const allow_trailing_dot = false;
};

完整示例(在 WandBox 上运行

#include <iostream>
#include <boost/spirit/home/x3.hpp>

template <typename ValueType>
struct really_strict_real_policies : boost::spirit::x3::strict_real_policies<ValueType>
{
    static bool const allow_leading_dot = false;
    static bool const allow_trailing_dot = false;
};

template <typename Parser>
void parse(const std::string& input, const Parser& parser, bool expected)
{
    std::string::const_iterator iter=input.begin(), end=input.end();

    bool result = boost::spirit::x3::parse(iter,end,parser);

    if( (result && (iter==end))==expected )
        std::cout << "Yay" << std::endl;
}

int main()
{
    boost::spirit::x3::real_parser<double, really_strict_real_policies<double> > const really_strict_double = {};

    parse(".2",really_strict_double,false);
    parse("2.",really_strict_double,false);
    parse("2.2",really_strict_double,true);
}
于 2016-10-18T19:03:27.710 回答