我目前使用此解析器使用boost spirit x3解析双打:
boost::spirit::x3::real_parser<double, x3::strict_real_policies<double> > const strict_double = {};
但它也会解析.356
和356.
之类的双打。我想避免这种情况,并让用户改为编写0.356
和356.0
。
我可以对现有的解析器应用这样的限制吗?
有没有办法从头开始编写我自己的双解析器?
答案 0 :(得分: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;
};
完整示例(Running on 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);
}