Rolf B: Strukturierter Klartext zu Array mit Compiler oder Präprozessor???

Beitrag lesen

Hallo MB,

Ich benötige nur Theorie eines z.B. WYSIWYG-Editoren auf HTML Basis.

Nein. Das ist kein WYSIWYG Editor. Es ist definitiv ein Parser.

Lexer und Parser sind nur die halbe Miete. Je nach Syntax der verwendeten Notation braucht es danach noch semantische Interpretation.

Man kann nun aufwändig eine EBNF-Grammatik formulieren, die deine "Sprache" definiert, und dafür dann einen Lexer und einen Parser bauen. Das geht, ich hab's auch mal angefangen, aber dann abgebrochen.

Denn bei Dir ist es einfacher. Das Zeilenende ist ein eindeutiger Trenner, und du hast genau 6 Zeilentypen: Level-1 Key, Level-2 Key, Text, Listenpunkt, Tabellenzeile.

Diese 6 Zeilentypen kannst Du recht gut mit Regexen erkennen und zerlegen. Das solltest Du im ersten Schritt tun, und basierend darauf ein Array aus Zeileninformationen erzeugen. Eine solche Zeileninformation besagt, was für ein Typ von Zeile das ist und welche relevanten Daten drinstehen (Key, Einrücktiefe bei Listen, Text-Array).

Dieser Programmteil sollte noch nichts von der weiteren Struktur der Einkaufsliste wissen. Er hat nur seine 3 oder 4 Regexe, die Level-1 Key, Level-2 Key, Liste und Text/Tabellenzeile erkennen. Text und Tabellenzeile sind im Prinzip nur an der Anzahl der Texte unterscheidbar, deswegen bietet sich da eine gemeinsame Regex an und du prüfst nur, wieviele tab-getrennte Texte du darin gefunden hast. Je nachdem, welche Regex getroffen hat (oder ob es eine Leerzeile war) baust Du die entsprechene Zeileninformation auf und schiebst sie in ein Array. Punkt!

Daraus baust Du ein Array aus Level-1 Einträgen auf. Ein solcher Eintrag besteht aus einem Key und einem Array aus Level-2 Einträgen. D.h. sobald Du einen neuen Level-1 Key findest, ist der Level-1 Eintrag, den Du gerade baust, fertig und Du beginnst einen neuen.

In einem Level-2 Eintrag musst Du unterscheiden. Du kannst - wenn dein Beispiel vollständig ist - eine Liste finden, eine Wertetabelle oder Text. D.h. du musst prüfen, ob Du einen dieser drei Zeilentypen hast. Eventuell musst Du, wenn Du eine Zeile analysierst, auch berücksichtigen, in welchem Typ von Gruppe Du bist. In einer Punkteliste? Hab ich noch gar keine Liste? Das kann einfach oder kompliziert sein, je nachdem, welche Varianten du erlauben willst.

Sicherlich sieht dein aktueller Code ähnlich aus, vermengt aber möglicherweise die Schritte 1 und 2 und verwendet vielleicht auch keine Regexe. Aber irgendwie muss die Programmstruktur die Struktur des Eingabedokuments wiederspiegeln, oder Du verwendest einen generischen Parser, der eine Grammatik vorgegeben bekommt. Dann ist die statische Struktur die Grammatik. Aber irgendwo muss die Definition der Struktur sein.

Du könntest Dich auch mal mit YAML beschäftigen. Das ist deiner Einkaufsliste sehr ähnlich, und für YAML gibt es fertige Interpreter, die daraus ein Objekt machen, welches Du dann in einen JSON-String umwandeln kannst.

Rolf

--
sumpsi - posui - obstruxi