Semantische Analyse einer Echtzeitprogrammiersprache mittels Verhaltensmustern Semantische Analyse einer Echtzeitprogrammiersprache mittels Verhaltensmustern xxx FernUniversität in Hagen Fakultät für Mathematik und Informatik Lehrgebiet Kommunikationsnetze Bachelor-Studiengang Informatik Erstgutachter:Prof. Dr.-Ing. habil. Herwig Unger Betreuer:Dipl.-Inf. Marcel Schaible
Inhalt Ausgangssituation Ausgangssituation Überblick Problemstellung Lösungsansatz Praktische Umsetzung Praktische Umsetzung Definieren von Symbolen Auflösen von Symbolen Semantische Prüfung Ergebnisse & Ziele Ergebnisse & Ziele
Ausgangssituation
Überblick Entwicklung eines Übersetzers für die Echtzeitprogrammiersprache PEARL 90 PEARL 90 Quelltexte sollen in einem ersten Schritt in semantisch äquivalente C++ Quelltexte übersetzt werden C++ Quelltexte sollen in einem zweiten Schritt in ausführbare Programme übersetzt werden
Problemstellung Fehler, die bei der Übersetzung der C++ Quelltexte entstehen, sind nur mit erheblichem Aufwand auf die ursprünglichen Stellen in den PEARL 90 Quelltexten zurückzuführen
Lösungsansatz Erweiterung der semantischen Analyse, um durch Angabe entsprechender Fehlermeldungen die Übersetzung in semantisch äquivalente C++ Quelltexte zu verbessern
Praktische Umsetzung
Definieren von Symbolen Vorbereitender Schritt für die semantischen Prüfungen → Definieren von Symbolen Parserbaum wird durchlaufen und nach charakteristischen Sprachmerkmalen durchsucht (Bsp. Deklarationen) Schlüsseleigenschaften für ein Symbol: Name bzw. Bezeichner Kategorie bzw. Art des Symbols (Variable, Prozedur, etc.) Typ bzw. Datentyp (CHAR, FIXED, etc.) Gültigkeitsbereich Symbol wird als Objekt einer Klasse in Symboltabelle gespeichert NameGenauigkeitPositionGültigkeitsbereichGlobal a31Zeile / Zeichen- position z.B. Modul- oder Taskname false Beispiel: DCL a FIXED (31); Objekt der Klasse FixedVariableDef.java
Auflösen von Symbolen Für jeden Gültigkeitsbereich (Modul, Task,…) wird eine eigene Symboltabelle angelegt Die Symboltabellen werden in einem Stapelspeicher (engl. Stack) abgelegt 01 MODULE (mod1); 02 PROBLEM 03 DCL a FIXED(31); TASK (t1); 06 DCL a FIXED(24); 07 END; 08 MODEND; Modul mod1 Symbole: [a, t1] t1 Symbole: [a] Für die semantischen Prüfungen wird der Stapelspeicher zunächst bis auf das erste Modul des Quelltextes geleert Tabellen werden wieder auf den Stapelspeicher gelegt, wenn der entsprechende Knoten bzw. Gültigkeitsbereich im Parserbaum erreicht wird Prinzip der engsten Verschachtelung
Semantische Analyse Symbole in Symbolliste eintragen ggf. Operatoren in Operatorenliste eintragen Symbol an Indexposition 0 in Symboltabelle suchen Prüfen, ob Symbol eine Konstante ist Datentypen der Symbole ermitteln, prüfen ob zuweisungskompatibel Genauigkeit / Länge prüfen weiter Fehlermeldung (arithmetischen) Ausdruck auflösen Fehlermeldung Prüfen, ob Opertorenliste leer ist Symbol an Indexposition 1 in Symboltabelle suchen oder temporäres Symbol Fehlermeldung Beispiel: a = b Symbolliste: Index01 Symbolab
Semantische Analyse Index012 Symbolabc Symbolliste: Beispiel: a = b + c Index0 Operator+ Operatorenliste: SyntaxTyp von aTyp von bTyp des Ergebnisses a + bFIXED(g1)FIXED(g2)FIXED(g3) FIXED(g1)FLOAT(g2)FLOAT(g3) FLOAT(g1)FIXED(g2)FLOAT(g3) FLOAT(g1)FLOAT(g2)FLOAT(g3) DURATIONDURATIONDURATION DURATIONCLOCKCLOCK CLOCKDURATIONCLOCK g3 = max (g1, g2) = 1 → b = 2 → c
Semantische Analyse Prüfung eines Ausdrucks erfolgt nach den allgemeinen arithmetischen Regeln Den Operatoren ist ein Rang und eine Auswertungsreihenfolge zugewiesen Alle monadischen Standard Operatoren haben den Rang 1, Auswertungsreihenfolge: von rechts nach links Rangordnung: Rangdyadische OperatorenAuswertungsreihenfolge 1**, FITvon rechts nach links 2*, /, ><, REMvon links nach rechts 3+, -, <>, SHIFTvon links nach rechts 4, =von links nach rechts 5==, /=von links nach rechts 6ANDvon links nach rechts 7OR, EXORvon links nach rechts
Semantische Analyse SyntaxTyp von aTyp von bTyp des Ergebnisses a + bDURATIONCLOCKCLOCK SyntaxTyp von aTyp von bTyp des Ergebnisses a * bDURATIONFIXEDDURATION CLOCK = DURATION * FIXED + CLOCK ungültig! Auflösen entsprechend der arithmetischen Regeln: CLOCK = DURATION * FIXED + CLOCK =DURATION =CLOCK gültig! → CLOCK = CLOCKgültig! gültig!
Semantische Analyse Beispiel: a = (b + c) * d Symbolliste: Index0123 Symbolabcd Operatorenliste: Index0123 Operator(+)* 1. Berechnung: b + c Anzahl der öffnenden Klammern, die vor dem Operator der Addition stehen, von dessen Index subtrahieren Symbole ermitteln, auf denen die Addition angewendet werden soll Symbole durch Zwischenergebnis (= temporäres Symbol) ersetzen temporäres Symbol besitzt als Attribut den resultierenden Datentyp und ggf. Genauigkeit oder Länge Operator und Klammernpaar aus Operatorenliste entfernen
Semantische Analyse Beispiel: a = temporäres Symbol * d Symbolliste: Index012 Symbolatemporäres Symbold Operatorenliste: Index0 Operator* 2. Berechnung: temporäres Symbol * d wenn gültige Kombination von Datentypen, dann wird Ergebnis wiederum in Form eines temporären Symbols gespeichert und ersetzt die Operanden Operator wird aus Operatorenliste entfernt damit ist im letzten Schritt eine einfache Zuweisung zu prüfen: a = temporäres Symbol
Semantische Analyse Symbol an Indexposition 0 in Symboltabelle suchen Prüfen, ob Symbol eine Konstante ist Datentypen der Symbole ermitteln, prüfen ob zuweisungskompatibel Genauigkeit / Länge prüfen weiter Fehlermeldung (arithmetischen) Ausdruck auflösen Fehlermeldung Beispiel: a = temporäres Symbol Symbolliste: Index01 Symbolatemporäres Symbol Prüfen, ob Opertorenliste leer ist Symbol an Indexposition 1 in Symboltabelle suchen oder temporäres Symbol Fehlermeldung Symbole in Symbolliste eintragen ggf. Operatoren in Operatorenliste eintragen
Ergebnisse
Verwendung von Listen (ArrayList): Einfache und bekannte Datenstruktur Durchlaufen des Parserbaumes und semantische Prüfung als Teilaufgaben behandeln Erweiterbarkeit des Quellcodes: Modulares Konzept Zwei Schlüssel-Klassen, als Schnittstellen für semantische Analyse Wartbarkeit des Quellcodes: Modulares Konzept Listen sind grundlegende Datenstrukturen Nachteil: Algorithmus zur Auflösung komplexer arithmetischer Ausdrücke wird durch Verwendung von Listen kompliziert Redundanz, um Lesbarkeit zu erreichen Ergebnisse & Ziele.
Anhang
SemanticCheckVisitor SemanticCheckValidator SemanticMonadic- ExpressionCheck SemanticDyadic- ExpressionCheck SemanticConversion- Check SemanticCheckFixedSemanticCheckFloat … SemanticPrecisionCheck SemanticErrorMessages Anhang: Ausschnitt des modularen Konzeptes
Anhang: Semantische Analyse Funktions-Prozedur 01 Prozedurname: PROCEDURE RETURNS (FIXED); 02 !Prozedurkörper 03 RETURN (Rückgabewert); 04 END; a = Prozedurname; Unterprogramm-Prozedur 01 Prozedurname: PROCEDURE(Parameter_1, Parameter_2); 02 !Prozedurkörper 03 END; CALL Prozedurname (Übergabe_Param_1, Übergabe_Param_2);
Anhang: Semantische Analyse 01 MODULE (name_1); 02 PROBLEM 03 DCL a FIXED GLOBAL; 04 MODEND; 01 MODULE (name_2); 02 PROBLEM 03 SPC a FIXED GLOBAL (name_1); 04 MODEND; Modul 1 Modul 2 SPECIFY: Bezug innerhalb eines Moduls 01 DCL Bezeichner_1 FIXED; 02 SPC Bezeichner_2 FIXED IDENT (Bezeichner_1); SPECIFY: Bezug zwischen zwei Modulen Initialisierung 01 DCL Bezeichner FIXED INIT(Wert);
Vielen Dank für Ihre Aufmerksamkeit