Ограничение существующего Boost.Spirit real_parser (с политикой)
Я хочу проанализировать число с плавающей запятой, но не разрешить значения NaN, поэтому я создаю политику, которая наследуется от политики по умолчанию, и создаюreal_parser
с этим:
// using boost::spirit::qi::{real_parser,real_policies,
// phrase_parse,double_,char_};
template <typename T>
struct no_nan_policy : real_policies<T>
{
template <typename I, typename A>
static bool
parse_nan(I&, I const&, A&) {
return false;
}
};
real_parser<double, no_nan_policy<double> > no_nan;
// then I can use no_nan to parse, as in the following grammar
bool ok = phrase_parse(first, last,
no_nan[ref(valA) = _1] >> char_('@') >> double_[ref(b) = _1],
space);
Но теперь ятакже хочу убедиться, что общая длина строки проанализирована сno_nan
не превышает 4, то есть «1.23» или «.123» или даже «2.e6» или «inf» - это нормально, «3.2323» - нет, и не «nan». Я не могу сделать это вparse_n
/parse_frac_n
раздел политики, который отдельно смотрит влево / вправо от точки и не может общаться (... чисто), что они должны были бы св общем и целом длина имеет значение
Идея заключалась в том, чтобы расширитьreal_parser
(вboost/spirit/home/qi/numeric/real.hpp
) а такжеобернутьparse
метод - но у этого класса нет методов. Рядом сreal_parser
этоany_real_parser
структура, котораяделает иметьparse
, но эти две структуры, кажется, не взаимодействуют каким-либо очевидным образом.
Есть ли способ легко внедрить мой собственный parse (), сделать некоторые предварительные проверки, а затем вызватьреальный разбор (return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)
) который тогда придерживается данной политики? Написание нового парсера было бы последним средством, но я надеюсь, что есть лучший способ.
(Использование Boost 1.55, то есть Spirit 2.5.2, с C ++ 11)