<?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[Tool um Ausdrücke zu generieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>kennt jemand von euch ein Programm/Skript, mit denen man alle nach einer formalen Grammatik (Chomsky) definierten Ausdrücke (einer best. Länge) generieren kann? Also z.B. schreibe ich in eine Datei</p>
<p>Expr -&gt; (Expr)<br />
Expr -&gt; Expr + Expr<br />
Expr -&gt; C<br />
C -&gt; x<br />
C -&gt; 0<br />
C -&gt; 1<br />
C -&gt; 2</p>
<p>und das Programm generiert mir dann Ausdrücke, wie z.B:</p>
<p>x<br />
0<br />
1 + x<br />
(0 + 1)+x<br />
x + x + (2 + (1 + x))</p>
<p>usw.</p>
<p>Danke, Stefan</p>
<p>PS: Am liebsten wären mir kleine schlanke (Linux-) Kommandozeilenprogrämmchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179126/tool-um-ausdrücke-zu-generieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 21:40:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179126.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Apr 2007 17:42:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Wed, 18 Apr 2007 17:43:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>kennt jemand von euch ein Programm/Skript, mit denen man alle nach einer formalen Grammatik (Chomsky) definierten Ausdrücke (einer best. Länge) generieren kann? Also z.B. schreibe ich in eine Datei</p>
<p>Expr -&gt; (Expr)<br />
Expr -&gt; Expr + Expr<br />
Expr -&gt; C<br />
C -&gt; x<br />
C -&gt; 0<br />
C -&gt; 1<br />
C -&gt; 2</p>
<p>und das Programm generiert mir dann Ausdrücke, wie z.B:</p>
<p>x<br />
0<br />
1 + x<br />
(0 + 1)+x<br />
x + x + (2 + (1 + x))</p>
<p>usw.</p>
<p>Danke, Stefan</p>
<p>PS: Am liebsten wären mir kleine schlanke (Linux-) Kommandozeilenprogrämmchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268679</guid><dc:creator><![CDATA[Real_PsychoDAD]]></dc:creator><pubDate>Wed, 18 Apr 2007 17:43:54 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Wed, 18 Apr 2007 22:44:53 GMT]]></title><description><![CDATA[<p>Nö, kenne ich nicht, aber sowas ist schnell selbst geschrieben.<br />
In Python/PHP/Perl etc. ganz ganz einfach, aber sogar in C++ kein wirkliches Ding.<br />
Mach mal <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/1268879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268879</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 18 Apr 2007 22:44:53 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Wed, 18 Apr 2007 23:05:38 GMT]]></title><description><![CDATA[<p>Aehm... Dir ist klar, dass die generierte Menge unendlich ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268884</guid><dc:creator><![CDATA[Apollon]]></dc:creator><pubDate>Wed, 18 Apr 2007 23:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Wed, 18 Apr 2007 23:38:43 GMT]]></title><description><![CDATA[<p>Ups, das &quot;alle&quot; hab ich übersehen, das macht die Aufgabe etwas weniger trivial *pfeiff* <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>
<p>Die Menge ist trotzdem nicht unendlich, da er &quot;Ausdrücke einer bestimmten Länge&quot; geschrieben hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268893</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 18 Apr 2007 23:38:43 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Thu, 19 Apr 2007 07:28:30 GMT]]></title><description><![CDATA[<p>Selber schreiben lautet die Devise:</p>
<pre><code class="language-cpp">typedef pair&lt;string,string&gt; rule;

string use_rule(rule r,string orig)
{
  size_t p=orig.find(r.first);
  if(p!=string::npos) orig.replace(p,rule.first.length(),rule.second);
  return orig;
}

void construct(string start)
{
  if(start.length()&gt;max_length) return;

  int possible_rules=0;
  for(int i=0;i&lt;rule_count;++i)
  {
    string next=use_rule(rule[i],start);
    if(next!=start)
    {
      ++possible_rules;
      construct(next);
    }
  }
  if(possible_rules==0)
    fout&lt;&lt;start&lt;&lt;endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1268963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268963</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Apr 2007 07:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Thu, 19 Apr 2007 19:59:16 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a></p>
<p>Ich hab deinen C++-Code mal in ein folgendes Programm eingebunden:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

const int max_length = 10;

typedef pair&lt;string,string&gt; rule;

vector&lt;rule&gt; rules;

string use_rule(rule r,string orig)
{
  size_t p=orig.find(r.first);
  if(p!=string::npos)
     orig.replace(p,r.first.length(),r.second);
  return orig;
}

void construct(string start)
{
  if(start.length()&gt;max_length) return;

  int rule_count = rules.size();
  int possible_rules=0;
  for(int i=0;i&lt;rule_count;++i)
  {
    string next=use_rule(rules[i],start);
    if(next!=start)
    {
      ++possible_rules;
      construct(next);
    }
  }
  if(possible_rules==0)
    cout&lt;&lt;start&lt;&lt;endl;
}

int main(void) {
   rules.push_back(rule(&quot;Expr&quot;, &quot;(Expr)&quot;));
   rules.push_back(rule(&quot;Expr&quot;, &quot;Expr + Expr&quot;));
   rules.push_back(rule(&quot;Expr&quot;, &quot;C&quot;));
   rules.push_back(rule(&quot;Expr&quot;, &quot;x&quot;));
   rules.push_back(rule(&quot;Expr&quot;, &quot;0&quot;));
   rules.push_back(rule(&quot;Expr&quot;, &quot;1&quot;));
   rules.push_back(rule(&quot;Expr&quot;, &quot;2&quot;));
   construct(&quot;Expr&quot;);
   return 0;
}
</code></pre>
<p>Und als Ausgabe kommt:</p>
<pre><code>(((C)))
(((x)))
(((0)))
(((1)))
(((2)))
((C))
((x))
((0))
((1))
((2))
(C)
(x)
(0)
(1)
(2)
C
x
0
1
2
</code></pre>
<p>Scheint also irgendwie nicht ganz zu funktionieren, und hab jetzt auch keine Idee wo der Fehler liegt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a><br />
Mit Perl/Python kenn ich mich nicht so aus, komme bisher mit AWK &amp; Bash<br />
super zurecht. Aber falls Du ein entsprechendes Skript dafür hast/kennst kannst es ja mal posten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269590</guid><dc:creator><![CDATA[Real_PsychoDAD]]></dc:creator><pubDate>Thu, 19 Apr 2007 19:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Thu, 19 Apr 2007 23:11:51 GMT]]></title><description><![CDATA[<p>Nö, ich kenne kein fertiges Script was etwas ähnliches macht. Ich meinte bloss irgendeine der mächtigeren Scriptsprachen weil man solche und ähnliche Dinge in denen meist recht einfach implementieren kann, alleine die ganzen Textverarbeitungsfunktionen die die mitbringen.</p>
<p>Ich denke es fehlt noch die Unterscheidung zwischen Grammatikelementen und &quot;Strings&quot; (for lack of a better word).</p>
<p>Die Grammatik müsste also wohl schonmal eher so aussehen:</p>
<pre><code>Expr: &quot;(&quot; Expr &quot;)&quot;
Expr: Expr &quot; + &quot; Expr
Expr: C
C: &quot;x&quot;
C: &quot;0&quot;
C: &quot;1&quot;
C: &quot;2&quot;
</code></pre>
<p>Expr und C sind dabei die &quot;Elemente&quot;, alles in &quot;&quot; sind dann eben &quot;Strings&quot;, also Dinge auf die keine weiteren Regeln angewendet werden können. Und das Programm müsste wohl alle &quot;Elemente&quot; ersetzen, solange bis im Output nurmehr &quot;Strings&quot; übrig sind, denn etwas wie &quot;Expr + 0&quot; wird wohl als mögliche Kombination nicht erwünscht sein. Dabei müsste dann für jedes &quot;Element&quot; welches noch übrig ist auch jede passende Rule angewendet werden. Was man als &quot;Länge&quot; definiert ist dabei dann wohl etwas schwierig, aber vielleicht einfach die Anzahl der &quot;Strings&quot; im Output. Wenn man dann &quot;leere&quot; Rules verbietet lässt sich das Abbruchkriterium recht einfach festlegen, nämlich &quot;(#Elemente + #Strings) &gt; N&quot;.</p>
<p>Wenn man die Länge des fertigen Strings als Limit verwenden möchte kann man einfach jedes &quot;Element&quot; als 1 Zeichen zählen, da ja &quot;leere&quot; Rules verboten sind. Wenn keine &quot;Elemente&quot; mehr übrig sind prüft man die Länge des fertigen Strings nochmal und verwirft ihn ggf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269666</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 19 Apr 2007 23:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Sun, 29 Apr 2007 21:57:46 GMT]]></title><description><![CDATA[<p>Das Programm CStoll ist doch korrekt, mein Fehler war nur die Abbruchbedingung</p>
<p>if(start.length()&gt;max_length) return;</p>
<p>weswegen die Regel Expr -&gt; Expr + Expr nie angewendet wurde, da max_length zu gering gesetzt war, wenn man max_length entsprechend erhöht erzeugt er auch alle Ausdrücke bzw. eine bessere Unterscheidung wäre halt nur die Wörter zu zählen<br />
(was ich ja eigentlich irgendwie im Hinterkopf hatte und trotzdem den &quot;Fehler&quot; nicht sah), man muss nicht extra zwischen Grammatikelementen und &quot;Strings&quot; unterscheiden.</p>
<p>Danke nochmal allen Beteiligten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1275961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275961</guid><dc:creator><![CDATA[Real_PsychoDAD]]></dc:creator><pubDate>Sun, 29 Apr 2007 21:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Mon, 30 Apr 2007 02:17:36 GMT]]></title><description><![CDATA[<p>Ups, sorry, ja. Das Programm dürfte wirklich korrekt sein, ich habs nur zuerst nicht ganz verstanden, der Name &quot;possible_rules&quot; hat mich verwirrt... <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>
<p>Und die Unterscheidung zwischen Text und Grammatikelementen ist nicht notwändig, könnte aber das Programm deutlich schneller machen -- was aber natürlich nur wichtig bzw. sinnvoll ist wenn es nicht sowieso schon schnell genug läuft. Und natürlich dürfen dann im &quot;Text&quot; keine Namen von Grammatikelementen auftauchen, ist aber logisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1275998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275998</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 30 Apr 2007 02:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to Tool um Ausdrücke zu generieren on Mon, 30 Apr 2007 03:36:09 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich denke es fehlt noch die Unterscheidung zwischen Grammatikelementen und &quot;Strings&quot; (for lack of a better word).</p>
</blockquote>
<p>Du meinst die Unterscheidung zwischen den beiden Grammatikelementen <em>Nichtterminalsymbol</em> und <em>Terminalsymbol</em>? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich frage mich nur wie du das Programm dadurch schneller machen willst... korrekt, ja, aber schneller durch mehr Komplexität? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276009</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 30 Apr 2007 03:36:09 GMT</pubDate></item></channel></rss>