<?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 und Parser mit Templates]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich brauche einen Parser, der mathematische Formeln parsen kann, mit Ziffern und Variablen. Ich wollte Boost.Spirit verwenden, aber leider hab ich zu wenig Wissen, als das ich sowas hinbekommen würde. Deshalb möchte ich gern um Hilfe bitten.</p>
<p>Anstatt Strukturen, wollte ich Klassen verwenden ...</p>
<p>Deklaration:</p>
<pre><code>#ifndef MATHFORMULAPARSER_H_
#define MATHFORMULAPARSER_H_

#include &lt;boost/spirit/include/classic.hpp&gt;
#include &lt;boost/spirit/include/qi.hpp&gt;
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;utility&gt;
#include &lt;string&gt;

namespace calc {

namespace qi = boost::spirit::qi;

template &lt;class Iterator&gt;
class MathFormulaParser : qi::grammar&lt;Iterator,qi::space_type&gt;
{
protected:
	 qi::rule&lt;Iterator,std::string, qi::space_type&gt; search_var;
	 qi::rule&lt;Iterator, std::string, qi::space_type&gt; var;
	 qi::rule&lt;Iterator, double&gt; constants;
	 qi::rule&lt;Iterator&gt; factor, term, expression;
	 std::vector&lt;std::string&gt; parse_result;

public:
	MathFormulaParser ()
	      : MathFormulaParser::base_type(expression)
	    {

			search_var = +(qi::char_(&quot;a-zA-Z_&quot;)) &gt;&gt; qi::char_('=');
			var = +(qi::char_(&quot;a-zA-Z_&quot;)) - search_var;
			constants = qi::double_;
			expression = term &gt;&gt; *((qi::char_('+') &gt;&gt; term) | (qi::char_('-')&gt;&gt;term));
			term = factor &gt;&gt; *((qi::char_('*') | qi::char_('/'))&gt;&gt;factor);
			factor = (var | constants)
					| ('(' &gt;&gt; expression &gt;&gt; ')')
					| (qi::char_('+')&gt;&gt;factor)
					| (qi::char_('-')&gt;&gt;factor);
	    };

	void parse_forms (std::string &amp;form);

	virtual ~MathFormulaParser(){};
};

};

#endif /* MATHFORMULAPARSER_H_ */
</code></pre>
<p>Das Problem ist die Methode parse_form. Bei der Definition kommt folgender Fehler:</p>
<pre><code>Fehler: »template&lt;class Iterator&gt; class calc::MathFormulaParser« ohne Template-Parameter verwendet	MathFormulaParser.cpp
</code></pre>
<p>Ich habe mit Templates bisher keine Erfahrung ...</p>
<pre><code>#include &quot;MathFormulaParser.h&quot;

namespace calc {

void MathFormulaParser::parse_forms(std::string &amp;form)
{
	/*if ((qi::parse(form.begin(),form.end(),expression)).full)
	{
		std::cout &lt;&lt; &quot;Parse complete\n&quot;;
		return;
	}else{
		std::cout &lt;&lt; &quot;Parse not complete\n&quot;;
		return;
	}*/
}

} /* namespace calc */
</code></pre>
<p>Was mache ich falsch ?</p>
<p>Vielen Dank.</p>
<p>Senifor</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312833/boost-spirit-und-parser-mit-templates</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 12:46:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312833.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jan 2013 13:07:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost.Spirit und Parser mit Templates on Tue, 15 Jan 2013 13:07:26 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich brauche einen Parser, der mathematische Formeln parsen kann, mit Ziffern und Variablen. Ich wollte Boost.Spirit verwenden, aber leider hab ich zu wenig Wissen, als das ich sowas hinbekommen würde. Deshalb möchte ich gern um Hilfe bitten.</p>
<p>Anstatt Strukturen, wollte ich Klassen verwenden ...</p>
<p>Deklaration:</p>
<pre><code>#ifndef MATHFORMULAPARSER_H_
#define MATHFORMULAPARSER_H_

#include &lt;boost/spirit/include/classic.hpp&gt;
#include &lt;boost/spirit/include/qi.hpp&gt;
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;utility&gt;
#include &lt;string&gt;

namespace calc {

namespace qi = boost::spirit::qi;

template &lt;class Iterator&gt;
class MathFormulaParser : qi::grammar&lt;Iterator,qi::space_type&gt;
{
protected:
	 qi::rule&lt;Iterator,std::string, qi::space_type&gt; search_var;
	 qi::rule&lt;Iterator, std::string, qi::space_type&gt; var;
	 qi::rule&lt;Iterator, double&gt; constants;
	 qi::rule&lt;Iterator&gt; factor, term, expression;
	 std::vector&lt;std::string&gt; parse_result;

public:
	MathFormulaParser ()
	      : MathFormulaParser::base_type(expression)
	    {

			search_var = +(qi::char_(&quot;a-zA-Z_&quot;)) &gt;&gt; qi::char_('=');
			var = +(qi::char_(&quot;a-zA-Z_&quot;)) - search_var;
			constants = qi::double_;
			expression = term &gt;&gt; *((qi::char_('+') &gt;&gt; term) | (qi::char_('-')&gt;&gt;term));
			term = factor &gt;&gt; *((qi::char_('*') | qi::char_('/'))&gt;&gt;factor);
			factor = (var | constants)
					| ('(' &gt;&gt; expression &gt;&gt; ')')
					| (qi::char_('+')&gt;&gt;factor)
					| (qi::char_('-')&gt;&gt;factor);
	    };

	void parse_forms (std::string &amp;form);

	virtual ~MathFormulaParser(){};
};

};

#endif /* MATHFORMULAPARSER_H_ */
</code></pre>
<p>Das Problem ist die Methode parse_form. Bei der Definition kommt folgender Fehler:</p>
<pre><code>Fehler: »template&lt;class Iterator&gt; class calc::MathFormulaParser« ohne Template-Parameter verwendet	MathFormulaParser.cpp
</code></pre>
<p>Ich habe mit Templates bisher keine Erfahrung ...</p>
<pre><code>#include &quot;MathFormulaParser.h&quot;

namespace calc {

void MathFormulaParser::parse_forms(std::string &amp;form)
{
	/*if ((qi::parse(form.begin(),form.end(),expression)).full)
	{
		std::cout &lt;&lt; &quot;Parse complete\n&quot;;
		return;
	}else{
		std::cout &lt;&lt; &quot;Parse not complete\n&quot;;
		return;
	}*/
}

} /* namespace calc */
</code></pre>
<p>Was mache ich falsch ?</p>
<p>Vielen Dank.</p>
<p>Senifor</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289844</guid><dc:creator><![CDATA[Senifor]]></dc:creator><pubDate>Tue, 15 Jan 2013 13:07:26 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Spirit und Parser mit Templates on Tue, 15 Jan 2013 14:25:24 GMT]]></title><description><![CDATA[<p>Du darfst bei Templates die Implementierung und die Deklaration nicht trennen. Implementiere die Methode im Header direkt in der Klasse, oder nach der Klasse.</p>
<p>Variante 1:</p>
<pre><code class="language-cpp">template &lt;class Iterator&gt;
class MathFormulaParser : qi::grammar&lt;Iterator,qi::space_type&gt;
{
protected:
     qi::rule&lt;Iterator,std::string, qi::space_type&gt; search_var;
     qi::rule&lt;Iterator, std::string, qi::space_type&gt; var;
     qi::rule&lt;Iterator, double&gt; constants;
     qi::rule&lt;Iterator&gt; factor, term, expression;
     std::vector&lt;std::string&gt; parse_result;

public:
    MathFormulaParser ()
          : MathFormulaParser::base_type(expression)
        {

            search_var = +(qi::char_(&quot;a-zA-Z_&quot;)) &gt;&gt; qi::char_('=');
            var = +(qi::char_(&quot;a-zA-Z_&quot;)) - search_var;
            constants = qi::double_;
            expression = term &gt;&gt; *((qi::char_('+') &gt;&gt; term) | (qi::char_('-')&gt;&gt;term));
            term = factor &gt;&gt; *((qi::char_('*') | qi::char_('/'))&gt;&gt;factor);
            factor = (var | constants)
                    | ('(' &gt;&gt; expression &gt;&gt; ')')
                    | (qi::char_('+')&gt;&gt;factor)
                    | (qi::char_('-')&gt;&gt;factor);
        };

    void parse_forms (std::string &amp;form)
    {
       if ((qi::parse(form.begin(),form.end(),expression)).full)
       {
          std::cout &lt;&lt; &quot;Parse complete\n&quot;;
          return;
       }
       else
       {
          std::cout &lt;&lt; &quot;Parse not complete\n&quot;;
          return;
       }
    }

    virtual ~MathFormulaParser(){};
};
</code></pre>
<p>Variante 2:</p>
<pre><code class="language-cpp">template &lt;class Iterator&gt;
class MathFormulaParser : qi::grammar&lt;Iterator,qi::space_type&gt;
{
protected:
     qi::rule&lt;Iterator,std::string, qi::space_type&gt; search_var;
     qi::rule&lt;Iterator, std::string, qi::space_type&gt; var;
     qi::rule&lt;Iterator, double&gt; constants;
     qi::rule&lt;Iterator&gt; factor, term, expression;
     std::vector&lt;std::string&gt; parse_result;

public:
    MathFormulaParser ()
          : MathFormulaParser::base_type(expression)
        {

            search_var = +(qi::char_(&quot;a-zA-Z_&quot;)) &gt;&gt; qi::char_('=');
            var = +(qi::char_(&quot;a-zA-Z_&quot;)) - search_var;
            constants = qi::double_;
            expression = term &gt;&gt; *((qi::char_('+') &gt;&gt; term) | (qi::char_('-')&gt;&gt;term));
            term = factor &gt;&gt; *((qi::char_('*') | qi::char_('/'))&gt;&gt;factor);
            factor = (var | constants)
                    | ('(' &gt;&gt; expression &gt;&gt; ')')
                    | (qi::char_('+')&gt;&gt;factor)
                    | (qi::char_('-')&gt;&gt;factor);
        };

    void parse_forms (std::string &amp;form);

    virtual ~MathFormulaParser(){};
};

template &lt;typename Iterator&gt;
void MathFormularParser&lt;Iterator&gt;::parse_forms(std::string&amp; form)
{
       if ((qi::parse(form.begin(),form.end(),expression)).full)
       {
          std::cout &lt;&lt; &quot;Parse complete\n&quot;;
          return;
       }
       else
       {
          std::cout &lt;&lt; &quot;Parse not complete\n&quot;;
          return;
       }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2289869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289869</guid><dc:creator><![CDATA[Tobias Gerg (unlocked)]]></dc:creator><pubDate>Tue, 15 Jan 2013 14:25:24 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Spirit und Parser mit Templates on Tue, 15 Jan 2013 15:04:36 GMT]]></title><description><![CDATA[<p>Vielen Dank. So funktioniert es.<br />
Jetzt hab ich allerdings einen anderen Fehler beim Erstellen eines Objektes:</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;MathFormulaParser.h&quot;

typedef std::string::const_iterator iterator_type;
typedef calc::MathFormulaParser&lt;iterator_type&gt; formparser;

int main() {
	formparser parseObj;
	return 0;
}
</code></pre>
<p>Die rules habe ich geändert in:</p>
<pre><code>search_var = +(qi::char_(&quot;a-zA-Z_&quot;)) &gt;&gt; qi::char_('=');
			var = +(qi::char_(&quot;a-zA-Z_&quot;)) - search_var;
			integer = +(qi::char_(&quot;0-9&quot;));
			constants = integer &gt;&gt; *(qi::char_('.')&gt;&gt;integer);
			expression = term &gt;&gt; *((qi::char_('+') &gt;&gt; term) | (qi::char_('-')&gt;&gt;term));
			term = factor &gt;&gt; *((qi::char_('*') | qi::char_('/'))&gt;&gt;factor);
			factor = ((var | constants)
					| ('(' &gt;&gt; expression &gt;&gt; ')')
					| (qi::char_('+')&gt;&gt;factor)
					| (qi::char_('-')&gt;&gt;factor));
</code></pre>
<p>Fehler bei:</p>
<pre><code>MathFormulaParser ()
	      : MathFormulaParser::base_type(expression)
</code></pre>
<ul>
<li>Fehler 1 Calculator C/C++ Problem</li>
<li>Anmerkung: Kandidat erwartet 1 Argument, 0 angegeben line 27, external location: /usr/include/boost/spirit/home/qi/reference.hpp C/C++ Problem</li>
<li>
<blockquote>
<p>Anmerkung: boost::spirit::qi::reference&lt;const boost::spirit::qi::rule&lt;__gnu_cxx::__normal_iterator&lt;const char*, std::basic_string&lt;char&gt; &gt;, boost::proto::exprns_::expr&lt;boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term&lt;boost::spirit::tag::char_code&lt;boost::spirit::tag::space, boost::spirit::char_encoding::standard&gt; &gt;, 0l&gt;, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type&gt; &gt;::reference(const boost::spirit::qi::reference&lt;const boost::spirit::qi::rule&lt;__gnu_cxx::__normal_iterator&lt;const char*, std::basic_string&lt;char&gt; &gt;, boost::proto::exprns_::expr&lt;boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term&lt;boost::spirit::tag::char_code&lt;boost::spirit::tag::space, boost::spirit::char_encoding::standard&gt; &gt;, 0l&gt;, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type&gt; &gt;&amp;) BioChemCalculator line 27, external location: /usr/include/boost/spirit/home/qi/reference.hpp C/C++ Problem</p>
</blockquote>
</li>
<li>...</li>
</ul>
<p>Hat jemand eine Idee was da schief läuft ? Ich wollte anstatt einer Struktur wie bei den Beispielen, eine Klasse verwenden ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289883</guid><dc:creator><![CDATA[Senifor]]></dc:creator><pubDate>Tue, 15 Jan 2013 15:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Spirit und Parser mit Templates on Tue, 15 Jan 2013 16:07:53 GMT]]></title><description><![CDATA[<p>Ich vermute, dass er Probleme damit hat,</p>
<pre><code class="language-cpp">constants = integer &gt;&gt; *(qi::char_('.')&gt;&gt;integer);
</code></pre>
<p>in</p>
<pre><code class="language-cpp">qi::rule&lt;Iterator, double&gt; constants;
</code></pre>
<p>zu quetschen, weil std::vector&lt;int&gt; nicht so gut in einen double passt.</p>
<p>Mit Sicherheit kann ich das aber ohne den ganzen Code und derart extrem gekürzter Fehlermeldung natürlich nicht sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289920</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 15 Jan 2013 16:07:53 GMT</pubDate></item></channel></rss>