Restringindo o Boost.Spirit real_parser existente (com uma política)
Desejo analisar um float, mas não permitir valores de NaN, por isso gere uma política que herda da política padrão e cria umreal_parser
com isso:
// 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);
Mas agora euAlém disso deseja garantir que o comprimento total da sequência seja analisado comno_nan
não excede 4, ou seja, "1,23" ou ".123" ou mesmo "2.e6" ou "inf" está ok, "3,2323" não é nem é "nan". Eu não posso fazer isso noparse_n
/parse_frac_n
seção da política, que parece separadamente esquerda / direita do ponto e não pode se comunicar (... limpa), o que eles teriam que fazer desde oNo geral comprimento é relevante.
A ideia então era estenderreal_parser
(noboost/spirit/home/qi/numeric/real.hpp
) eenrole oparse
método - mas esta classe não tem métodos. Ao lado dereal_parser
é oany_real_parser
estrutura quefaz terparse
, mas essas duas estruturas não parecem interagir de maneira óbvia.
Existe uma maneira de injetar facilmente meu próprio parse (), fazer algumas pré-verificações e chamar oreal analisar (return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)
) que segue as políticas especificadas? Escrever um novo analisador seria um método de último recurso, mas espero que exista uma maneira melhor.
(Usando o Boost 1.55, ou seja, Spirit 2.5.2, com C ++ 11)