<?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 - Wie Code intern speichern]]></title><description><![CDATA[<p>Mein aktuelles Projekt ist ein Compiler der eine eigene kleine Sprache<br />
nach C++ übersetzen soll. Allerdings ist die Sprache einerseits schon<br />
zu komplex um sie in einem Zug direkt übersetzen zu können (also mit<br />
einem One-Pass-Compiler) und andererseits möchte ich schon die Gelegenheit<br />
nutzen etwas tiefer in den Compilerbau einzusteigen.</p>
<p>Soweit so gut, das Frontend ist eigentlich fertig, das heißt der Input der<br />
Dateien und das Scannen der Tokens funktioniert tadellos.</p>
<p>Die Tokens sind der Einfachheit halber wie folgt gespeichert:</p>
<pre><code class="language-cpp">struct Token {
  TokenID ID;
  string Value;
};
//...
vector&lt;Token&gt; tokens;
</code></pre>
<p>Wobei TokenID ein simples enum für allerlei Typen ist (Klammer auf, Semicolon, Identifier...)</p>
<p>Nun zu meiner eigentlichen Frage, ich möchte aus diesem Tokenstream eine<br />
Art interne Repräsentation der Codelogik aufbauen. Ich habe allerdings<br />
keine Ahnung wie ich das anfangen soll, nicht einmal wie diese Struktur<br />
aussehen soll. Wie würdet ihr das machen, und wie soll das Parsen von statten gehen?</p>
<p>Danke schon mal fürs lesen, ich freu mich auf eure Antworten...</p>
<p>PS: Wenn ihr weitere Details braucht -&gt; Bitte einfach fragen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233323/parser-wie-code-intern-speichern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 00:28:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233323.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Feb 2009 12:18:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 12:18:00 GMT]]></title><description><![CDATA[<p>Mein aktuelles Projekt ist ein Compiler der eine eigene kleine Sprache<br />
nach C++ übersetzen soll. Allerdings ist die Sprache einerseits schon<br />
zu komplex um sie in einem Zug direkt übersetzen zu können (also mit<br />
einem One-Pass-Compiler) und andererseits möchte ich schon die Gelegenheit<br />
nutzen etwas tiefer in den Compilerbau einzusteigen.</p>
<p>Soweit so gut, das Frontend ist eigentlich fertig, das heißt der Input der<br />
Dateien und das Scannen der Tokens funktioniert tadellos.</p>
<p>Die Tokens sind der Einfachheit halber wie folgt gespeichert:</p>
<pre><code class="language-cpp">struct Token {
  TokenID ID;
  string Value;
};
//...
vector&lt;Token&gt; tokens;
</code></pre>
<p>Wobei TokenID ein simples enum für allerlei Typen ist (Klammer auf, Semicolon, Identifier...)</p>
<p>Nun zu meiner eigentlichen Frage, ich möchte aus diesem Tokenstream eine<br />
Art interne Repräsentation der Codelogik aufbauen. Ich habe allerdings<br />
keine Ahnung wie ich das anfangen soll, nicht einmal wie diese Struktur<br />
aussehen soll. Wie würdet ihr das machen, und wie soll das Parsen von statten gehen?</p>
<p>Danke schon mal fürs lesen, ich freu mich auf eure Antworten...</p>
<p>PS: Wenn ihr weitere Details braucht -&gt; Bitte einfach fragen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657168</guid><dc:creator><![CDATA[milan1612]]></dc:creator><pubDate>Tue, 03 Feb 2009 12:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 12:21:34 GMT]]></title><description><![CDATA[<p>Selber kenne ich mich in dem Bereich nicht gut aus, aber vielleicht hilft dir der <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-201764.html" rel="nofollow">Artikel über Compilerbau</a> etwas weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657170</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 03 Feb 2009 12:21:34 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 12:24:55 GMT]]></title><description><![CDATA[<p>Unter Linux gibt es 2 Tools, die Hand in Hand arbeiten: Flex und Bison bzw. Lex und Yacc. Auf den zugehoerigen Seiten findest du auch ausfuehrliche Tutorials, wie ein kleiner Taschenrechner zu implementieren ist. Aufbauend auf diesen Erkenntnissen kannst du dann eine eigene Sprache entwerfen.</p>
<p>Auch die Paper bezueglich Lisp/Scheme etc. sind vielleicht hilfreich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657172</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 03 Feb 2009 12:24:55 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 12:26:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Selber kenne ich mich in dem Bereich nicht gut aus, aber vielleicht hilft dir der <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-201764.html" rel="nofollow">Artikel über Compilerbau</a> etwas weiter.</p>
</blockquote>
<p>Siehe Punkt 12 in dem Artikel - allerdings hilft mir der Begriff &quot;Parserbaum&quot;<br />
schon etwas weiter. Gleich mal googlen...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a><br />
Ich möchte bewusst kein Tool dafür verwenden, sondern alles per Hand schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657173</guid><dc:creator><![CDATA[milan1612]]></dc:creator><pubDate>Tue, 03 Feb 2009 12:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 12:50:42 GMT]]></title><description><![CDATA[<p>Die Tools erzeugen c-Sourcedateien, die keinerlei externe Abhaengigkeiten aufweisen. Und du wirst noch genug selbst machen muessen. Natuerlich kannst du dich auch damit aufhalten, einen Matcher fuer regulaere Ausdruecke zu schreiben (flex) und einen Parser fuer Ableitungsbaeume (bison) zu entwickeln. Vielleicht solltest du dir trotzdem flex/bison ansehen, damit du begreifst, was im Hintergrund so abgeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657191</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 03 Feb 2009 12:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 12:52:40 GMT]]></title><description><![CDATA[<p>Abstrake Syntax- und Semantikbäume sind noch eventuelle Stichpunkte die dir weiterhelfen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657193</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 03 Feb 2009 12:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 13:10:49 GMT]]></title><description><![CDATA[<p>Also, ich hab jetzt mal ne Weile nach diesen Begriffen gegoogelt und glaube<br />
dass ich jetzt eine grobe Vorstellung von dem habe was noch auf mich zukommt.<br />
Ich denke ich werd jetzt einfach mal ein bisschen rumprobieren, vielleicht<br />
kommt ja was dabei raus. Wenn ich noch spezielle Fragen hab, meld ich mich wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657204</guid><dc:creator><![CDATA[milan1612]]></dc:creator><pubDate>Tue, 03 Feb 2009 13:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 13:20:31 GMT]]></title><description><![CDATA[<p>milan1612 schrieb:</p>
<blockquote>
<p>Also, ich hab jetzt mal ne Weile nach diesen Begriffen gegoogelt und glaube<br />
dass ich jetzt eine grobe Vorstellung von dem habe was noch auf mich zukommt.<br />
Ich denke ich werd jetzt einfach mal ein bisschen rumprobieren, vielleicht<br />
kommt ja was dabei raus. Wenn ich noch spezielle Fragen hab, meld ich mich wieder.</p>
</blockquote>
<p>Entwirf das doch zuerst einmal mit Hilfe von lex/yacc und anschließend von Hand. Nicht gleich alles auf einmal versuchen! <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/1657208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657208</guid><dc:creator><![CDATA[Tippgeber]]></dc:creator><pubDate>Tue, 03 Feb 2009 13:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to Parser - Wie Code intern speichern on Tue, 03 Feb 2009 13:31:14 GMT]]></title><description><![CDATA[<p>milan1612 schrieb:</p>
<blockquote>
<p>Nun zu meiner eigentlichen Frage, ich möchte aus diesem Tokenstream eine<br />
Art interne Repräsentation der Codelogik aufbauen. Ich habe allerdings<br />
keine Ahnung wie ich das anfangen soll, nicht einmal wie diese Struktur<br />
aussehen soll.</p>
</blockquote>
<p>Häufig kann man Code in zwei Dinge aufteilen: Die Struktur (Funktionen, Klassen, ...) und Ausdrücke (sowas wie <code>i*2+7</code> ). Eine Datei besteht dann z.B. aus einer Reihe Funktionen (mit jeweils Rückgabetyp, Name, Parameter-Namen und -Typen und eventuellen Modifizierern wie z.B. &quot;static&quot;), Klassen (mit Name, Membervariablen, Memberfunktionen, evtl Operatoren, Konstruktoren usw) und anderen &quot;Strukturen&quot;.<br />
An &quot;Code&quot; hast du meist den Code in Funktionen, welcher sich in Codezeilen wie return-Anweisungen, Schleifen, if-Verzweigungen, Variablen-Deklarationen etc und Ausdrücken ausdrücken lässt (z.B. eine Codezeile Variablendeklaration mit Typ=int, Name=foo, Init-Ausdruck=5+7 oder eine while-Schleife mit dem Ausdruck b&gt;7 als Bedingung). Dann gibt's noch &quot;Code&quot; außerhalb von Funktionen, z.B. bei dem Initialisierungs-Code von globalen Variablen-Deklarationen.</p>
<p>Ausdrücke werden dabei meist mit &quot;Abstract Syntax Tree&quot;s repräsentiert, der Rest mit Property-Sammel-Klassen wie deine Token-Struktur.</p>
<p>So könnte das in etwa aussehen:</p>
<pre><code>File
  -&gt; Function[] funcs
  -&gt; VarDecl[]  vars

Function
  -&gt; string     name
  -&gt; Type       return_type
  -&gt; Param[]    params
  -&gt; CodeLine[] codelines

Param
  -&gt; Type       type
  -&gt; string     name

VarDecl
  -&gt; Type      type
  -&gt; string    name
  -&gt; Expression* init_code // Optional falls Initialisierung vorhanden

CodeLine : CodeLineReturn | CodeLineWhile | CodeLineIf | CodeLineVarDecl | ...

CodeLineReturn
  -&gt; Expression* expr  // Optional, falls ein &quot;leeres&quot; return möglich ist

CodeLineVarDecl
  -&gt; VarDecl[] vars

CodeLineWhile
  -&gt; Expression condition
  -&gt; CodeLine[] code_block
...

Expression : ExprBinaryOperator | ExprUnaryOperator | ExprStatement | ...

ExprBinaryOperator
  -&gt; Operator op
  -&gt; Expression left
  -&gt; Expression right

ExprStatement
  -&gt; string text

...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1657212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657212</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 03 Feb 2009 13:31:14 GMT</pubDate></item></channel></rss>