Kapitel 5. Semantische Analyse. Semantische Analyse Sommersemester / 36

Ähnliche Dokumente
2.4.3 Polymorphie (Wiederholung von Alp2)

1 Polymorphie (Vielgestaltigkeit)

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung. Kapitel 12: Interfaces

5.6 Vererbung. Vererbung

Vererbung & Schnittstellen in C#

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Modul 122 VBA Scribt.docx

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Objektorientierte Programmierung

3 Objektorientierte Konzepte in Java

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Äquivalente Grammatiken / attributierte Grammatik

Dr. Monika Meiler. Inhalt

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

5.4 Klassen und Objekte

Informatik ist viel mehr als Delphi-Programmierung!

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Innere Klassen in Java

Eine zu Grunde liegende Typdefinition beschreibt eine Struktur, die alle erlaubten Instanzen dieses Typs gemeinsam haben.

Kapitel 12: Übersetzung objektorienter Konzepte

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Kapitel 6. Vererbung

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Kapitel 6. Vererbung

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

5. Tutorium zu Programmieren

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Fakultät Wirtschaftswissenschaft

3 Objektorientierte Konzepte in Java

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Vorkurs C++ Programmierung

PIWIN 1 Übung Blatt 5

Kapitel 6. Vererbung

Grundlagen der Informatik für Ingenieure I

Algorithmen und Datenstrukturen

Objektorientiertes Programmieren für Ingenieure

EINI I. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 10/11

Java Virtual Machine (JVM) Bytecode

VBA-Programmierung: Zusammenfassung

8 Zugriffstypen ( Zeiger )

Abschnitt 9: Schnittstellen: Interfaces

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Programmierkurs Java

Computeranwendung und Programmierung (CuP)

Klassenbeziehungen & Vererbung

5.5.8 Öffentliche und private Eigenschaften

Prinzipien Objektorientierter Programmierung

Repetitorium Informatik (Java)

Propädeutikum zur Programmierung

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmieren Tutorium

Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

Objektorientierte Programmierung

OO Softwareentwicklung

ARBEITSBLATT ZU FORMALEN SPRACHEN

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Klassendefinitionen verstehen

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Prozedurale Datenbank- Anwendungsprogrammierung

Binäre Bäume Darstellung und Traversierung

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Einfache Rechenstrukturen und Kontrollfluss II

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

Prinzipielle Ausführungsvarianten I

SOI Die Schweizer Informatikolympiade

Client-Server-Beziehungen

Inhalte der Vorlesung. 6. Syntaxgesteuerte Übersetzung. 6. Syntaxgesteuerte Übersetzung. Attributierter Syntaxbaum

Funktionale Programmierung

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Propädeutikum zur Programmierung

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Datenbanksysteme I Datenbankprogrammierung Felix Naumann

Frühjahr. Erste Staatsprüfung für ein Lehramt an öffentlichen Schulen. Prüfungsteilnehmer Prüfungstermin Einzelprüfungsnummer. - Prüfungsaufgaben -

Javakurs 2013 Objektorientierung

Binärbäume. Prof. Dr. E. Ehses,

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

J.5 Die Java Virtual Machine

Software Engineering Klassendiagramme Einführung

Propädeutikum. Dipl.-Inf. Frank Güttler

Datenbankanwendungsprogrammierung Crashkurs Java

C/C++ Programmierung

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Proseminar Funktionales Programmieren. Stephan Kreutzer

Kapitel Abbildung von UML-Modellen auf Code

368 4 Algorithmen und Datenstrukturen

Programmiersprachen 2. Überleitung. Paradigmen 1. Imperatives Programmieren. Konzepte. Paradigmen. Beispiel: Funktionen

Transkript:

Kapitel 5 Semantische Analyse Semantische Analyse Sommersemester 2012 1 / 36

Kapitel 5: Semantische Analyse 1 Eingliederung in den Übersetzer 2 Namensanalyse Allgemein Beispiele aus der Praxis Implementierung 3 Typanalyse und Operatoridentifikation Typanalyse Zusammenhänge Semantische Analyse Sommersemester 2012 2 / 36

Eingliederung in den Übersetzer Tokenstrom Parser AST Semantische Analyse attr. AST Transformation Fehlerbehandlung Stringtabelle Symboltabelle Semantische Analyse Sommersemester 2012 3 / 36

Semantische Analyse: Aufgaben Formal: statische Semantik berechnen: die in der Syntaxanalyse versäumten Aufgaben nachholen Konsistenzprüfung entsprechend Sprachdefinition Praktisch: Namensanalyse: Bedeutung der Bezeichner feststellen Typanalyse: Typen aller Ausdrücke bestimmen Operatoridentifikation: Bedeutung der Operatoren bestimmen Konsistenzprüfung sprachabhängige Sonderaufgaben Schwierigkeiten: Aufgaben ineinander verschränkt komplexe Datenstrukturen für Namensanalyse (Gültigkeitsbereichsdefinitionen) umfangreiche Suchaufgaben: Zeitaufwand? Semantische Analyse Sommersemester 2012 4 / 36

Kapitel 5: Semantische Analyse 1 Eingliederung in den Übersetzer 2 Namensanalyse Allgemein Beispiele aus der Praxis Implementierung 3 Typanalyse und Operatoridentifikation Typanalyse Zusammenhänge Semantische Analyse Sommersemester 2012 5 / 36

Namensanalyse Unterscheide: Bezeichnerdefinition (defining occurrence): Vereinbarung, Parameterspezifikation, Markendefinition, vordefiniert,... vordefiniert: definiert in einem das Gesamtprogramm umfassenden Block Bezeichneranwendung (applied occurrence): Benutzung als Variable, Konstante, Parameter, Verbund-/Objekt-/Modul-attribut (Feld), Prozedurname im Aufruf, Typ, Sprungziel,... Sonderfälle: Schlüsselwortparameter p(filename = "abc", condition =...) Schleifenmarken: m: loop... loop... exit m;... end;... end unvollständige Spezifikation von Feldern: a.c statt a.b.c (Cobol, PL/1), with-anweisung (Pascal, Modula) implizite Definition (Fortran 77, C) Zuordnung Anwendung Definition abhängig von Gültigkeitsbereichsregeln, syntaktischer Position: unterschiedliche Namensräume Semantische Analyse Sommersemester 2012 6 / 36

Pascal, Modula-2 Definitionen von a, t, t: type t =... var a : integer; procedure p; procedure q; begin a := true end; b: t ; a : Boolean; type t = record a: t ;... end; type t = ref t ;... begin ( p )... end; ( p ) Semantische Analyse Sommersemester 2012 7 / 36

Pascal, Modula-2 Definitionen von a, t, t: Häufigste Lösung: type t =... var a : integer; procedure p; procedure q; begin a := true end; b: t ; a : Boolean; type t = record a: t ;... end; type t = ref t ;... begin ( p )... end; ( p ) Semantische Analyse Sommersemester 2012 7 / 36

Pascal, Modula-2 Definitionen von a, t, t: Korrekte Lösung: type t =... var a : integer; procedure p; procedure q; begin a := true end; b: t ; a : Boolean; type t = record a: t ;... end; type t = ref t ;... begin ( p )... end; ( p ) Semantische Analyse Sommersemester 2012 7 / 36

Namensräume: Grobklassifikation 1 Globale Definitionen 2 Modul-/Klassen-/Objekt-/Verbund-Definitionen 3 Lokale Definitionen (lokale Variable, Parameter) entsprechend Blockschachtelung Konturmodell 4 Sonderfälle Klassifikation steuert Gebrauch des Attributs Umgebung (umg). Semantische Analyse Sommersemester 2012 8 / 36

Blockschachtelung: Grundschema 1 rule block deklarationen ; anweisungen. attribution anweisungen.umg := append(deklarationen.umg, block.umg) 2 rule deklarationen deklarationen ; deklaration. attribution deklarationen[1].umg := append(deklarationen[2].umg,deklaration.umg) 3 rule deklaration bezeichner : typ. attribution deklaration.umg := new Umg(bezeichner.symbol, typ.deftab,...) 4 rule anweisungen anweisungen ; anweisung. attribution anweisungen[2].umg := anweisungen[1].umg; anweisung.umg := anweisungen[1].umg 5 rule anweisung... Variable... attribution variable.deftab := anweisung.umg.search(variable.symbol) Eigenschaften von typ: siehe Beispiel-AGs in Kap. 4 Semantische Analyse Sommersemester 2012 9 / 36

Umgebungsattribut umg Ererbtes Attribut in Regeln 1, 4, 5 synthetisiertes Attribut in Regel 2 und 3 Behandlung von Bezeichneranwendungen, z.b. Initialisierungen, in Vereinbarungen? rule deklaration bezeichner : typ :=... variable Lösung: Unterscheide umg_ein - umg_aus Bezeichneranwendungen werden mit umg_ein identifiziert. umg_ein umfaßt alle Definitionen des Blocks und seiner Umgebung, oder nur die vorangehenden Definitionen, oder Mischungen aus beidem Semantische Analyse Sommersemester 2012 10 / 36

Blockschachtelung: nur vorangehende Vereinbarungen 1 rule block deklarationen begin anweisungen end. attribution anweisungen.umg := deklarationen.umg_aus; deklarationen.umg_ein := block.umg; 2 rule deklarationen deklarationen deklaration. attribution deklarationen[1].umg_aus := deklaration.umg_aus; deklarationen[2].umg_ein := deklarationen[1].umg_ein; deklaration.umg_ein := deklarationen[2].umg_aus; 3 rule deklaration bezeichner : typ := variable ;. attribution typ.deftab := deklaration.umg_ein.search(typ.symbol); variable.deftab := deklaration.umg_ein.search(variable.symbol); deklaration.umg_aus := append(new Umg(bezeichner.symbol,typ.deftab,...), deklaration.umg_ein); Schema ist LAG(1) und OAG Semantische Analyse Sommersemester 2012 11 / 36

Blockschachtelung: nur vorangehende Vereinbarungen Attribut durchschleifen umg_ein - umg_aus umg_ein ist ererbtes Attribut in Regeln 1 und 2 umg_aus ist synthetisiertes Attribut in Regeln 2 und 3 Gleiche Technik in Anweisungen, wenn dort Bezeichnerdefinitionen erlaubt, z.b. bei impliziten Vereinbarungen in Fortran. Semantische Analyse Sommersemester 2012 12 / 36

Blockschachtelung: Verwendung vor Vereinbarung Wenn alle Definitionen des Blocks und seiner Umgebung erlaubt sind (Verwendung vor Vereinbarung): Zweifacher Durchlauf: 1 Definitionen zusammenführen (synthetisieren) in umg_part. Kombination aller Definitionen an der Wurzel ergibt umg 2 Definitionen aus ererbtem umg verwenden Schema ist LAG(2) und OAG Semantische Analyse Sommersemester 2012 13 / 36

Zyklische Abhängigkeiten - Fehlerhafter Versuch rule block deklarationen ; anweisungen. attribution deklarationen.umg := append(deklarationen.umg_part, block.umg); anweisungen.umg := deklarationen.umg; rule deklarationen deklarationen deklaration. attribution deklarationen[1].umg_part := append(deklarationen[2].umg_part, deklaration.umg_part); deklarationen[2].umg := deklarationen[1].umg; deklaration.umg := deklarationen[1].umg; rule deklaration bezeichner : typ := expression ;. attribution deklaration.dekl := new Deklaration( bezeichner.symbol, deklaration.umg.search(typ.symbol), expression.expr); deklaration.umg_part := new Umg( (bezeichner.symbol, deklaration.dekl) ); expression.umg := deklaration.umg; rule expression bezeichner ;. attribution expression.expr := new Readvar(); expression.expr.vardekl := expression.umg.search(bezeichner.symbol); Semantische Analyse Sommersemester 2012 14 / 36

Zyklische Abhängigkeit - Beispiel an konkretem AST umg block umg deklarationen umg_part umg anweisungen umg deklarationen. umg_part umg dekl deklaration umg_part bezeichner symbol typ symbol umg expression expr bezeichner symbol Semantische Analyse Sommersemester 2012 15 / 36

Blockschachtelung: Verwendung vor Vereinbarung rule block deklarationen ; anweisungen. attribution deklarationen.umg := append(deklarationen.umg_part, block.umg); anweisungen.umg := deklarationen.umg; rule deklarationen deklarationen deklaration. attribution deklarationen[1].umg_part := append(deklarationen[2].umg_part, deklaration.umg_part); deklarationen[2].umg := deklarationen[1].umg; deklaration.umg := deklarationen[1].umg; rule deklaration bezeichner : typ := expression ;. attribution deklaration.dekl := new Deklaration(); deklaration.umg_part := new Umg( (bezeichner.symbol, deklaration.dekl) ); deklaration.dekl.typ := deklaration.umg.search(typ.symbol); deklaration.dekl.expr := expression.expr; expression.umg := deklaration.umg; rule expression bezeichner ;. attribution expression.expr := new Readvar(); expression.expr.vardekl := expression.umg.search(bezeichner.symbol); Semantische Analyse Sommersemester 2012 16 / 36

Reparierte AG umg Block umg deklarationen umg_part umg anweisungen umg deklarationen. umg_part umg dekl dekl.expr dekl.typ deklaration umg_part bezeichner symbol typ symbol umg expression expr bezeichner symbol Semantische Analyse Sommersemester 2012 17 / 36

Ergebnis der Namensanalyse ein Eintrag für jede Definition in der Symboltabelle Verweis auf diesen Eintrag für jede Anwendung Symboltabelle: die zentrale Datenbank des Übersetzers, unstrukturierte Menge von Definitionseinträgen, auch Bestandteil der Metadaten in.net-päckchen Semantische Analyse Sommersemester 2012 18 / 36

Implementierung der Namensanalyse Hauptaufgabe: Effiziente Implementierung von umg: Namenstabelle Suchen in der Umgebung vermeiden, Ziel O(1) Namenstabelle als zentrale Datenstruktur außerhalb des Strukturbaums speichern Aufbau unabhängig von Besuchssequenzen Bei Eintritt/Verlassen eines Namensraums ändert sich der gültige Teil der Tabelle Semantische Analyse Sommersemester 2012 19 / 36

Symboltabelle Ansatz: Tabelle besteht aus je einer Liste von Definitionen für jeden Bereich Bereich: lokaler Namensraum (Gültigkeitsbereich), globale Namen ausgeschlossen Für jede Bezeichneranwendung Keller von Verweisen auf zulässige Definitionen besitzt-relation: Anwendung besitzt potentielle Definitionen erste Definition im Keller ist die richtige von sprachabhängigen Ausnahmen abgesehen, z.b. bei mehreren Definitionen einer Prozedur p mit unterschiedlicher Parameterzahl/Signatur: die erste passende Definition Nach Analyseende ist Namenskeller wieder leer, er wird nur während der Analyse verwendet. Semantische Analyse Sommersemester 2012 20 / 36

Symboltabelle Bereichstabelle Bereich enthält Definitionen Bereichsliste Symbol Typ besitzt aktuelle Definition Def. im umgebenden Bereich... Bez. Namenskeller Bez-Einträge in Stringtabelle Semantische Analyse Sommersemester 2012 21 / 36

ADT Symboltabelle abstract class SymbolTable { private Range currentrange; } public Range newrange(); public void enterrange(range r); public void leaverange(); public Definition currentdefinition(symbol s); public Definition definitioninrange(symbol s, Range r); Semantische Analyse Sommersemester 2012 22 / 36

Verbundfelder in Pascal Zugriff auf Feld a: x.a oder with x do begin... a... end Verfahren für x.a: 1 (Verbund-)Typ t von x bestimmen 2 Namensraum t, alle Felder des Verbunds, öffnen 3 In diesem Namensraum (Umgebungsattribut) a suchen Namensräume sind also nicht nur Prozedurrümpfe und Blöcke, sondern auch Verbundtypen Bei Identifikation von x.a wird nur der Verbundtyp als Umgebung verwandt: keine Vererbung des äußeren Umgebungsattributs wie bei geschachtelten Blöcken qualifizierter Zugriff x.a auf Attribute in Modulen, Klassen, Objekten,... analog Semantische Analyse Sommersemester 2012 23 / 36

Benannte Gültigkeitsbereiche Klassen Grundidee: Am Klassennamen hängt komplette Symboltabelle Schachtelung der Symboltabelle über Klassennamen class Z { public int a; public int b; public int c; } int x; Z y; y.b = x; x y Z Z a b c Bei Analyse von y.f(a) wird unmittelbar hinter dem Punkt die Z-Tabelle verwendet, die über den Eintrag von y erreichbar ist. Für die Parameterliste a wird wieder der Symboltabellen-Stack (Blockschachtelung) verwendet. Semantische Analyse Sommersemester 2012 24 / 36

Zusammenfassung Namensanalyse Namensanalyse liefert für alle Bezeichneranwendungen einen Verweis deftab auf einen Eintrag in der Symboltabelle Der Verweis ist persistent: Attribut wird in der Transformationsphase noch benötigt Abhängigkeit der Namensanalyse von der Typanalyse: bei qualifizierten Namen x.a, with-anweisungen, usw. muss Typ des Qualifikators x bekannt sein bei Vererbung/Generizität in oo-sprachen müssen die zulässigen Attribute/Funktionen der Oberklassen bzw. der Typargumente bekannt sein bei Identifikation von Funktionen abhängig von der Signatur, z.b. bei überladenen Funktionen, müssen die Argumenttypen bekannt sein Hinweis: Operatoridentifikation ist signaturabhängige Namensanalyse von Funktionen! Semantische Analyse Sommersemester 2012 25 / 36

Kapitel 5: Semantische Analyse 1 Eingliederung in den Übersetzer 2 Namensanalyse Allgemein Beispiele aus der Praxis Implementierung 3 Typanalyse und Operatoridentifikation Typanalyse Zusammenhänge Semantische Analyse Sommersemester 2012 26 / 36

Typanalyse (1/2) Typ: Kennzeichnung von Objekten bezüglich zulässiger Wertemenge und zulässigen Operationen einschließlich impliziter Typanpassungen, z.b. int real, dereferenzieren, deprozedurieren (parameterlose Funktion Wert), vereinigen (Wert Vereinigungstyp) Aufgabe der Typanalyse: Typen aller Namen, Operanden, Ausdrucksergebnisse bestimmen notwendig für Namensanalyse und Operatoridentifikation notwendig zur Bestimmung von Typanpassungen notwendig für Konsistenzprüfung (Programmiersicherheit) Semantische Analyse Sommersemester 2012 27 / 36

Typanalyse (2/2) Unterscheide Sprachen: stark typisiert (statisch oder dynamisch, Pascal, Modula, Ada, Sather, Java, C#,..., fast immer mit Einschränkungen) schwach typisiert (C, C++,...) typfrei (Maschinensprachen,...: Operationen typisiert, Objekte nur durch Umfang und Ausrichtung im Speicher gekennzeichnet) bei funktionalen Sprachen Typanalyse durch Typinferenz! Semantische Analyse Sommersemester 2012 28 / 36

Typäquivalenz Unterscheide: Namensgleichheit: zwei Typen t, t sind gleich, wenn sie durch die gleiche Typdefinition definiert werden. Strukturgleichheit: Zwei Typen t, t sind gleich, wenn sie durch den gleichen Typkonstruktor mit den gleichen Argumenten (Bezeichner und Typ von Verbundfeldern, Anzahl und Typ der Indexgrenzen, Typ der Reihungselemente, usw.) erzeugt werden können Typen als Terme auffassen, Terme vergleichen Vorsicht: Typen können rekursiv sein, die Terme sind dann unendlich! Verfahren zur Überprüfung Strukturgleichheit in der Übung Semantische Analyse Sommersemester 2012 29 / 36

Typattribute bereits bekannt: a priori Typ: synthetisiertes Attribut vor a posteriori Typ: ererbtes Attribut nach dazwischen Typanpassung Typ von Namen, Objekten in Symboltabelle eingetragen wird mindestens zur Speicherzuteilung gebraucht ansonsten Typattribute nach Namensanalyse, Operatoridentifikation, Feststellung Typanpassung, Konsistenzprüfung überflüssig außer: bei dynamischer Typprüfung (und dynamischer Operatoridentifikation) bei Verwendung von Vereinigungs- und polymorphen Typen Semantische Analyse Sommersemester 2012 30 / 36

Wiederholung: Typanpassung - Beispiel AG rule Zuweisung Name := Ausdruck. attribution Name.umg := Zuweisung.umg; Ausdruck.umg := Zuweisung.umg; Name.nach := Name.vor; Ausdruck.nach := if Name.vor = int then int else float end; rule Ausdruck Name addop Name. attribution Name[1].umg := Ausdruck.umg; Name[2].umg := Ausdruck.umg; Ausdruck.vor := if anpassbar(name[1].vor, int) anpassbar(name[2].vor, int) then int else float end; addop.typ := Ausdruck.vor; Name[1].nach := Ausdruck.vor; Name[2].nach := Ausdruck.vor; condition anpassbar(ausdruck.vor, Ausdruck.nach); rule addop +. attribution addop.operation := if addop.typ = int then int_add else float_add end; rule Name Bezeichner. attribution Name.vor := definiert(bezeichner.symbol, Name.umg); condition anpassbar(name.vor, Name.nach); Semantische Analyse Sommersemester 2012 31 / 36

Zusammenspiel Typanalyse - Operatoridentifikation 1 a priori Typ der Operanden von op1 t op2 übernehmen 2 mögliche Definitionen von t feststellen (Menge) 3 Auswahl unter diesen Definitionen bzw. Fehlermeldung,wenn keine oder mehr als eine Definition zulässig (Operator identifizieren, liefert Operation), a priori Typ des Ergebnisses bestimmen 4 a posteriori Typen der Operanden op1, op2 berechnen 5 Typanpassung a priori a posteriori Typ bestimmen und als Attribut merken Beispiel: In a[e] durch Verwendung klar: a ist Reihung, e ist Ausdruck des Typs der Grenzen von a Semantische Analyse Sommersemester 2012 32 / 36

Typanalyse im Ausdrucksbaum Unterscheide 1 Operatoridentifikation hängt nur von den Operandentypen ab (alle anderen Sprachen) 2 Operatoridentifikation hängt auch vom verlangten Ergebnistyp ab (linke Seite einer Zuweisung, Ada) Fall 1 : Schritte 1-5 des Algorithmus von unten nach oben im Baum durchführen (bei Rückkehr aus Tiefensuche) formal LAG(2), da ererbtes Attribut zu spät berechnet Fall 2 : Doppelter Baumdurchlauf: zuerst von unten nach oben Schritte 1,2 durchführen (Mengen von a priori Typen berechnen) dann von oben nach unten Schritte 3-5 (a posteriori Typ und Operation bestimmen, beides muss eindeutig sein) unvermeidbar LAG(2) Semantische Analyse Sommersemester 2012 33 / 36

Bestimmen der a priori Typen t t.vor t t t.vor t.vor a b y z a.vor b.vor y.vor z.vor Semantische Analyse Sommersemester 2012 34 / 36

Bestimmen der a posteriori Typen t.nach t.nach t.nach a.nach b.nach y.nach z.nach Semantische Analyse Sommersemester 2012 35 / 36

Operatoridentifikation Operatoridentifikation ist signaturabhängige Namensanalyse für Funktionen a posteriori Typ der Operanden und damit die notwendigen Typanpassungen werden durch die Operatoridentifikation mit festgelegt Semantische Analyse Sommersemester 2012 36 / 36