<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[Boost Spirit] Zeichenketten und Zahlen parsen]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Möchte gern chemische Formeln einlesen (C6H12O6, Mg1Cl2 ). Also immer mindestens ein Grossbuchstabe und 0-2 Kleinbuchstaben, ( gefolgt von einer Zahl oder auch nicht bei 1, das gibt noch ein Problem )</p>
<p>Also mit folgender Regel: (Bsp aus der Doku abgeändert)</p>
<pre><code class="language-cpp">bool
 parse_numbers(char const* str, vector&lt;unsigned int&gt;&amp; v/*, vector&lt;std::string&gt;&amp; c*/)
{
    return parse(str,

        //  Begin grammar
        (
            *( range_p('A','Z') &gt;&gt; !( *( range_p('a','z') ) ) &gt;&gt; uint_p[push_back_a(v)])
        )

        //  End grammar

        ).full;
}
</code></pre>
<p>kann ich strings wie die obigen Parsen und erhalte die Zahlen im Vector v. Nun bräucht ich aber noch die Symbole als Strings in nem anderen Vector c (oder am liebsten als Paare). Wie kann ich die einzelnen Zeichen verketten und so wie mit push_back_a(v) irgendwo rein schreiben?</p>
<p>Danke schonmal im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170312/boost-spirit-zeichenketten-und-zahlen-parsen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 02:52:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170312.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Jan 2007 12:47:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Sun, 14 Jan 2007 12:47:11 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Möchte gern chemische Formeln einlesen (C6H12O6, Mg1Cl2 ). Also immer mindestens ein Grossbuchstabe und 0-2 Kleinbuchstaben, ( gefolgt von einer Zahl oder auch nicht bei 1, das gibt noch ein Problem )</p>
<p>Also mit folgender Regel: (Bsp aus der Doku abgeändert)</p>
<pre><code class="language-cpp">bool
 parse_numbers(char const* str, vector&lt;unsigned int&gt;&amp; v/*, vector&lt;std::string&gt;&amp; c*/)
{
    return parse(str,

        //  Begin grammar
        (
            *( range_p('A','Z') &gt;&gt; !( *( range_p('a','z') ) ) &gt;&gt; uint_p[push_back_a(v)])
        )

        //  End grammar

        ).full;
}
</code></pre>
<p>kann ich strings wie die obigen Parsen und erhalte die Zahlen im Vector v. Nun bräucht ich aber noch die Symbole als Strings in nem anderen Vector c (oder am liebsten als Paare). Wie kann ich die einzelnen Zeichen verketten und so wie mit push_back_a(v) irgendwo rein schreiben?</p>
<p>Danke schonmal im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209632</guid><dc:creator><![CDATA[Chemiefan]]></dc:creator><pubDate>Sun, 14 Jan 2007 12:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Sun, 14 Jan 2007 13:09:21 GMT]]></title><description><![CDATA[<p>Gibts auch reguläre ausdrücke in boost?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209645</guid><dc:creator><![CDATA[mal so ne frage]]></dc:creator><pubDate>Sun, 14 Jan 2007 13:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Sun, 14 Jan 2007 13:15:13 GMT]]></title><description><![CDATA[<p>Gibts?? Wär noch dick <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209651</guid><dc:creator><![CDATA[Chemiefan]]></dc:creator><pubDate>Sun, 14 Jan 2007 13:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Sun, 14 Jan 2007 13:27:26 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/libs/regex/doc/index.html" rel="nofollow">Boost.Regex</a>. Das ist auch im TR1 drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209659</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 14 Jan 2007 13:27:26 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Sun, 14 Jan 2007 13:47:41 GMT]]></title><description><![CDATA[<p>Hab vorhin grad erst den Artiel im Forum zu Spirit gefunden. Spitze <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Habs nun mit einem Funktionsobjekt gemacht, und es klappt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Danke trotzdem und überhaupt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209674</guid><dc:creator><![CDATA[CHeMiEFAn]]></dc:creator><pubDate>Sun, 14 Jan 2007 13:47:41 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Mon, 15 Jan 2007 17:01:17 GMT]]></title><description><![CDATA[<p>Hallo nochmal</p>
<p>Also das ist nun meine Lösung, erhalte die einzelnen Fraktionen als Paare aus Zeichen und Koeffizient, alles wunderbar.<br />
Fast. Ich muss immer eine eins eingeben &quot;H1Cl1&quot;, würde gerne aber auch folgendes eingeben<br />
&quot;HCl&quot;, also 1 Cl und 1 H. Das gibt aber immer Parserfehler. Vielleicht kann mir jemand nen Tipp geben, wie ich das umgehen kann.</p>
<pre><code class="language-cpp">typedef std::pair&lt; std::string, unsigned int &gt; SymbolT;
typedef std::vector&lt; SymbolT &gt; SymbolTableT;

class Parser
{
    enum What
    {
        SYMBOL,
        COEFF
    };
    struct GetSymbol
    {
        GetSymbol( SymbolTableT&amp; symbol_table,
                   enum What&amp; switcher,
                   SymbolT&amp; act_item )
        :   m_symbol_table( symbol_table ),
            m_switcher( switcher ),
            m_act_item( act_item )
        {}
        template&lt;typename IteratorT&gt;
        void operator()( IteratorT begin, IteratorT end ) const
        {
            std::string str( begin, end );
            switch( m_switcher )
            {
                case SYMBOL:
                    m_act_item.first = str;
                    break;
                case COEFF:
                    std::stringstream sstr( str );
                    sstr &gt;&gt; m_act_item.second;
                    m_symbol_table.push_back( m_act_item );
                    break;
            }
        }
        SymbolTableT&amp; m_symbol_table;
        enum What&amp; m_switcher;
        SymbolT&amp; m_act_item;
    };
public:
    Parser()
    {}
    ~Parser()
    {}
    SymbolTableT parse_totals_formula( char const* str );
};

SymbolTableT Parser::parse_totals_formula( char const* str )
{
    SymbolT act;
    SymbolTableT ret;
    enum What symbol = SYMBOL;
    enum What coeff = COEFF;
    GetSymbol func_symb( ret, symbol, act );
    GetSymbol func_numb( ret, coeff, act );
    rule&lt;&gt; symbol_p = ( range_p('A','Z') &gt;&gt; !( *( range_p('a','z') ) ) );
    rule&lt;&gt; coeff_p = uint_p;
    rule&lt;&gt; formel_p = *( symbol_p[func_symb] &gt;&gt; coeff_p[func_numb] );
    parse_info&lt;&gt; info = parse(str, formel_p );
    if( !info.full )
    {
        std::cout &lt;&lt; &quot;Parser error at: &quot; &lt;&lt; info.stop &lt;&lt; std::endl;
    }
    return ret;
}
</code></pre>
<p>Danke mal wieder im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210374</guid><dc:creator><![CDATA[Chemiefan]]></dc:creator><pubDate>Mon, 15 Jan 2007 17:01:17 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Tue, 16 Jan 2007 14:40:43 GMT]]></title><description><![CDATA[<p>...ihr mögt mich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210817</guid><dc:creator><![CDATA[Chemiefan]]></dc:creator><pubDate>Tue, 16 Jan 2007 14:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to [Boost Spirit] Zeichenketten und Zahlen parsen on Wed, 17 Jan 2007 07:46:43 GMT]]></title><description><![CDATA[<p>Deine Regel erwartet die Formel als Folge aus Symbol+Nummer, d.h. wenn du auch alleinstehende Symbole akzeptieren willst, mußt du den Nummer-Teil optional setzen:</p>
<pre><code class="language-cpp">rule&lt;&gt; formel_p = *( symbol_p[func_symb] &gt;&gt; !coeff_p[func_numb] );
//dabei solltest du Dafür sorgen, daß func_symb() den Defaultwert 1 für die Anzahl vorbereitet
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1211126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211126</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 17 Jan 2007 07:46:43 GMT</pubDate></item></channel></rss>