next up previous contents index
Nächste Seite: 7.5.1 Constraints Aufwärts: 7. Realisierung und Anbindung Vorherige Seite: 7.4 Der Constraint-Manager   Inhalt   Index

7.5 Repräsentation von Constraint-Ausdrücken

Wie bereits in der Einleitung erwähnt, wird die stringbasierte Constraint-Schnittstelle von YACS über eine Kombination von JLex und dem Java-CUP-Parsergenerator erreicht. Mit JLex wird eine lexikalische Analyse auf den übergebenen Strings durchgeführt (vgl. Berk, 2000). Darauf aufbauend können anschließend durch Java CUP anhand einer definierten Parser-Grammatik syntaktisch korrekte Ausdrücke in eine Objektstruktur überführt werden (vgl. Hudson, 1999).

JLex und Java CUP orientieren sich an den klassischen Werkzeugen Lex und Yacc (vgl. Lesk und Schmidt, 1975; Johnson, 1975) bzw. den freien Alternativen Flex und Bison (vgl. Donnelly und Stallman, 2002; Paxson, 1995) zur Parsergenerierung: Während einer vorgeschalteten lexikalischen Analyse erfolgt durch einen ,,Scanner`` (auch ,,Lexer`` genannt) auf Basis von regulären Ausdrücken die Zerlegung einer Eingabe in eine Folge von logisch zusammengehöriger Einheiten, in sogenannte ,,Token``7.9. Der nachfolgende Parser nutzt die vom Scanner erkannten Token als ,,Terminalsymbole``7.10 zur synaktischen Analyse anhand einer Parser-Grammatik in Backus-Naur-Form (BNF). Mit diesen, aus dem Compilerbau stammenden Werkzeugen, ist die Verarbeitung kontextfreier Grammatiken, z.B. für Programmiersprachen, möglich (vgl. Herold, 1999, S. 277 ff.). Mit den Java-Pendants JLex/Java CUP lässt sich entsprechend auf einfache Weise ein Parser für die in diesem Fall benötigten algebraischen Ausdrücke realisieren.

Der Constraint-Parser von YACS ist derzeit in der Lage, einfache algebraische Gleichungen und Ungleichungen zu interpretieren. Neben der Eingabedatei für den Scanner JLex ist eine CUP-Parser-Grammatik notwendig, welche beide in Anhang D ff. dokumentiert sind. Neben einzelnen Constraint-Ausdrücken ist der Parser entsprechend der spezifizierten Grammatik in der Lage, Aneinanderreihungen von primitiven Constraints zu interpretieren. Diese Möglichkeit, mehrere Constraints gleichzeitig zu einem Constraint-Problem hinzuzufügen, wurde aus Effizienzgründen vorgesehen. Falls die Anwendung kein inkrementell anwachsendes Constraint-Netz aufweist oder während eines Konfigurierungsschrittes mehrere neue Constraints vorliegen, können auf diesem Weg ganze Teilprobleme auf einmal geparst und zu einem Constraint-Netz hinzugefügt werden. Dies bedeutet weniger Overhead durch YACS, wie er beim Einfügen von einzelnen Constraints entstehen würde.

Eine Besonderheit ist die Fähigkeit des Parsers, für Variablen mit gleichem Namen ein und dasselbe Objekt zu verwenden. In Zeile 16 der Parser-Grammatik in Anhang D wird dafür eine HashMap instantiiert, die dazu dient, einmal erzeugte Variablen ggf. ,,wiederzufinden`` und dieselbe Objektreferenz erneut zu verwenden (Zeile 115-123). Um auch Objektreferenzen von Variablen verfügbar zu haben, die von einer anderen, vorhergehenden Parser-Instanz generiert wurden (die Constraint-Netze von YACS können inkrementell erzeugt werden), bietet der Parser die Möglichkeit, zwischen Instantiierung und Parsen eine HashMap zu übergeben (Methode addVariablesMap(), Zeile 35-37), mit welcher der eigentliche Parser zur Laufzeit rechtzeitig initialisiert wird (Zeile 54).

Auf diesem Weg wird ein globaler Namensraum bzw. eine globale Sicht innerhalb von YACS erreicht. Jede Variable ist unter ihrem eindeutigen Namen innerhalb eines jeden Constraint-Netzes ein und dasselbe Objekt. Die Wertebereichseinschränkung durch den Lösungsalgorithmus einer Strategie hat daher ggf. automatisch weitere Wertebereichseinschränkungen auch in anderen Strategien zur Folge, wenn dieselbe Variable in den jeweiligen Constraint-Netzen involviert ist, und dort eine Propagation der Wertebereiche initiiert wird.

Nachfolgend werden in diesem Abschnitt die Komponenten aufgezeigt, aus denen die vom Parser generierten Constraint-Ausdrücke bestehen. Sofern es sich um konkrete Ausprägungen handelt, sind sie Teil des Domänen-Layers von YACS. Abstrakte Klassen können entsprechend dem Framework-Layer zugeordnet werden (vgl. Abschnitt 6.5).



Fußnoten

...7.9
,,Token``, von engl. tokens: Zeichen, Kürzel, Marken
...7.10
Atomare Symbole, die nicht weiter zerlegt werden können. Terminalsymbole kommen entsprechend nicht auf der linken Seite einer Regel innerhalb einer formalen Grammatik vor.


Unterabschnitte
next up previous contents index
Nächste Seite: 7.5.1 Constraints Aufwärts: 7. Realisierung und Anbindung Vorherige Seite: 7.4 Der Constraint-Manager   Inhalt   Index