MB: Erstellung eines simplen Preprocessors

Moin,

wo ich grade bin
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 hier im SelfHTML-Forum schon ein Thread diesbezüglich erstellt.

mein Ziel
Ziel meines Unterfangens soll eine Umformung eines proprietäre Code-Kommentar-Blocks in wahlweise Klartext sein (z.B. Markdown). Ein Preprozessor eben, wenn ich richtig informiert bin.

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.

Daher wende ich mich an euch und benötige einen Abriss eines Preprozessors. Mein gedanke ist, dass ich doch einen zweiten "Parser" benötige, der genau das umgekehrte macht. Aus einer gegebenen Baumstruktur wieder einen Klartext zu generieren.

Ich freue mich auf Zuschriften 😀.

lgmb

--
Sprachstörung

akzeptierte Antworten

  1. Hallo MB,

    nee, du brauchst keinen zweiten Parser.

    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.

    Ein Beispiel für einen nicht detaillierten Baum, aus einer PHP Zuweisungsoperation entstanden sein könnte, wäre dies:

    opZuweisung ziel: variable(a) quelle: $a + 2 * $b - testfunc($x)

    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.

    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.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. moin,

      nee, du brauchst keinen zweiten Parser.

      Der erste liefert Dir doch alle relevanten Inhalte, als Baum. Und aus dem Baum musst Du nun die Zieldarstellung synthetisieren.[…]

      Meine ich doch als "Umgekehrten Parser 😀".

      Ok soweit schonmal alles korrekt. Danke dafür 😀.

      Wie bennente man diese Zusatzkomponente die aus dem geparsten Baumstruktur einen Umformung zu Markdown macht? Synthetisierer?

      lgmb

      --
      Sprachstörung
  2. mein Ziel
    Ziel meines Unterfangens soll eine Umformung eines proprietäre Code-Kommentar-Blocks in wahlweise Klartext sein (z.B. Markdown). Ein Preprozessor eben, wenn ich richtig informiert bin.

    Ich mag den Begriff Preprozessor nicht. Wörtlich übersetzt heißt das nichts anderes als Vorverarbeitung. Damit kann so ziemlich alles und nichts gemeint sein. Leider haben bestimmte CSS-Dialekte diesen Begriff populär gemacht.

    Ein präzieseres Wort für die Art von Software, die du entwickelst, ist Compiler. 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.

    Compiler durchlaufen ganz grob zwei Phasen:

    1. Parsen: Texteingabe aus dem Quellformat in einen Syntaxbaum konvertieren
    2. Code-Generierung: Syntaxbaum in eine Textausgabe im Zielformat erzeugen

    Notiz am Rande: Du hast anfangs das Wort Parser Generator gebraucht, aber du meintest eigentlich Compiler. Ein Parser Generator ist ein Programm, dass aus einer gegebene Sprachdefinition automatisch einen Parser erzeugt.

    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 Dragonbook zu dem Theme emphelen: "Compilers: Principles, Techniques, and Tools".

    1. moin,

      mein Ziel
      Ziel meines Unterfangens […]. Ein Preprozessor […].

      Ich mag den Begriff Preprozessor nicht.

      Der Begriff "Präprozessor" ist mir bewusst, jedoch nicht dieser Umstand. Danke für die Wahnung 😉.

      Ein präzieseres Wort für die Art von Software, die du entwickelst, ist Compiler. […]

      Gut formuliert!!! Ich trau mich aber nicht diesen Begriff "Compiler" (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.

      Compiler durchlaufen ganz grob zwei Phasen:

      1. Parsen: Texteingabe aus dem Quellformat in einen Syntaxbaum konvertieren
      2. Code-Generierung: Syntaxbaum in eine Textausgabe im Zielformat erzeugen

      Ich Danke Dir 😀.

      Notiz am Rande: Du hast anfangs das Wort Parser Generator gebraucht, aber du meintest eigentlich Compiler. Ein Parser Generator ist ein Programm, dass aus einer gegebene Sprachdefinition automatisch einen Parser erzeugt.

      Danke für deine/eure Antizipation, welches mir schon oft sprachlich aus der Patsche geholfen.

      Diesbezüglich meine ich Parser Generator 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.

      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 Dragonbook zu dem Theme emphelen: "Compilers: Principles, Techniques, and Tools".

      Vielen Dank für die Buchemfehlung. Mittlerweile kann ich ganz gut englisch lesen. Wikipedia und Fachtexten sei Dank.

      lgmb

      --
      Sprachstörung
      1. Hi,

        Ich würde dir das sogenannte Dragonbook zu dem Theme emphelen: "Compilers: Principles, Techniques, and Tools".

        Vielen Dank für die Buchemfehlung. Mittlerweile kann ich ganz gut englisch lesen. Wikipedia und Fachtexten sei Dank.

        Zu meinen Studienzeiten gab's das auch als Drachenbuch, also deutsch. Compilerbau.

        Wobei ich nur den Teil 1 habe.

        cu,
        Andreas a/k/a MudGuard

    2. Hallo 1unitedpower,

      Ich würde dir das sogenannte Dragonbook zu dem Theme empfehlen:

      https://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

      Wenn ich mir da so die Inhaltsangabe anschaue, dann dürfte das Buch auf 9 seiner 1009 Seiten die Themen von MB abhandeln 😉

      Leider ist es nicht mehr zu kaufen, bzw. man bekommt es beim Verlag, aber man scheint den Turing-Award für Aho und Ullman aus dem Jahr 2020 eingepreist zu haben!!elf!1!

      Update: Good News - bei pearson.de hat man das scheinbar noch nicht mitbekommen, aber man weiß auch nie, was eine deutsche Übersetzung eines englischen Fachbuchs taugt.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Wenn ich mir da so die Inhaltsangabe anschaue, dann dürfte das Buch auf 9 seiner 1009 Seiten die Themen von MB abhandeln 😉

        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.

        Leider ist es nicht mehr zu kaufen

        Man bekommt es sicher noch irgendwo gebraucht zu kaufen. Das würde ich bei Fachliteratur sowieso meistens empfehlen. Man kann hier viel Geld sparen.

        1. moin,

          […] 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. […]

          Historie:
          2004 kam die ersten Fragen, was wohl der Sinn von return bei JavaScript sei. Oder warum das CSS Attribute-Value-Paar width:-100 im damalige IE richtig angezeigt wurde aber bei anderen Browsern nicht 😀.

          Was haltet ihr von Udemy
          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 😕.

          lgmb

          Sprachstörung

  3. Hallo MB,

    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.

    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.

    https://www.antlr.org/download.html

    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!

    Rolf

    --
    sumpsi - posui - obstruxi
    1. 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.

      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.

      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.

      1. moin,

        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.

        Das ist die Spielentwickler Firma Bohemia Interactiv mir ihrer Skriptsprache SQF

        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.

        Token

        • Structure
          • ID: Identifikation des Tokens
          • Superset: Obermenge worunter dieser Token fällt
          • Subset: Untermenge an Tokens die dieser Token enthalten könnte
        • Delimiter: Zeichen Begrenzungen
          • Init: (RegEx)
          • Teminate: (RegEx)
          • Restriction: Inhalt in der Begrenzungen müssen diese Zeichen sein

        simpleRegEx

        habe ich so reaslisiert:

        • quantifier: 0 bis 2 Min-Max-Indices
        • negation: boolsche wert
        • sequences: iterierte Sequenzen oder Zeichentabellen

        Das ganze n-Mal mit Start und/oder Stop Sequenz

        Ich hoffe sehr stark das ihr nicht die Hände über dem Kopf zusammen schlagt 😀.

        lgmb

        --
        Sprachstörung