Wie beginnt man ein neues Projekt?

Top  Previous  Next

 

Bevor man beginnt eigene Projekte zu entwickeln, ist es empfehlenswert die Einführung zu lesen und mit dem Assistenten für neue Projekte und den Beispielen zu experimentieren.

 

Für viele Programmiersprachen und Formate kann man im Internet fertige Grammatiken finden. Falls eine solche Beschreibung existiert kann sie oft relativ einfach in die Syntax des TextTransformers übersetzt werden. Ein halb-automatischer Übersetzer für Coco/R-Grammatiken gehört zu den Beispielen des TextTransformer Pakets. In den Beispielen: E-Mail-Adresse und XML, wird demonstriert, wie vorhandene Syntax-Spezifikationen in TextTransformer-Programme überführt werden können.

Falls keine Syntax-Beschreibung existiert, muss sie selbst entwickelt werden. Hierfür gibt es Regeln und Erfahrungssätze, die als Leitfaden dienen können.

 

 

1. Setzen sie die erforderlichen Projekt-Optionen!

 

Z.B. ist es sehr wichtig, gleich zu Anfang der Entwicklung eines neuen Projekts die Zeichen auszuwählen, die für das Parsen der Texte keine Bedeutung haben. Standardmäßig sind u.a. die Zeilenumbruchszeichen als aus zulassende Zeichen gesetzt. Soll aber ein Parser entwickelt werden, der Zeilenenden erkennt, so muss diese Einstellung geändert werden.

Eine andere wichtige Entscheidung ist, ob alle literalen Token getestet werden sollen oder nicht. Faustregel:  Alle Literale sollten getestet werden, falls eine formalisierte Sprachen mit definierten Schlüsselworten, die an ausgezeichneten Positionen stehen, geparst werden soll.  Andernfalls sollten nur die erwarteten Literale getestet werden. Nötigenfalls können auch die lokalen Optionen jeweils angepasst werden.

 

 

2. Konstruieren sie zunächst den Parser ohne semantische Aktionen!

 

Bei der Konstruktion des Parsers wird es immer wieder nötig oder angebracht sein Produktionen um zustellen und komplexe Produktionen durch Definition von Unter-Produktionen übersichtlicher zu machen. Wenn der Parser schon semantischen Code enthielte, müsste dieser bei jeder dieser Änderungen neu angepasst werden.

 

 

3. Entwickeln sie von "oben" nach "unten"!

 

Beginnen sie mit der allgemeinsten Produktion - die Startregel, die den gesamten Text erkennen soll - und zerlegen sie die Startregel dann zunächst in Unter-Produktionen, die Hauptbestandteile des Textes erkennen sollen. Nach dem gleichen Prinzip werden dann die Unterproduktionen weiter verfeinert. Soll z.B. ein Buch geparst werden, so würde die Startregel zunächst lauten:

 

Buch ::= SKIP  // damit wird der gesamte Text erfasst

 

Nach der ersten Verfeinerung:

 

Buch ::= SKIP? Kapitel+

 

Kapitel ::= TITEL SKIP

 

TITEL steht hier für einen regulären Ausdruck, der eine Kapitelüberschrift eindeutig von anderen Textbestandteilen abhebt.

Anmerkung: Ein solcher Ausdruck existiert gewiss nicht für alle Bücher. Das Buch wird hier als Beispiel für eine Textstruktur verwendet, die jeder kennt. Der Buch-Parser funktioniert nur für syntaktisch ideale Bücher. (Z.B. TITLE ::= \d\.[^\r\n]+  // falls der Text dieser Seite als "Buch" genommen wird.)

 

Nun kann die Chapter-Produktion weiter verfeinert werden:

 

Kapitel ::= TITEL Absatz+

 

Absatz ::= EOL+ SKIP

 

EOL ::= \r?\n  // Zeilenende

 

Der Vorteil dieser Vorgehensweise von "oben" nach "unten" ist, dass in jedem Stadium der Entwicklung der aktuelle Parser an allen "Büchern" getestet werden kann. Eventuelle Fehler können so schon in einem frühen Entwicklungsstadium entdeckt werden.

 

Hinweis: Mit dem Transformations-Manager können viele Beispiele in einem Rutsch getestet werden. Schlägt ein solcher Test fehl, kann der entsprechende Text mit einem Klick in der IDE geöffnet werden.

 

 

4. Wählen sie die Art der Transformation

 

Im Prinzip gibt es drei Weisen, wie der Parser zu einem vollständigen Konvertierungsprogramm ergänzt werden kann. Sie unterscheiden sich darin, was jeweils mit den erkannten Textabschnitten getan wird.

 

a) Textabschnitte werden unmittelbar bearbeitet und in die Ausgabe geschrieben.

 

b) die Textabschnitte werden in Variablen geschrieben, die als (Referenz-)Parameter an andere Produktionen zurück- oder weitergegeben werden und dort ausgewertet und kombiniert werden können.

 

c) es wird ein Parse-Baum erzeugt und die Verarbeitung der Textabschnitte erfolgt erst nachdem der gesamte Text geparst wurde.

 

Die letzte Methode ist die variabelste ist, da im Prinzip noch auf sämtliche Textabschnitte zugegriffen werden kann, und da mit dem Parse-Baum je nach Funktionstabelle verschiedene Ausgaben erzeugt werden können.  Soll ein Übersetzer entwickelt werden, der ein Eingabeformat in mehrere Ausgabeformate konvertieren soll, so ist die Verwendung eines Parse-Baums nahezu unverzichtbar. Die Entwicklung eines solchen Übersetzers ist jedoch ungleich schwieriger, als die direkte Verarbeitung des Quelltextes mit einer der beiden anderen Methoden.

 

Ist die Reihenfolge in der die bearbeiteten Textabschnitte ausgegeben werden sollen in etwa mit der Folge identisch, in der sie erkannt wurden, dann ist die erste Methode der direkten Textausgabe zu empfehlen. Müssen die erkannten Textteile neu angeordnet werden oder hängt die Bearbeitung eines Teils von einem Text ab, der erst später ermittelt wird, so ist die zweite Methode zu empfehlen.

 

Wenn über die Art der Transformation entschieden wurde, können verschiedene Assistenten helfen, Parameter, Variablen-Deklarationen oder Baumknoten in Produktionen einzusetzen.

 

 

5. Erstellen sie ein Kopierprogramm, bevor sie den endgültigen Code für die Transformation schreiben!

 

Diese Regel gilt nur für Projekte, bei denen der Quelltext an einigen ausgezeichneten Stellen modifiziert werden soll. Indem zunächst ein Programm erstellt wird, dass den Quelltext lediglich kopiert, kann durch Vergleich mit dem Zieltext leicht ermittelt werden, ob die Ausgabe vollständig ist.

 

Wie beginnt man praktisch



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English