Autor Beitrag
dmeltz
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 26.08.09 12:14 
Ich habe kürzlich eine Grammatik für Delphi 4/5 zur Generierung von Parsern mittels des TextTransformer-Programms veröffentlicht und könnte mir vorstellen, dass sich der eine oder andere hier dafür interessiert.

www.text-konverter.h...ine.de/Delphi_ge.txt

Es ist meines Wissens die einzige veröffentliche Delphi-Grammatik für einen Parsergenerator, die ohne schwerwiegende Einschränkungen funktioniert. Die gesamte VCL und über 2000 pas-Dateien meiner installierten Komponenten konnte ich damit parsen.

Der Delphi-Parser benutzt einen Präprozessor zur bedingten Kompilierung der Quellen. Das ist sehr praktisch, weil damit weitere pas-Dateien unmittelbar getestet werden können.

www.text-konverter.h...de/Delphi_pp_ge.html

Als Demonstration für die Verwendbarkeit des Parsers gibt es einen Prettyprinter:

www.text-konverter.h...iPrettyPrint_ge.html

Der Prettyprinter ist auch in den TextTransformer-Komponenten enthalten. Mit der ebenfalls enthaltenen Beispielsanwendung kann er geladen und unmittelbar ausgeführt werden.

www.text-konverter.h...e/Components_ge.html

Der TextTransformer kann alle Projekten als C++ Code exportieren - leider nicht als Delphi-Code. Aber die freien TetraComponents erlauben es TextTransformer-Projekte innerhalb von Delphi oder CBuilder-Programmen zu benutzen. Sie werden mit der ebenfalls frei verfügbaren tetra_engine.dll ausgeführt (interpretiert). Die Komponenten kapseln diese dll.
Die Komponenten erlauben u.a. einige Behandlungen von Parse-Ereignissen. Dabei werden Nummern für Token und Produktionen übermittelt. Die Nummern kann der TextTransformer in eine vom Benutzer anzupassende Schablone exportieren.

Den TextTransformer gibt es unter:

www.texttransformer.de


Fragen und Feedback sind erwünscht

Detlef Meyer-Eltz


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 26.08.2009 um 13:39
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Do 27.08.09 13:39 
Hi!

Ich habe bisher "Parsergenerator" zwar gehört, allerdings kann ich mir nicht so richtig vorstellen, wie der arbeitet. Kannst du vielleicht kurz mal beschreiben, was er macht? Und was er so kann? Kann ich mir damit jetzt zum Beispiel auch einen Matheparser basteln?
dmeltz Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 27.08.09 14:53 
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.)

ausblenden 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

ausblenden 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:

ausblenden 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:

ausblenden 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
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Do 27.08.09 15:35 
Das klingt sehr interessant! Ich werde das demnächst mal austesten, wie so die Performance eines generierten Parsers im Gegensatz zu meinem (unveröffentlichten) Mathe-Parser ist. Aber für größere Aufgaben klingt das nach einer netten Lösung.

EDIT: Seh ich gerade: Schade, dass das ohne DLL nur für C++ geht. Für C++ hab ich im Moment noch keinen Compiler installiert.
dmeltz Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 27.08.09 23:20 
Der TextTransformer ist ein RAD-Tool und hauptsächlich auf Komfort und Flexibilität ausgelegt und weniger auf Performance wie andere Parsergeneratoren.

Außerdem verfügt der TextTransformer über einen integrierten C++-Interpreter, so dass man mit ihm vollständige Programme erstellen kann, ohne überhaupt irgendeinen Compiler für irgendeine Sprache zu besitzen. Er eignet er sich daher sehr gut zur schnellen Entwicklung von Wegwerf-Programmen, z.B. der Extraktion von speziellen Inhalten aus Webseiten.

Auch das Rechnerbeispiel funktioniert inklusive der Berechnung des Resultats im TextTransformer allein. Deshalb wäre der Rechner auch mit den TetraComponents verwendbar: Eingabetext wäre der Rechenausdruck, Rückgabetext wäre das Ergebniswert als string.