Boost spirit x3双重解析器与限制

boost spirit x3 double parser with restrictions

本文关键字:spirit x3 Boost      更新时间:2023-10-16

我目前使用boost spirit x3解析双精度:

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

,但它也解析双精度,如.356356.,我想避免这种情况,并让用户写0.356356.0代替。如何在这个现有解析器上应用这样的限制?有没有一种不用从头开始编写自己的双解析器的方法?

您可以很容易地创建一个自定义策略来做您想做的事情:

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);
}