<?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[[Spirit] Grammatik mit Block-Einrückung realisieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>die Frage richtet sich an Leute mit Erfahrung in Boost::Spirit.</p>
<p>Ich möchte eine Grammatik implementieren, die keine explitziten Blockgrenzen verwendet sondern Blöcke ausschließlich über ihr Einrückungslevel erkennt, ähnlich wie in Haskell oder Python. Dabei ist die Einrückung aber beliebig variabel, lediglich &quot;mehr als&quot; die des umschließenden Blocks.</p>
<p>Ich bin zur Zeit relativ ratlos, wie man sowas in Spirit realisieren könnte und bevor ich anfange, rumzuhacken, wollte ich fragen, ob es dafür vielleicht eine gewiefte Lösung gibt.</p>
<p>Als Beispiel zur Veranschaulichung, folgender Code wäre gültig:</p>
<pre><code class="language-cpp">function main():
  print(sum(1, 6)) # gibt 21 aus.

function sum(from, to):
    if (from == to)
        return to
    return from + sum(from + 1, to)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/168968/spirit-grammatik-mit-block-einrückung-realisieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 15:35:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168968.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Dec 2006 14:52:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Spirit] Grammatik mit Block-Einrückung realisieren on Sat, 30 Dec 2006 14:52:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>die Frage richtet sich an Leute mit Erfahrung in Boost::Spirit.</p>
<p>Ich möchte eine Grammatik implementieren, die keine explitziten Blockgrenzen verwendet sondern Blöcke ausschließlich über ihr Einrückungslevel erkennt, ähnlich wie in Haskell oder Python. Dabei ist die Einrückung aber beliebig variabel, lediglich &quot;mehr als&quot; die des umschließenden Blocks.</p>
<p>Ich bin zur Zeit relativ ratlos, wie man sowas in Spirit realisieren könnte und bevor ich anfange, rumzuhacken, wollte ich fragen, ob es dafür vielleicht eine gewiefte Lösung gibt.</p>
<p>Als Beispiel zur Veranschaulichung, folgender Code wäre gültig:</p>
<pre><code class="language-cpp">function main():
  print(sum(1, 6)) # gibt 21 aus.

function sum(from, to):
    if (from == to)
        return to
    return from + sum(from + 1, to)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1199901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199901</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 30 Dec 2006 14:52:05 GMT</pubDate></item><item><title><![CDATA[Reply to [Spirit] Grammatik mit Block-Einrückung realisieren on Sat, 30 Dec 2006 15:11:08 GMT]]></title><description><![CDATA[<p>Hmm, also ich hab das selber noch nicht gemacht, aber hast du das schon mit blank_p probiert? Oder vielleicht mit einem lexeme_d[ch_p ('\t')]?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199925</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 30 Dec 2006 15:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to [Spirit] Grammatik mit Block-Einrückung realisieren on Sat, 30 Dec 2006 15:32:25 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Hmm, also ich hab das selber noch nicht gemacht, aber hast du das schon mit blank_p probiert? Oder vielleicht mit einem lexeme_d[ch_p ('\t')]?</p>
</blockquote>
<p>Hi,</p>
<p>das Problem ist ja nicht das Matchen der Zeichen sondern die Tatsache, dass ich im Vornherein nicht weiß, wieviele Zeichen ich matchen muss, dies aber für die Semantik durchaus relevant ist. Ich brauche im Prinzip ein Prädikat, das die aktuelle Einrückungstiefe mit der vorhergehenden vergleicht, und zwar mehrstufig (Blöcke können ja geschachtelt auftreten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199933</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 30 Dec 2006 15:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to [Spirit] Grammatik mit Block-Einrückung realisieren on Sat, 30 Dec 2006 16:31:44 GMT]]></title><description><![CDATA[<p>Du könntest dir einen Actor schreiben, der bei jedem \t oder Leerzeichen einen Counter erhöht und beim ersten anderen Buchstaben diesen benutzt. Du kannst auch in einem ersten Parservorgang die Leerzeichen am Anfang interpretieren und die einzelnen Zeilen dann zusammen mit den Blockinformationen in eine Liste eintragen und später dann einzeln parsen und interpretieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199961</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 30 Dec 2006 16:31:44 GMT</pubDate></item><item><title><![CDATA[Reply to [Spirit] Grammatik mit Block-Einrückung realisieren on Mon, 01 Jan 2007 19:51:17 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Du könntest dir einen Actor schreiben, der bei jedem \t oder Leerzeichen einen Counter erhöht und beim ersten anderen Buchstaben diesen benutzt.</p>
</blockquote>
<p>Vielen Dank für die Antwort. Der Actor in Verbindung mit einem Zähler ist natürlich eine Lösung, wenn ich den aktuellen Zählstand auf einen Stack schiebe und mit dem obersten Element desselben abgleiche.</p>
<p>Ein Problem gibt es da allerdings noch, nämlich die Tatsache, dass Tabs und Leerzeichen in einer Datei nicht gemischt auftreten können (was Einrückung betrifft, ansonsten aber schon), um Fehler zu vermeiden. D.h. es muss noch einen intelligenten Weg geben, Tab- und Leerzeichen-Einrückungen zu unterscheiden (das ist trivial: separate Zähler, aber diese Lösung ist alles andere als elegant). Ein einfacher Test, ob Tabs in der Datei vorkommen, reicht dabei nicht.</p>
<blockquote>
<p>Du kannst auch in einem ersten Parservorgang die Leerzeichen am Anfang interpretieren und die einzelnen Zeilen dann zusammen mit den Blockinformationen in eine Liste eintragen und später dann einzeln parsen und interpretieren.</p>
</blockquote>
<p>Ich möchte das ganze wenn möglich in einem einzigen Pass erledigen. <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="🙂"
    /> Trotzdem Danke für die Idee.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200802</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 01 Jan 2007 19:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to [Spirit] Grammatik mit Block-Einrückung realisieren on Tue, 02 Jan 2007 16:33:11 GMT]]></title><description><![CDATA[<p>Ich habe mir mal angeschaut, wie Python das ganze macht. Hier werden zwei Pässe verwendet. Im ersten Pass werden zusätzliche Tokens &quot;indent&quot; und &quot;dedent&quot; generiert, wenn sich der Indent-Level erhöht bzw. erniedrigt. Dadurch kann man die Grammatik kontextfrei machen.</p>
<p>Im Zusammenspiel mit dem multi_pass-Iterator in Spirit kann man eine Policy entwickeln, die als Eingabe keinen Zeichenstrom annimmt sondern einen Symbolstrom, den man dann schon um die Symbole für indent und dedent bereichert hat. Das ist echt fein, besonders, weil man damit ANTLR- (oder lex-) kompatible Tokenströme verwenden kann, wenn man sich einen entsprechenden Funktor baut (lex ist sogar schon vorgefertigt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201283</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 02 Jan 2007 16:33:11 GMT</pubDate></item></channel></rss>