<?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[Parser gesucht]]></title><description><![CDATA[<p>Heho Leute, suche schonmal vorgreifend für mein derzeitiges Projekt einen Parser für arithmetische Ausdrücke(welche als string vorhanden sein werden).<br />
Selber machen ist a) sinnfrei(will was anderes programmieren) und b) waren meine eigenen Ansätze eh nicht so prall <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Anforderungen:<br />
-Alle(muss nochmal genau nachlesen, aber meine ich brauche alle) C-Operatoren parsebar.<br />
-Eigene Funktionen sollten implementiert werden können(muss einige eigentümliche Funktionen basteln).<br />
-Rückgabetyp sollte bool sein(d.h. ergebnis &gt; 0 -&gt; true else false)</p>
<p>Wäre super wenn ihr mir ein paar Anregungen geben könntet was da praktisch wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312480/parser-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 18:42:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312480.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Jan 2013 00:38:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parser gesucht on Sun, 06 Jan 2013 00:38:34 GMT]]></title><description><![CDATA[<p>Heho Leute, suche schonmal vorgreifend für mein derzeitiges Projekt einen Parser für arithmetische Ausdrücke(welche als string vorhanden sein werden).<br />
Selber machen ist a) sinnfrei(will was anderes programmieren) und b) waren meine eigenen Ansätze eh nicht so prall <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Anforderungen:<br />
-Alle(muss nochmal genau nachlesen, aber meine ich brauche alle) C-Operatoren parsebar.<br />
-Eigene Funktionen sollten implementiert werden können(muss einige eigentümliche Funktionen basteln).<br />
-Rückgabetyp sollte bool sein(d.h. ergebnis &gt; 0 -&gt; true else false)</p>
<p>Wäre super wenn ihr mir ein paar Anregungen geben könntet was da praktisch wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2286680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2286680</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sun, 06 Jan 2013 00:38:34 GMT</pubDate></item><item><title><![CDATA[Reply to Parser gesucht on Sun, 06 Jan 2013 02:08:26 GMT]]></title><description><![CDATA[<p>Was hältst du von dem da? <a href="http://www.c-plusplus.net/forum/p1642138#1642138" rel="nofollow">http://www.c-plusplus.net/forum/p1642138#1642138</a></p>
<p>Ich habe das für dich angepasst, damit du eigene Funktionen definieren kannst (benötigt C++11, damit es kompiliert):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;map&gt;
#include &lt;iostream&gt;

template &lt;typename T&gt;
using function_list = std::map&lt;std::string, std::function&lt;bool(std::vector&lt;T&gt;, T&amp;)&gt; &gt;;

// --   liest 'C'; sonst wird 'in' auf Fehler gesetzt
template&lt; char C &gt;
std::istream&amp; Char( std::istream&amp; in )
{
  char c;
  if( in &gt;&gt; c &amp;&amp; c != C )
    in.setstate( std::ios_base::failbit );
  return in;
}

// --   liefert 'true' falls das Zeichen, das 'in' folgt, Start eines Funktionsnamen sein kann
template&lt; typename E, typename Traits &gt;
bool funcbegin_test( std::basic_istream&lt; E, Traits &gt;&amp; in )
{
  if( in.good() )
    {
      const std::ctype&lt; E &gt;&amp; ctype_fac = std::use_facet&lt; std::ctype&lt; E &gt; &gt;( in.getloc() );
      for( typename Traits::int_type m = in.rdbuf()-&gt;sgetc(); ; m = in.rdbuf()-&gt;snextc() )
        {
          if( Traits::eq_int_type( m, Traits::eof() ) )
            {
              in.setstate( std::ios_base::eofbit );
              break;
            }

          const char c = Traits::to_char_type( m );

          if( ctype_fac.is(std::ctype&lt;E&gt;::alpha, c) || c == '_'  )
            {   // --   gesuchtes Zeichen folgt im Stream
              return true;                // ok; Zeichen war da
            }
          if( (in.flags() &amp; std::ios_base::skipws) == 0 || !ctype_fac.is( std::ctype&lt; E &gt;::space, c ) )
            break;
        }
    }
  return false;
}

template&lt; typename E, typename Traits &gt;
std::basic_istream&lt; E, Traits &gt;&amp;
read_funcname( std::basic_istream&lt; E, Traits &gt;&amp; in, std::basic_string&lt;E, Traits&gt;&amp; s)
{
  if( in.good() )
    {
      const std::ctype&lt; E &gt;&amp; ctype_fac = std::use_facet&lt; std::ctype&lt; E &gt; &gt;( in.getloc() );
      for( typename Traits::int_type m = in.rdbuf()-&gt;sgetc(); ; m = in.rdbuf()-&gt;snextc() )
        {
          if( Traits::eq_int_type( m, Traits::eof() ) )
            {
              in.setstate( std::ios_base::eofbit );
              break;
            }
          const char c = Traits::to_char_type( m );
          if( ctype_fac.is(std::ctype&lt;E&gt;::alpha, c) || c == '_'  )
            {   // --   gesuchtes Zeichen folgt im Stream
              s.push_back(m);
            }
          else
            break;
        }
    }
  return in;
}

// --   liefert 'true' falls das Zeichen 'e' in 'in' folgt
template&lt; typename E, typename Traits &gt;
bool ctest( std::basic_istream&lt; E, Traits &gt;&amp; in, E e )
{
  if( in.good() )
    {
      const std::ctype&lt; E &gt;&amp; ctype_fac = std::use_facet&lt; std::ctype&lt; E &gt; &gt;( in.getloc() );
      for( typename Traits::int_type m = in.rdbuf()-&gt;sgetc(); ; m = in.rdbuf()-&gt;snextc() )
        {
          if( Traits::eq_int_type( m, Traits::eof() ) )
            {
              in.setstate( std::ios_base::eofbit );
              break;
            }
          const char c = Traits::to_char_type( m );
          if( c == e )
            {   // --   gesuchtes Zeichen folgt im Stream
              in.rdbuf()-&gt;sbumpc();       // Zeichen konsumieren -&gt; ++Lesezeiger
              return true;                // ok; Zeichen war da
            }
          if( (in.flags() &amp; std::ios_base::skipws) == 0 || !ctype_fac.is( std::ctype&lt; E &gt;::space, c ) )
            break;
        }
    }
  return false;
}

// --   Der Ausdruck-Parser
template&lt; typename T &gt;
struct Expression
{
  typedef T value_type;
  explicit Expression( T&amp; value, function_list&lt;T&gt; const&amp; funcs )
    : m_value( value ), funcs(funcs) {}
  friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, const Expression&amp; expr )
  {
    expr.parse( in );
    return in;
  }
private:
  void parse( std::istream&amp; in ) const;
  T&amp; m_value;
  function_list&lt;T&gt; const&amp; funcs;
};

template&lt; typename T &gt;
Expression&lt; T &gt; expression( T&amp; value,
                            function_list&lt;T&gt; const&amp; funcs)
{
  return Expression&lt; T &gt;( value, funcs );
}

// --   Der Factor-Parser
template&lt; typename T &gt;
struct Factor
{
  explicit Factor( T&amp; value, function_list&lt;T&gt; funcs )
    : m_value( value ), funcs(funcs) {}
  friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, const Factor&amp; x )
  {   // factor = number | &quot;(&quot; expression &quot;)&quot; | f &quot;(&quot; arg1, arg2, ... &quot;)&quot;.
    if( ctest( in, '(' ) )
      return in &gt;&gt; expression( x.m_value, x.funcs ) &gt;&gt; Char&lt;')'&gt;;
    if( funcbegin_test(in) ) {
      std::string f;
      if (!(read_funcname(in, f) &gt;&gt; Char&lt;'('&gt; &gt;&gt; std::ws))
        return in;
      std::vector&lt;T&gt; args;
      while (in) {
        T t=3.141;
        if (!(in &gt;&gt; expression(t, x.funcs)))
          return in;
        args.push_back(t);
        if (ctest( in, ')' ))
          break;
        in &gt;&gt; Char&lt;','&gt;;
      }
      if (in) {
        typename function_list&lt;T&gt;::const_iterator it = x.funcs.find(f);
        if (it == x.funcs.end() || !it-&gt;second(args, x.m_value))
          in.setstate( std::ios_base::failbit );
      }
      return in;
    }
    return in &gt;&gt; x.m_value;
  }
private:
  T&amp; m_value;
  function_list&lt;T&gt; const&amp; funcs;
};

// --   Der Term-Parser
template&lt; typename T &gt;
struct Term
{
  explicit Term( T&amp; value, function_list&lt;T&gt; const&amp; funcs )
    : m_value( value ), funcs(funcs) {}
  friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, const Term&amp; x )
  {   // term = factor {(&quot;*&quot;|&quot;/&quot;) factor} .
    in &gt;&gt; Factor&lt; T &gt;( x.m_value, x.funcs );
    for( T value2;; )
      {
        if( ctest( in, '*' ) )
          {
            if( in &gt;&gt; Factor&lt; T &gt;( value2, x.funcs ) ) x.m_value *= value2;
          }
        else if( ctest( in, '/' ) )
          {
            if( in &gt;&gt; Factor&lt; T &gt;( value2, x.funcs ) ) x.m_value /= value2;
          }
        else
          break;
      }
    return in;
  }
private:
  T&amp; m_value;
  function_list&lt;T&gt; const&amp; funcs;
};

template&lt; typename T &gt;
void Expression&lt; T &gt;::parse( std::istream&amp; in ) const
{   // expression = [&quot;+&quot;|&quot;-&quot;] term {(&quot;+&quot;|&quot;-&quot;) term} .
  const bool minus = !ctest( in, '+' ) &amp;&amp; ctest( in, '-' ); // @Edit: Multiplikation mit -1 durch operator-() ersetzt
  in &gt;&gt; Term&lt; T &gt;( m_value, funcs );
  if( minus ) m_value = -m_value;
  for( T value2;; )
    {
      if( ctest( in, '+' ) )
        {
          if( in &gt;&gt; Term&lt; T &gt;( value2, funcs ) ) m_value += value2;
        }
      else if( ctest( in, '-' ) )
        {
          if( in &gt;&gt; Term&lt; T &gt;( value2, funcs ) ) m_value -= value2;
        }
      else
        break;
    }
}
</code></pre>
<p>Beispielnutzung:</p>
<pre><code class="language-cpp">bool square(std::vector&lt;double&gt; const&amp; v, double&amp; d)
{
  if (v.size() != 1)
    return false;
  d = v[0]*v[0];
  return true;
}

bool mypow(std::vector&lt;double&gt; const&amp; v, double&amp; d)
{
  return !(v.size() == 2 &amp;&amp; (d = std::pow(v[0], v[1]), false));
}

int main()
{
  using namespace std;
  cout &lt;&lt; &quot;Taschenrechner mit den 4 Grundrechenarten:&quot; &lt;&lt; endl;
  cin &gt;&gt; noskipws; // diese Zeile löschen, wenn Leerzeichen erlaubt
  function_list&lt;double&gt; f;
  f[&quot;square&quot;] = square;
  f[&quot;pow&quot;] = mypow;
  for( double d; cout &lt;&lt; &quot;&gt; &quot;, cin &gt;&gt; ws &gt;&gt; expression( d, f ); )
    cout &lt;&lt; &quot; = &quot; &lt;&lt; d &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2286686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2286686</guid><dc:creator><![CDATA[anne regung]]></dc:creator><pubDate>Sun, 06 Jan 2013 02:08:26 GMT</pubDate></item><item><title><![CDATA[Reply to Parser gesucht on Sun, 06 Jan 2013 02:19:00 GMT]]></title><description><![CDATA[<p>Hey, danke sehr <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 />
Muss ich mir anschauen, hatte sonst noch den hier gefunden:<br />
<a href="http://www.codeproject.com/Articles/7773/Fast-Mathematical-Expressions-Parser?fid=79444&amp;df=90&amp;mpp=25&amp;noise=3&amp;prof=False&amp;sort=Position&amp;view=Quick&amp;spc=Relaxed&amp;fr=26#xx0xx" rel="nofollow">http://www.codeproject.com/Articles/7773/Fast-Mathematical-Expressions-Parser?fid=79444&amp;df=90&amp;mpp=25&amp;noise=3&amp;prof=False&amp;sort=Position&amp;view=Quick&amp;spc=Relaxed&amp;fr=26#xx0xx</a></p>
<p>Wobei mir an dem auf den ersten Blick missfällt, dass alles scheinbar double zurückgibt, was nicht ganz C-ig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2286688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2286688</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sun, 06 Jan 2013 02:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Parser gesucht on Mon, 07 Jan 2013 09:25:51 GMT]]></title><description><![CDATA[<blockquote>
<p>für mein derzeitiges Projekt einen Parser für arithmetische Ausdrücke</p>
</blockquote>
<p>Arbeite einfach das Tutorial fuer flex+bison durch. Oder du bindest gleich eine Scriptsprache ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287147</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 07 Jan 2013 09:25:51 GMT</pubDate></item></channel></rss>