Beschränkung des vorhandenen Boost.Spirit-Real_Parsers (mit einer Richtlinie)
Ich möchte ein Float analysieren, aber keine NaN-Werte zulassen. Daher erstelle ich eine Richtlinie, die von der Standardrichtlinie erbt, und erstelle einreal_parser
damit
// 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);
Aber jetzt ichebenfall möchte sicherstellen, dass die Gesamtlänge des mit @ analysierten Strinno_nan
überschreitet nicht 4, d. h. "1,23" oder ".123" oder sogar "2.e6" oder "inf" ist in Ordnung, "3,2323" ist nicht, noch ist "nan". Das kann ich im @ nicht machparse_n
/parse_frac_n
bschnitt @ der Richtlinie, der separat links / rechts vom Punkt angezeigt wird und nicht kommunizieren kann ...saube), das müssten sie seit deminsgesam Länge ist relevant.
Die Idee war dann zu verlängernreal_parser
(imboost/spirit/home/qi/numeric/real.hpp
) undpack dasparse
Method - aber diese Klasse hat keine Methoden. Neben anreal_parser
ist derany_real_parser
struct which does habenparse
, aber diese beiden Strukturen scheinen nicht auf offensichtliche Weise zu interagieren.
Ist es eine Möglichkeit, auf einfache Weise meine eigene Analyse () einzufügen, einige Vorabprüfungen durchzuführen und dann das @ aufzurufeech parse return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)
) was hält sich dann an die vorgegebenen richtlinien? Das Schreiben eines neuen Parsers wäre die letzte Möglichkeit, aber ich hoffe, es gibt einen besseren Weg.
(Verwenden von Boost 1.55, d. H. Spirit 2.5.2, mit C ++ 11)