tag:forum.selfhtml.org,2005:/self Erstellung eines simplen Preprocessors – SELFHTML-Forum 2021-04-01T18:40:35Z https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786677?srt=yes#m1786677 MB 2021-03-31T17:38:38Z 2021-03-31T17:38:38Z Erstellung eines simplen Preprocessors <p>Moin,</p> <p><strong>wo ich grade bin</strong><br> ich bin gerade dabei, einen simplen Parser Generator zu schreiben, der variable Tokens annimmt und gegebenen Text mit dieser Info parst und so eine Baumstruktur erstellt. Einen simplen Regex habe ich schon geschrieben. Ich habe <a href="https://forum.selfhtml.org/self/2021/feb/20/tokenizer-entwurf-und-ansatze-in-proprietarer-skript-sprache-ok/1784558#m1784558" rel="noopener noreferrer">hier</a> im SelfHTML-Forum schon ein Thread diesbezüglich erstellt.</p> <p><strong>mein Ziel</strong><br> Ziel meines Unterfangens soll eine Umformung eines proprietäre Code-Kommentar-Blocks in wahlweise Klartext sein <em>(z.B. Markdown)</em>. Ein <em>Preprozessor</em> eben, wenn ich richtig informiert bin.</p> <p>Ich hab mich ein wenig im Internet umgeschaut, leider aber keine Anleitung oder einen beschriebenen Vorgang aus der ich eine Anleitung abstrahierten kann gefunden . Vielleicht lese ich einfach an falschen Stellen - im internet gibt soviele nix sagende Infos.</p> <p>Daher wende ich mich an euch und benötige einen Abriss eines Preprozessors. Mein gedanke ist, dass ich doch einen zweiten <em>"Parser"</em> benötige, der genau das umgekehrte macht. Aus einer gegebenen Baumstruktur wieder einen Klartext zu generieren.</p> <p>Ich freue mich auf Zuschriften .</p> <p>lgmb</p> <div class="signature">-- <br> Sprachstörung </div> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786678?srt=yes#m1786678 Rolf B 2021-03-31T18:00:54Z 2021-03-31T18:00:54Z Erstellung eines simplen Preprocessors <p>Hallo MB,</p> <p>nee, du brauchst keinen zweiten Parser.</p> <p>Der erste liefert Dir doch alle relevanten Inhalte, als Baum. Und aus dem Baum musst Du nun die Zieldarstellung synthetisieren. Das ist im Vergleich zum Parser, bei dem Du ja die Eingabe verstehen musst, einfach. Vorausgesetzt, dein Baum ist präzise und detailliert genug.</p> <p>Ein Beispiel für einen nicht detaillierten Baum, aus einer PHP Zuweisungsoperation entstanden sein könnte, wäre dies:</p> <p>opZuweisung ziel: variable(a) quelle: $a + 2 * $b - testfunc($x)</p> <p>Wenn du nun PHP nach JavaScript transpilieren wolltest, dann hilft Dir dieser Baum kaum was. Du weißt zwar, dass da eine Zuweisung an die Variable a vorliegt, aber die Quelle ist noch komplett unverstanden. Daraus kannst Du kein JavaScript synthetisieren.</p> <p>Wenn Dein Baum aber sagt: Das ist eine Liste, sie hat diese Punkte, jeder Punkt hat diesen Textinhalt, dann musst Du das eigentlich nur als Markdown wieder ausgeben und dabei die Syntaxregeln von Markdown beachten.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786700?srt=yes#m1786700 1unitedpower 2021-04-01T10:26:22Z 2021-04-01T10:26:22Z Erstellung eines simplen Preprocessors <blockquote> <p><strong>mein Ziel</strong><br> Ziel meines Unterfangens soll eine Umformung eines proprietäre Code-Kommentar-Blocks in wahlweise Klartext sein <em>(z.B. Markdown)</em>. Ein <em>Preprozessor</em> eben, wenn ich richtig informiert bin.</p> </blockquote> <p>Ich mag den Begriff <em>Preprozessor</em> nicht. Wörtlich übersetzt heißt das nichts anderes als <em>Vorverarbeitung</em>. Damit kann so ziemlich alles und nichts gemeint sein. Leider haben bestimmte CSS-Dialekte diesen Begriff populär gemacht.</p> <p>Ein präzieseres Wort für die Art von Software, die du entwickelst, ist <em>Compiler</em>. Ein Compiler ist ein Programm, das einen Text in einem bestimmten Quellformat einliest und daraus einen Text in einem bestimmten Zielformat erzeugt. Dabei soll die Bedeutung (die Semantik) des Ausgabetextes möglichst der Bedeutung des Eingabetextes entsprechen.</p> <p>Compiler durchlaufen ganz grob zwei Phasen:</p> <ol> <li>Parsen: Texteingabe aus dem Quellformat in einen Syntaxbaum konvertieren</li> <li>Code-Generierung: Syntaxbaum in eine Textausgabe im Zielformat erzeugen</li> </ol> <p>Notiz am Rande: Du hast anfangs das Wort <em>Parser Generator</em> gebraucht, aber du meintest eigentlich <em>Compiler</em>. Ein <em>Parser Generator</em> ist ein Programm, dass aus einer gegebene Sprachdefinition automatisch einen <em>Parser</em> erzeugt.</p> <p>Sowie ich dich verstanden habe hast die erste Phase bereits implementiert. Jetzt geht es darum, die zweite Phase, also den Code-Generator zu implementieren. Typischwersie bekommt der Code-Generator das Ergebnis des Parsers, also den Syntaxbaum, als Eingabe. Diesen Baum durchläuft der Code-Generator Knoten für Knoten, und während er das tut, fügt er Stück für Stück die Ausgabe zusammen. Die notwendigen Algorithmen im Detail zu erklären würde hier deutlich den Rahmen sprengen. Ich würde dir das sogenannte <em>Dragonbook</em> zu dem Theme emphelen: "Compilers: Principles, Techniques, and Tools".</p> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786712?srt=yes#m1786712 Rolf B 2021-04-01T16:09:21Z 2021-04-01T16:09:21Z Erstellung eines simplen Preprocessors <p>Hallo MB,</p> <p>wo wir hier schon bei abstraktem Tooling angekommen sind - ein theoretischer Ansatz an das Problem kann darin bestehen, ANTLR zu verwenden. Das ist tatsächlich ein Parser Generator. Du definierst die Sprache, die er verstehen soll, und bekommst einen Syntaxbaum geliefert.</p> <p>ANTLR selbst ist in Java geschrieben, macht aber nichts, weil der schwere Teil von ANTLR das Umsetzen der BNF-artigen Definitionen in Parser-Regeln ist. Deren Umsetzung wird dann für die Einsatzsprache passend generiert, und da gibt's sehr viele Targets. PHP gehört dazu.</p> <p><a href="https://www.antlr.org/download.html" rel="nofollow noopener noreferrer">https://www.antlr.org/download.html</a></p> <p>Ich habe ANTLR schon selbst benutzt, um im Büro eine kleines scriptfähiges Tool zu programmieren. Ich bin ohne ANTLR und mit REGEXen gestartet, und merkte schnell, dass ich mir die Finger dabei abbrach. Mit ANTLR ertappte ich mich ständig dabei, noch ein Feature mehr einbauen zu wollen. Weil ich's konnte!</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786680?srt=yes#m1786680 MB 2021-03-31T18:33:33Z 2021-03-31T18:33:33Z Erstellung eines simplen Preprocessors <p>moin,</p> <blockquote> <p>nee, du brauchst keinen zweiten Parser.</p> <p>Der erste liefert Dir doch alle relevanten Inhalte, als Baum. Und aus dem Baum musst Du nun die Zieldarstellung synthetisieren.[…]</p> </blockquote> <p>Meine ich doch als <em>"Umgekehrten Parser "</em>.</p> <p>Ok soweit schonmal alles korrekt. Danke dafür .</p> <p>Wie bennente man diese Zusatzkomponente die aus dem geparsten Baumstruktur einen Umformung zu Markdown macht? Synthetisierer?</p> <p>lgmb</p> <div class="signature">-- <br> Sprachstörung </div> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786704?srt=yes#m1786704 MB 2021-04-01T12:17:18Z 2021-04-01T12:17:18Z Erstellung eines simplen Preprocessors <p>moin,</p> <blockquote> <blockquote> <p><strong>mein Ziel</strong><br> Ziel meines Unterfangens […]. Ein <em>Preprozessor</em> […].</p> </blockquote> </blockquote> <blockquote> <p>Ich mag den Begriff <em>Preprozessor</em> nicht.</p> </blockquote> <p>Der Begriff <em>"Präprozessor"</em> ist mir bewusst, jedoch nicht dieser Umstand. Danke für die Wahnung .</p> <blockquote> <p>Ein präzieseres Wort für die Art von Software, die du entwickelst, ist <em>Compiler</em>. […]</p> </blockquote> <p>Gut formuliert!!! Ich trau mich aber nicht diesen Begriff <em>"Compiler"</em> (für Ausführbaren Code) zu verwenden, weil dieser mit all seinen Komponenten absolut beschrieben ist. Ich bin diesbezüglich weder detailiert belesen noch im stande alle Komponenten auszuprogrammieren. Und teilweise benötige ich sie für mein Belangen nicht einmal. Fals du es dennoch so siehst, dass dieser Begriff passt, werde ich Ihn verwenden.</p> <blockquote> <p>Compiler durchlaufen ganz grob zwei Phasen:</p> <ol> <li>Parsen: Texteingabe aus dem Quellformat in einen Syntaxbaum konvertieren</li> <li>Code-Generierung: Syntaxbaum in eine Textausgabe im Zielformat erzeugen</li> </ol> </blockquote> <p>Ich Danke Dir .</p> <blockquote> <p>Notiz am Rande: Du hast anfangs das Wort <em>Parser Generator</em> gebraucht, aber du meintest eigentlich <em>Compiler</em>. Ein <em>Parser Generator</em> ist ein Programm, dass aus einer gegebene Sprachdefinition automatisch einen <em>Parser</em> erzeugt.</p> </blockquote> <p>Danke für deine/eure Antizipation, welches mir schon oft <em>sprachlich</em> aus der Patsche geholfen.</p> <p>Diesbezüglich meine ich <em>Parser Generator</em> so wie ich es sage - wenn ich richtig informiert bin. Ich compiliere ja für abenteuliche Formate die sich nur im Code als Kommentar Block gleichen. Deswegen benötigt man unterschiedliche Eingabeformate für ein gemeinsames Ausgabeformat.</p> <blockquote> <p>Sowie ich dich verstanden habe hast die erste Phase bereits implementiert. Jetzt geht es darum, die zweite Phase, also den Code-Generator zu implementieren. […]. Ich würde dir das sogenannte <em>Dragonbook</em> zu dem Theme emphelen: "Compilers: Principles, Techniques, and Tools".</p> </blockquote> <p>Vielen Dank für die Buchemfehlung. Mittlerweile kann ich ganz gut englisch lesen. Wikipedia und Fachtexten sei Dank.</p> <p>lgmb</p> <div class="signature">-- <br> Sprachstörung </div> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786711?srt=yes#m1786711 Rolf B 2021-04-01T15:58:19Z 2021-04-01T16:01:01Z Erstellung eines simplen Preprocessors <p>Hallo 1unitedpower,</p> <blockquote> <p>Ich würde dir das sogenannte Dragonbook zu dem Theme empfehlen:</p> </blockquote> <p><a href="https://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools" rel="nofollow noopener noreferrer">https://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools</a></p> <p>Wenn ich mir da so die Inhaltsangabe anschaue, dann dürfte das Buch auf 9 seiner 1009 Seiten die Themen von MB abhandeln </p> <p>Leider ist es nicht mehr zu kaufen, bzw. man bekommt es beim Verlag, aber man scheint den <a href="https://de.wikipedia.org/wiki/Turing_Award" rel="nofollow noopener noreferrer">Turing-Award für Aho und Ullman</a> aus dem Jahr 2020 <a href="https://www.pearson.com/store/p/compilers-principles-techniques-and-tools/P100000772496" rel="nofollow noopener noreferrer">eingepreist</a> zu haben!!elf!1!</p> <p>Update: Good News - bei pearson.de hat man das scheinbar <a href="https://bookshop.pearson.de/compiler.html" rel="nofollow noopener noreferrer">noch nicht mitbekommen</a>, aber man weiß auch nie, was eine deutsche Übersetzung eines englischen Fachbuchs taugt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786710?srt=yes#m1786710 MudGuard http://www.andreas-waechter.de/ 2021-04-01T15:30:38Z 2021-04-01T15:30:38Z Erstellung eines simplen Preprocessors <p>Hi,</p> <blockquote> <blockquote> <p>Ich würde dir das sogenannte <em>Dragonbook</em> zu dem Theme emphelen: "Compilers: Principles, Techniques, and Tools".</p> </blockquote> <p>Vielen Dank für die Buchemfehlung. Mittlerweile kann ich ganz gut englisch lesen. Wikipedia und Fachtexten sei Dank.</p> </blockquote> <p>Zu meinen Studienzeiten gab's das auch als Drachenbuch, also deutsch. Compilerbau.</p> <p>Wobei ich nur den Teil 1 habe.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786713?srt=yes#m1786713 1unitedpower 2021-04-01T16:21:28Z 2021-04-01T16:21:28Z Erstellung eines simplen Preprocessors <blockquote> <p>Wenn ich mir da so die Inhaltsangabe anschaue, dann dürfte das Buch auf 9 seiner 1009 Seiten die Themen von MB abhandeln </p> </blockquote> <p>Ich weiß nicht wie du zählst, aus meiner Sicht sind für MB die Kapitel 1-6 und 8 unmittelbar relevant. Die übrigen Kapitel nicht unbedingt, sie fördern aber das allgemeine Verständnis von Programmiersprachen. Da MB hier seit Monaten (Jahren?) immer wieder Fragen zu dem Themenkomplex stellt, hielt ich es für angebracht, ihm mal das Standardwerk dazu zu empfehlen, anstatt ihm immer nur Stückwerk zu präsentieren. Das Buch ist in die Jahre gekommen, aber es ist gut gealtert. Die theoretischen Grundlagen des Compilerbaus haben sich kaum geändert.</p> <blockquote> <p>Leider ist es nicht mehr zu kaufen</p> </blockquote> <p>Man bekommt es sicher noch irgendwo gebraucht zu kaufen. Das würde ich bei Fachliteratur sowieso meistens empfehlen. Man kann hier viel Geld sparen.</p> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786714?srt=yes#m1786714 1unitedpower 2021-04-01T17:07:13Z 2021-04-01T17:07:13Z Erstellung eines simplen Preprocessors <blockquote> <p>ANTLR selbst ist in Java geschrieben, macht aber nichts, weil der schwere Teil von ANTLR das Umsetzen der BNF-artigen Definitionen in Parser-Regeln ist. Deren Umsetzung wird dann für die Einsatzsprache passend generiert, und da gibt's sehr viele Targets. PHP gehört dazu.</p> </blockquote> <p>Wenn ich mich richtig erinnere, arbeitet MB in einer propritären firmeninternen Programmiersprache. Ich kann mich an den Namen nicht erinnern, aber vermute eher nicht, dass ANTLR dafür ein Backend anbietet.</p> <p>Ein weiterer Punkt, den ich zu bedenken geben möchte, ist, dass MBs Quellsprache kontext-sensitiv ist. Damit haben Parser-Generator zum Teil erhebliche Schwierigkeiten.</p> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786715?srt=yes#m1786715 MB 2021-04-01T18:00:42Z 2021-04-01T18:01:49Z Was haltet ihr von Udemy <p>moin,</p> <blockquote> <p>[…] Da MB hier seit Monaten (Jahren?) immer wieder Fragen zu dem Themenkomplex stellt, hielt ich es für angebracht, ihm mal das Standardwerk dazu zu empfehlen, anstatt ihm immer nur Stückwerk zu präsentieren. […]</p> </blockquote> <p><strong>Historie:</strong><br> 2004 kam die ersten Fragen, was wohl der Sinn von <code>return</code> bei <em>JavaScript</em> sei. Oder warum das <em>CSS</em> Attribute-Value-Paar <code>width:-100</code> im damalige <em>IE</em> richtig angezeigt wurde aber bei anderen Browsern nicht .</p> <p><strong>Was haltet ihr von Udemy</strong><br> Ich bin dort schon sehr lange. Ich habe mir Kurse für die Design Patterns gebucht und ein anderer Kurs das Thema PHP-Applikation. Das ist mein prekärer Ersatz für ein Studium .</p> <h3>lgmb</h3><p>Sprachstörung</p> https://forum.selfhtml.org/self/2021/mar/31/erstellung-eines-simplen-preprocessors/1786716?srt=yes#m1786716 MB 2021-04-01T18:40:35Z 2021-04-01T18:42:17Z Meine Token und RegEx Beschreibung <p>moin,</p> <blockquote> <p>Wenn ich mich richtig erinnere, arbeitet MB in einer propritären firmeninternen Programmiersprache. Ich kann mich an den Namen nicht erinnern, aber vermute eher nicht, dass ANTLR dafür ein Backend anbietet.</p> </blockquote> <p>Das ist die Spielentwickler Firma <a href="http://www.bistudio.com/" rel="nofollow noopener noreferrer">Bohemia Interactiv</a> mir ihrer Skriptsprache <a href="https://community.bistudio.com/wiki/SQF_Syntax" rel="nofollow noopener noreferrer">SQF</a></p> <blockquote> <p>Ein weiterer Punkt, den ich zu bedenken geben möchte, ist, dass MBs Quellsprache kontext-sensitiv ist. Damit haben Parser-Generator zum Teil erhebliche Schwierigkeiten.</p> </blockquote> <h3>Token</h3><ul> <li><strong>Structure</strong> <ul> <li><em>ID</em>: Identifikation des Tokens</li> <li><em>Superset</em>: Obermenge worunter dieser Token fällt</li> <li><em>Subset</em>: Untermenge an Tokens die dieser Token enthalten könnte</li> </ul> </li> <li><strong>Delimiter</strong>: Zeichen Begrenzungen <ul> <li><em>Init</em>: (RegEx)</li> <li><em>Teminate</em>: (RegEx)</li> <li><em>Restriction</em>: Inhalt in der Begrenzungen müssen diese Zeichen sein</li> </ul> </li> </ul> <h3>simpleRegEx</h3><p>habe ich so reaslisiert:</p> <ul> <li><em>quantifier</em>: 0 bis 2 Min-Max-Indices</li> <li><em>negation</em>: boolsche wert</li> <li><em>sequences</em>: iterierte Sequenzen oder Zeichentabellen</li> </ul> <p>Das ganze n-Mal mit Start und/oder Stop Sequenz</p> <p>Ich hoffe sehr stark das ihr nicht die Hände über dem Kopf zusammen schlagt .</p> <p>lgmb</p> <div class="signature">-- <br> Sprachstörung </div>