<?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 und Tokentree]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite mich gerade in die Welt der Sprachen und Compiler ein. Ich habe bereits einen funktionsfähigen Parser für eine relativ komplexe C ähnliche Sprache gebaut, nur bin ich derzeit mit dem handling von den Tress nicht zufreiden.</p>
<p>Ich habe das der performance wegen in eine Linked-List structure erzeugt, die allerdings unheimlich schwer zu überwachen ist, gerade wenn zwischendurch Tokens zerstört werden oder der komplette Tree zerstört werden soll aber einzelne Tokens weiterbenutzt werden.</p>
<pre><code>typedef struct ext Token
	{
		public:
			bool disposed;
			TokenType::TYPE Type;

			union
			{
				struct
				{
					const char* First;
					const char* Last;

					unsigned long Index;
				}IndexValue;
				struct
				{
					const char* First;
					const char* Last;
				}Value;
				unsigned long Index;
			};

			Token* Next;

			Token();
			~Token();

			void AddNode(TokenType::TYPE type);
			void AddNode(TokenType::TYPE type, unsigned long index);
			void AddNode(TokenType::TYPE type, const char* first, const char* last);
			void AddNode(TokenType::TYPE type, const char* first, const char* last, unsigned long index);			

			void Dispose();
	}Token;
</code></pre>
<p>Ich wollte das jetzt etwas einfacher gestalten, tu mich aber mit dem Ansatz dafür schwer. Die Tokens sind mommentan so aufgebaut, dass es grundsätzlich immer einen Index gibt welcher die aktuelle Position im Stream definiert, da ich nur auf iostreams arbeite. Die Pointer char* stammen noch aus frühen experimenten, werden aber entweder für zusätzliche Informationen über das Token (z.b. eine dynamische Erweiterung eines Datentyps, zum Abspeichern von Steuerzeichen) oder eben als Anfang und Ende eines Identifiers im Stream verwendet. Next gibt den nächsten Token in der Liste an.</p>
<p>Der Quellcode ist rein experimentell und sieht daher so aus wie er aussieht, für optimierungen und die &quot;Regeln der Kunst&quot; ist hinterher noch zeit!</p>
<p>Habt ihr irgendwelche Vorschläge für einen besseren Ansatz?<br />
std::vector habe ich deshalb nicht genommen weil der Code möglichst performant sein sollte.</p>
<p>Beste Grüße und schönen Dank schonmal für etwaige Hilfe <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/topic/332856/parser-und-tokentree</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 10:41:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332856.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 May 2015 12:04:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parser und Tokentree on Tue, 26 May 2015 12:04:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite mich gerade in die Welt der Sprachen und Compiler ein. Ich habe bereits einen funktionsfähigen Parser für eine relativ komplexe C ähnliche Sprache gebaut, nur bin ich derzeit mit dem handling von den Tress nicht zufreiden.</p>
<p>Ich habe das der performance wegen in eine Linked-List structure erzeugt, die allerdings unheimlich schwer zu überwachen ist, gerade wenn zwischendurch Tokens zerstört werden oder der komplette Tree zerstört werden soll aber einzelne Tokens weiterbenutzt werden.</p>
<pre><code>typedef struct ext Token
	{
		public:
			bool disposed;
			TokenType::TYPE Type;

			union
			{
				struct
				{
					const char* First;
					const char* Last;

					unsigned long Index;
				}IndexValue;
				struct
				{
					const char* First;
					const char* Last;
				}Value;
				unsigned long Index;
			};

			Token* Next;

			Token();
			~Token();

			void AddNode(TokenType::TYPE type);
			void AddNode(TokenType::TYPE type, unsigned long index);
			void AddNode(TokenType::TYPE type, const char* first, const char* last);
			void AddNode(TokenType::TYPE type, const char* first, const char* last, unsigned long index);			

			void Dispose();
	}Token;
</code></pre>
<p>Ich wollte das jetzt etwas einfacher gestalten, tu mich aber mit dem Ansatz dafür schwer. Die Tokens sind mommentan so aufgebaut, dass es grundsätzlich immer einen Index gibt welcher die aktuelle Position im Stream definiert, da ich nur auf iostreams arbeite. Die Pointer char* stammen noch aus frühen experimenten, werden aber entweder für zusätzliche Informationen über das Token (z.b. eine dynamische Erweiterung eines Datentyps, zum Abspeichern von Steuerzeichen) oder eben als Anfang und Ende eines Identifiers im Stream verwendet. Next gibt den nächsten Token in der Liste an.</p>
<p>Der Quellcode ist rein experimentell und sieht daher so aus wie er aussieht, für optimierungen und die &quot;Regeln der Kunst&quot; ist hinterher noch zeit!</p>
<p>Habt ihr irgendwelche Vorschläge für einen besseren Ansatz?<br />
std::vector habe ich deshalb nicht genommen weil der Code möglichst performant sein sollte.</p>
<p>Beste Grüße und schönen Dank schonmal für etwaige Hilfe <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/2454797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454797</guid><dc:creator><![CDATA[Shaarigan]]></dc:creator><pubDate>Tue, 26 May 2015 12:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Parser und Tokentree on Tue, 26 May 2015 16:41:25 GMT]]></title><description><![CDATA[<p>Shaarigan schrieb:</p>
<blockquote>
<p>Ich habe das der performance wegen in eine Linked-List structure erzeugt</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454815</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 26 May 2015 16:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to Parser und Tokentree on Tue, 26 May 2015 16:51:14 GMT]]></title><description><![CDATA[<p>Mich würden die Profiling-Ergebnisse interessieren, die dich dazu bewegt haben, eine selbst implementierte Linked List anstatt des vectors zu nehmen. Hast du diese zufällig noch da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454816</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Tue, 26 May 2015 16:51:14 GMT</pubDate></item><item><title><![CDATA[Reply to Parser und Tokentree on Tue, 26 May 2015 17:08:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29260">@Shaarigan</a><br />
Dir ist schon klar dass <code>ext</code> ein beschissener Name für dein <code>__declspec(dllexport)</code> Makro ist, ja?<br />
Und dass du das <code>typedef</code> in <code>typedef struct</code> in C++ überflüssig ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454819</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 May 2015 17:08:37 GMT</pubDate></item></channel></rss>