Danke für die Frage!
Parsergeneratoren erzeugen aus einer abstakten Syntaxbeschreibung (Grammatik) Programmcode mit dem Texte, die dieser Syntax gehorchen geparst (analysiert) werden können. Die Vorteile von Parsergeneratoren gegenüber handgeschriebenen Code sind Arbeitsersparnis, Übersichtlichkeit, einfacherer Erweiterbarkeit und automatische Grammatiktests.
Verbreitete Parsergeneratoren sind u.a. Flex/Yacc und ANTLR
Im TextTransformer erfolgt die Syntaxbeschreibung mit den gleichen Symbolen, die auch für reguläre Ausdrücke verwendet werden. (Reguläre Ausdrücke haben eine weite Verbreitung in Texteditoren etc.)
Quelltext
1: 2: 3: 4:
| x? optionales Vorkommen von x* null oder mehrmalige Wiederholung von x x+ einmalige oder mehrmalige Wiederholung x|y Alternative x oder y |
Z.B. mit
Quelltext
1:
| ("Herr" | "Frau" ) "Mustermensch" |
kann man
"Herr Mustermensch" oder "Frau Mustermensch" parsen, aber nichts anderes.
Der Matheparser ist das ideale Beispiel. Die Syntaxbeschreibung für einen einfachen Rechner kann z.B. so aussehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Rechner ::= Expression
Expression ::= Term ( "+" Term | "-" Term )*
Term ::= Factor ( "*" Factor | "/" Factor )*
Factor ::= "-"? ( Number | "(" Expression ")" ) |
Number ist ein regulärer Ausdruck, mit dem Zahlen im Text erkannt werden.
mit diesen Regeln lässt sich z.B. folgender Rechenausdruck parsen:
Quelltext
1:
| (3.2 + 8.9 - 4.6) * 5.6 |
Zunächst wird mit der Rechnerregel gestartet. Die beginnt mit der Termregel usw. bis schließlich "(" gefunden und konsumiert wird.
Rechner->Expression->Term->Factor->"(" konsumiert "("
Expression->Term->Factor->Number konsumiert 3.2
Die Factorregel ist damit fertig und es geht wieder "aufwärts"
Factor->Term->Expression->"+"
Das geht fast so wie in normalem Programmcode.
In diese Syntaxbeschreibung kann normaler Programmcode eingebettet werden, der ausgeführt wird, sobald die entsprechende Stelle der Grammatik erreicht ist. Damit lässt sich beim Parsen des Textes zugleich das Ergebnis des Rechenausdrucks berechnen.
Dieses Beispiel befindet sich im Installationspaket des TextTransformers. Man kann es dort schrittweise austesten.
Der Matheparser ist ein sehr einfaches Beispiel. Die Delphi-Grammatik ist sehr viel komplizierter. Das Prinzip ist aber das gleiche. So kann auch in den Delphiparser Code eingefügt werden, z.B. um einen Übersetzer zu bauen oder um den Code zu instrumentieren (z.B Profileranweisungen einfügen) oder eben um den Prettyprinter zu erzeugen.
Ich hoffe das war einigermaßen verständlich. Mehr findet sich z.B. in der Online-Hilfe
www.texttransformer....ml/tthelp/index.html