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_nbschnitt @ 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)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage