<?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[Token -&amp;gt; AST]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche jetzt seit Tagen verzweifelt aus Tokens (entstanden aus leichtem Pascal Sourcecode) einen AST aufzubauen...</p>
<p>Das Problem ist, dass Pascal Source natürlich als Argument bei einem Funktionsaufruf wieder einen Funktionsaufruf zulässt...<br />
-&gt; Ich brauche definitiv Rekursion</p>
<p>Ich hab aber keine Ahnung wie ich den Parser aufbauen soll <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="😞"
    /> Alle meine Versuche enden in einem endlos komplizierten, nicht schön programmierten, nicht allgemein anwendbaren, und nicht funktionierenden Wirwarr</p>
<p>Das Tutorial zum Interpreterbau hab ich schon gesehen (ohne ein Zuweisungsstatement, ist es ja auch leicht einen Parser zu bauen, sobald aber Funktionsaufrufe und Zuweisungen im geparsten Text sind wirds kompliziert <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>Ich hoffe ihr könnt mir z.B. mit Pseudocode helfen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313960/token-gt-ast</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 19:23:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313960.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Feb 2013 13:36:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 13:36:19 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche jetzt seit Tagen verzweifelt aus Tokens (entstanden aus leichtem Pascal Sourcecode) einen AST aufzubauen...</p>
<p>Das Problem ist, dass Pascal Source natürlich als Argument bei einem Funktionsaufruf wieder einen Funktionsaufruf zulässt...<br />
-&gt; Ich brauche definitiv Rekursion</p>
<p>Ich hab aber keine Ahnung wie ich den Parser aufbauen soll <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="😞"
    /> Alle meine Versuche enden in einem endlos komplizierten, nicht schön programmierten, nicht allgemein anwendbaren, und nicht funktionierenden Wirwarr</p>
<p>Das Tutorial zum Interpreterbau hab ich schon gesehen (ohne ein Zuweisungsstatement, ist es ja auch leicht einen Parser zu bauen, sobald aber Funktionsaufrufe und Zuweisungen im geparsten Text sind wirds kompliziert <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>Ich hoffe ihr könnt mir z.B. mit Pseudocode helfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299077</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Fri, 15 Feb 2013 13:36:19 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 14:06:59 GMT]]></title><description><![CDATA[<p>Hä?</p>
<p>Abstrakte Syntax Bäume bauen auf formalen Sprachen und damit auf Grammatiken auf. Bei denen ist die Rekursion nicht nur der stärkste sondern auch einzigste Weg Wiederholungen darzustellen oO.</p>
<p>Und wenn du das programmierst bist du mit normalen Schleifen so mies bedient, dass dus gleich lasssen kannst.Aber ich versteh nicht ganz was dein Problem jetzt ist, dafür hast du zu wenig Infos da gelassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299087</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 15 Feb 2013 14:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 14:26:54 GMT]]></title><description><![CDATA[<p>Also ich hab ein vector&lt;Token&gt; und muss daraus einen AST machen, Die Tokens könnten z.B. sein:</p>
<p>Tokens[0] (Name: &quot;i&quot;, Type: Identifier)<br />
Tokens[1] (Name: &quot;=&quot;, Type: Symbol)<br />
Tokens[2] (Name: &quot;2&quot;, Type: Number)<br />
Tokens[3] (Name: &quot;*&quot;, Type: Operator)<br />
Tokens[4] (Name: &quot;14&quot;, Type: Number)</p>
<p>und ich muss daraus jetzt einen AST, hier die bildliche Darstellung:</p>
<p>Assignment<br />
| |<br />
i Multiplikation<br />
| |<br />
2 14</p>
<p>aufbauen. Das war allerdings ein leichtes Beispiel, schwieriger wirds bei Tokens, die aus einem Sourcecode sind, bei dem beim Aufrufen einer Funktion, als Parameter wieder der Rückgabewert einer anderen Funktion genutzt wird...</p>
<p>Ich brauch ein Beispiel (am besten sogar Pseudocode), weil ich absolut keine Ahnung habe wie ich das am besten mache <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="😞"
    /> Ich hab es jetzt schon öfters versucht, immer waren aber Fehler im &quot;Konzept&quot;, sodass das Programm, eine Ansammlung von Ausnahmen war</p>
<p>Danke an alle <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2299094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299094</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Fri, 15 Feb 2013 14:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 14:34:38 GMT]]></title><description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/LL_parser" rel="nofollow">http://en.wikipedia.org/wiki/LL_parser</a></p>
<p>Informier dich zuerst über Compiler-/Parserbau, sonst wird das nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299100</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 15 Feb 2013 14:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 14:34:47 GMT]]></title><description><![CDATA[<p>Ich kann dein Problem nicht nachvollziehen. Auch die Aussage, dass Funktionsaufrufe und ähnliches es schwieriger machen einen AST zu erstellen, kann ich nicht nachvollziehen. Denn die Theorie dahinter bleibt absolut die gleiche.</p>
<p>Das einzige was passen muss ist die Grammatik und die daraus abgeleitete Klassenhierachie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299101</guid><dc:creator><![CDATA[jjjjjjjjjj]]></dc:creator><pubDate>Fri, 15 Feb 2013 14:34:47 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 15:28:18 GMT]]></title><description><![CDATA[<p>Sorry, das ich mich irgendwie unverständlich ausgedrückt habe:</p>
<p>Ich möchte aus einem Pascal Sourcecode, den mein Programm einliest ein AST machen. Das Tokenizen (also in Tokens zerlegen) funktioniert wunderbar! Da jedes Programm, aber so eine Art Konzept haben sollte, und nicht eine Ansammlung von If-Abfragen, brauch ich so eine Art Grundlegendes Konzept, wie ich die Tokens zu einem AST zusammenbekomme...</p>
<p>Ich hoffe ihr könnt mir sagen, wie ich den Parser strukturieren sollte <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="😃"
    /><br />
Ich hoffe ich habe mich jetzt verständlich ausgedrückt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299132</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Fri, 15 Feb 2013 15:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 15:32:15 GMT]]></title><description><![CDATA[<p>Hi schrieb:</p>
<blockquote>
<p>Sorry, das ich mich irgendwie unverständlich ausgedrückt habe:</p>
<p>Ich möchte aus einem Pascal Sourcecode, den mein Programm einliest ein AST machen. Das Tokenizen (also in Tokens zerlegen) funktioniert wunderbar! Da jedes Programm, aber so eine Art Konzept haben sollte, und nicht eine Ansammlung von If-Abfragen, brauch ich so eine Art Grundlegendes Konzept, wie ich die Tokens zu einem AST zusammenbekomme...</p>
<p>Ich hoffe ihr könnt mir sagen, wie ich den Parser strukturieren sollte <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="😃"
    /><br />
Ich hoffe ich habe mich jetzt verständlich ausgedrückt</p>
</blockquote>
<p>Es gibt im Magazin 2 gute Artikel zum Thema Interpreterbau bzw. Compilerbau. In mindestens einem wird ein AST beschrieben.</p>
<p>Wenn du das nicht auf deine Situation umsetzen kannst, dann fehlt es dir eindeutig an Grundlagen und dann solltest du erst mal diese auffrischen.</p>
<p>Wie sieht denn deine Grammatik aus? Oder baust du das nach Lust und Laune?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299133</guid><dc:creator><![CDATA[fghfghfgh]]></dc:creator><pubDate>Fri, 15 Feb 2013 15:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 15:36:31 GMT]]></title><description><![CDATA[<p>Wie ich bereits geschrieben habe, wird in dem Artikel zwar ein AST beschrieben, jedoch ist dieser so simpel, das das Konzept auf dem er baut (ich les mal das nächste Zeichen ein und schreib das in eine Node) nicht funktioniert, wenn man komplexere Strukturen wie Zuweisungen hat...<br />
Wie bereits gesagt, die Grammatik ist von Pascal übernommen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299137</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Fri, 15 Feb 2013 15:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 15:44:56 GMT]]></title><description><![CDATA[<p>Um sowas umsetzen zu können muss man Informatik studiert haben. Das kann ein Otto-Normal Progger nie und nimmer hinbekommen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2299141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299141</guid><dc:creator><![CDATA[mcko]]></dc:creator><pubDate>Fri, 15 Feb 2013 15:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to Token -&amp;gt; AST on Fri, 15 Feb 2013 16:03:04 GMT]]></title><description><![CDATA[<p>Hi schrieb:</p>
<blockquote>
<p>Wie ich bereits geschrieben habe, wird in dem Artikel zwar ein AST beschrieben, jedoch ist dieser so simpel, das das Konzept auf dem er baut (ich les mal das nächste Zeichen ein und schreib das in eine Node) nicht funktioniert, wenn man komplexere Strukturen wie Zuweisungen hat...<br />
Wie bereits gesagt, die Grammatik ist von Pascal übernommen</p>
</blockquote>
<p>Je nach Grammatik muss es einfach möglich sein, dass man ein Token im voraus lesen kann. Und dann ist das auch kein Problem mit dem AST.</p>
<p>Ich sehe echt das Problem nicht. Wenn du auf einen Identiefer triffst, dann hast du aufjedenfall schon mal ein Node für den Identifier.</p>
<pre><code>NodeIdent(i)
</code></pre>
<p>Wenn du dann auf ein = triffst, hast du eben eine Zuweisung und zwar vom vorher eingelesenen Identifier.</p>
<pre><code>NodeAssignment(NodeIdent(i))
</code></pre>
<p>Was dann folgt ist ein Ausdruck. Das sieht dann letztendlich so aus:</p>
<pre><code>NodeAssignment(NodeIdent(i), NodeExpression(NodeOp(*), NodeNumber(12), NodeNumber(14))
</code></pre>
<p>Und wenn man die entsprechenden Nodes hat, kann das in C++ auch manuell so angelegt werden:</p>
<pre><code>Node *root = new NodeAssignment(new NodeIdent(&quot;i&quot;), new NodeExpression(new NodeOp(&quot;*&quot;), new NodeNumber(12), new NodeNumber(14));

root-&gt;Evaluate(); // Oder was auch immer
</code></pre>
<p>Und ein Funktionsaufruf kann eben auch ein Ausdruck sein...<br />
Was du also brauchst ist:</p>
<pre><code>struct NodeAssignment : public Node
{
 NodeIdent *ident;
 NodeExpr *expr;

 // ...
};

struct NodeExpr : public Node
{
 NodeOp *op;

 struct NodeExpr *left;
 struct NodeExpr *right;

 // ...
};

// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2299146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2299146</guid><dc:creator><![CDATA[fghfghfgh]]></dc:creator><pubDate>Fri, 15 Feb 2013 16:03:04 GMT</pubDate></item></channel></rss>