2017-02-15 2 views
3

(Disclaimer, ich lerne Boost-Geist)Der Versuch, ganze Zahl als Zeichenfolge zu analysieren (qi :: as_wstring)

Ich versuche, einen Ausdruck wie folgt zu analysieren: F (1)

und möchte die 1 als String erhalten ("1" anstelle einer Zahl (was mit qi :: int_ funktioniert)).

Ich habe versucht, so etwas wie dies (was falsch ist, aber vielleicht bin ich in der richtigen Richtung), aber die resultierende Zeichenfolge „\ x1“ statt nur „“

Einsicht als zu was wird benötigt, um eine Zahl in eine Zeichenfolge zu analysieren?

template <typename Iterator> 
struct range_parser : boost::spirit::qi::grammar<Iterator, RangeResult(), iso8859_1::space_type> 
{ 
    range_parser() : range_parser::base_type(start) 
    { 
     using qi::lexeme; 
     using qi::int_; 
     using iso8859_1::digit; 

     number_as_string %= lexeme[ +(int_) ]; 

     start %= 
      qi::lit("F") 
      >> '(' 
      >> number_as_string 
      >> ")" 
      ; 
    } 

    qi::rule<Iterator, std::wstring(), iso8859_1::space_type> number_as_string; 
    qi::rule<Iterator, RangeResult(), iso8859_1::space_type> start; 
}; 
+0

kann jemand den Titel bearbeiten, um den Qi :: as_wstring Teil zu entfernen? Es ist nicht relevant (ich denke) – Max

+4

Ich denke, Sie wollten '+ (Ziffer)' (eine oder mehrere Ziffern) anstelle von '+ (int_)' (eine oder mehrere ganze Zahlen) schreiben. Beachten Sie, dass es nicht das Gleiche wie "int_" tut (keine Bereichsüberprüfung, kein Vorzeichen). Wenn Sie die von int_ erkannte Eingabe erfassen möchten, können Sie versuchen, die row-Anweisung zu verwenden: 'raw [int_]' http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit /qi/reference/directive/raw.html –

+0

(kam zurück auf das Projekt) Hey @BorisGlick, kannst du das als Antwort verwenden, damit ich das als Antwort akzeptieren kann? Vielen Dank. – Max

Antwort

1

Ich glaube, Sie bedeuten +(digit) (eine oder mehr Stellen) statt +(int_) (einer oder mehr ganzen Zahlen) zu schreiben. Beachten Sie, dass +(digit) nicht dasselbe tut wie qi::int_ (keine Bereichsüberprüfung, kein Vorzeichen, keine Begrenzung der Anzahl der Ziffern, Annahme von Eingängen wie "000", usw.).

Wenn Sie die Eingabe von qi::int_ erkannt aufnehmen möchten, können Sie versuchen, die rohe Direktive: raw[int_]http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit/qi/reference/directive/raw.html

Bei Bedarf ist es möglich, sowohl die analysierte Wert und den rohen Eingang des qi::int_ Parser speichern , siehe hier: qi::rule with inherited attribute as inherited attribute

+0

Danke. Ich habe meine einfachen Dinge in Ordnung gebracht, aber ich lerne immer noch den Spirit Parser. – Max

+0

Gern geschehen! Ich benutze es seit einer Weile, aber immer noch in einer "Lernphase". –

Verwandte Themen