Restringir el Boost.Spirit existente real_parser (con una política)
Quiero analizar un flotante, pero no permitir valores NaN, por lo que genero una política que hereda de la política predeterminada y creo unreal_parser
con eso:
// 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);
Pero ahora yoademás desea asegurarse de que la longitud total de la cadena analizada conno_nan
no excede 4, es decir, "1.23" o ".123" o incluso "2.e6" o "inf" está bien, "3.2323" no lo es, ni es "nan". No puedo hacer eso en elparse_n
/parse_frac_n
sección de la política, que se ve por separado a la izquierda / derecha del punto y no se puede comunicar (...limpiamente), que tendrían que hacerlo desde elen general La longitud es relevante.
La idea entonces era extenderreal_parser
(enboost/spirit/home/qi/numeric/real.hpp
) yenvolver elparse
método - Pero esta clase no tiene métodos. Cerca dereal_parser
es elany_real_parser
estructura quehace tenerparse
, pero estas dos estructuras no parecen interactuar de manera obvia.
¿Hay alguna manera de inyectar fácilmente mi propio análisis (), hacer algunas comprobaciones previas y luego llamar alreal analizar (return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)
) que se adhiere a las políticas dadas? Escribir un nuevo analizador sería un método de último recurso, pero espero que haya una mejor manera.
(Usando Boost 1.55, es decir, Spirit 2.5.2, con C ++ 11)