Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
Einführung in die Informatik: Programmierung und Software-Entwicklung
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Gliederung 1. Grundlagen der Bottom-Up-Syntaxanalyse
WS Prof. Dr. Th. Ottmann Algorithmentheorie 09 - Suche in Texten KMP, BM.
CPCP Institute of Clinical Pharmacology AGAH Annual Meeting, 29. Februar 2004, Berlin, Praktischer Umgang mit den Genehmigungsanträgen gemäß 12. AMG Novelle.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Kapitel 4 Syntaktische Analyse: LR Parsing.
Scratch Der Einstieg in das Programmieren. Scatch: Entwicklungsumgebung Prof. Dr. Haftendorn, Leuphana Universität Lüneburg,
IMS Universität Stuttgart 1 Einführung in XML Hannah Kermes HS: Elektronische Wörterbücher Do,
Java: Objektorientierte Programmierung
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
WS Algorithmentheorie 02 - Polynomprodukt und Fast Fourier Transformation Prof. Dr. Th. Ottmann.
Dynamische Programmierung (2) Matrixkettenprodukt
WS Algorithmentheorie 08 – Dynamische Programmierung (2) Matrixkettenprodukt Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
© 2006 W. Oberschelp, G. Vossen Rechneraufbau & Rechnerstrukturen, Folie 2.1.
Grundkurs Theoretische Informatik, Folie 2.1 © 2006 G. Vossen,K.-U. Witt Grundkurs Theoretische Informatik Kapitel 2 Gottfried Vossen Kurt-Ulrich Witt.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
6 Folgen (Teil II - Datenstrukturen und Algorithmen)
Beispiele für Ausdrucksalgebren
Agenda Motivation Formale Sprachen Compiler Compilerentwicklung
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Semantische Fehler Seminar im Grundstudium WS2002/2003:
Betreuerin: Kathleen Jerchel
Schieferdeckarten Dach.ppt
Programmiersprachen II Integration verschiedener Datenstrukturen
1. 2 Schreibprojekt Zeitung 3 Überblick 1. Vorstellung ComputerLernWerkstatt 2. Schreibprojekt: Zeitung 2.1 Konzeption des Kurses 2.2 Projektverlauf.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Bild 1.1 Copyright © Alfred Mertins | Signaltheorie, 2. Auflage Vieweg+Teubner PLUS Zusatzmaterialien Vieweg+Teubner Verlag | Wiesbaden.
20:00.
Eignung von Grammatik-basiertem Layout für grafische Programmiersprachen Seminar Layout-Algorithmen für Graphen Institut für Informatik Christian-Albrechts.
Zusatzfolien zu B-Bäumen
SK / , , in Hochkössen und der Wildschönau flow Ski- und Snowboardschule Intersport Menzel.
Materialien zum Informatikunterricht (Pohlig-Häberle)
Leistungsbeschreibung Brückenplanung RVS RVS
Syntaxanalyse Bottom-Up und LR(0)
Der Test fängt mit dem nächsten Bild an!
NEU! 1 2. Wo kommt diese Art von Rezeptor im Körper vor?
Binäre Bäume Louis Moret und Reto Huber, 5. 11
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Vorlesung Mai 2000 Konstruktion des Voronoi-Diagramms II
PARTENARIAT ÉDUCATIF GRUNDTVIG PARTENARIAT ÉDUCATIF GRUNDTVIG REPERES KULTURELLER ZUSAMMENHALT UND AUSDEHNUNG DER IDEEN AUF EUROPÄISCHEM.
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Das IT - Informationssystem
Automaten, formale Sprachen und Berechenbarkeit II SoSe 2004 Prof. W. Brauer Teil 1: Wiederholung (Vor allem Folien von Priv.-Doz. Dr. Kindler vom WS 2001/02.
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Analyseprodukte numerischer Modelle
Pigmentierte Läsionen der Haut
Programmieren in C Grundlagen C 2
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Vortrag von Rechtsanwältin Verena Nedden, Fachanwältin für Steuerrecht zur Veranstaltung Wege zum bedingungslosen Grundeinkommen der Piratenpartei Rhein-Hessen.
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Grundlagen C 2
1 Mathematical Programming Nichtlineare Programmierung.
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Bildergalerie PRESEASON CAMP Juni 2014 Romanshorn Get ready for the Season!
Es war einmal ein Haus
Kompetenztraining Jura Martin Zwickel / Eva Julia Lohse / Matthias Schmid ISBN: © 2014 Walter de Gruyter GmbH, Berlin/Boston Abbildungsübersicht.
Das IT - Informationssystem
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Monatsbericht Ausgleichsenergiemarkt Gas – Oktober
Semantische Analyse und attributierte Grammatiken
 Präsentation transkript:

Syntaxgerichtete Übersetzung und Typüberprüfung Sommersemester 2009

Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung Syntaxgerichtete Definition Auswertungsreihenfolge für syntaxgerichtete Definition Verfahren zur syntaxgerichteten Übersetzung Implementierung von L-attributierter syntaxgerichteten Definition Typüberprüfung Dynamische und statische Überprüfung Typsysteme Regeln für die Typüberprüfung Fazit

Motivation und Einordnung Von der Quellsprache zur Zielmaschine Erledigt: Quellprogramm kann lexikalisch und syntaktisch analysiert werden, ein Ableitungsbaum kann erstellt werden Zu tun: Semantische Analyse und Erzeugung des Zielprogramms aus dem Ableitungsbaum Idee: Syntaxanalyse steuert semantische und andere Aktionen wie Codeerzeugung

Syntaxgerichtete Übersetzung Syntaxdefinition Syntaxgerichtete Definition Kontextfreie Grammatik Beschreibung der hierarchischen Struktur einer Programmiersprache if (Ausdruck) Anweisung else Anweisung stmt → if (expr) stmt else stmt Kontextfreie Grammatik Grammatiksymbole + Attributen Produktionen + Semantikregeln Produktion E → E1 + T Semantikregel E.code = E1.code|| T.code||‘+‘ Die Syntaxgerichtete Übersetzung beruht auf die Syntaxdefinition. Syntaxdefinition ist ein Kontextfreien Grammatik womit die Syntax einer Sprache festgelegt wird. Mit einer Grammatik wird die hierarchische Struktur der meisten Programmiersprachenkonstrukte auf natürlicher Weise beschrieben. In Java kann eine if else Anweisung beispielsweise wie folgt aussehen. Bei Verwendung der Variablen expr zur Angabe eines Ausdruckes und stmt zur Angabe einer Anweisung kann eine Strukturregel wie folgt aufgestellt werden. (Pfeil bedeutet, kann die form haben) Eine solche Regel wird als Produktion bezeichnet, wobei lexikalische Elemente (if oder Klammern) als Terminale bezeichnet werden und Variablen wie expr und stmt stellen Sequenzen von Terminalen dar und werden als Nichtterminale bezeichnet. Syntaxgerichtete Definition Um eine Syntaxgerichtete Übersetzung durchführen zu können, müssen wir den Sprachkonstrukt (Syntaxdefinition) Informationen zu ordnen. Dazu nehmen wir die Syntaxgerichtete Definition. Eine Syntaxgerichtete Definition ist kontextfreie Grammatik bei der Grammatiksymbole mit Attribute versehen werden und Produktionen mit Sematikregeln. Eine syntaxgerichtete Definition spezifiziert die Werte von Attributen durch Zuordnen semantischer Regeln zu den Grammatikproduktionen. Diese Produktion hat zwei Nichtterminale E und T. Der Index in E unterscheidet das Auftreten von E im Produktionsrumpf vom Auftreten von E als Kopf. Sowohl E als auch T haben ein Attribut code vom Typ string. Die semantische Regel gibt an, dass der String E.code durch die Verkettung von E1.code, T.code und dem Zeichen ‚+‘ gebildet wird. || steht für die stringverkettung.

Syntaxgerichtete Übersetzung Attribute in Grammatiken Synthetisierte Attribut Wert hängt nur vom Nachfolgeknoten ab Ererbtes Attribut Wert hängt von Vorgänger und Geschwistern ab

Syntaxgerichtete Übersetzung Syntaxgerichtete Definition eines einfachen Taschenrechner mit den Operatoren + und *. Sie wertet Ausdrücke aus, die durch ein Endekennzeichnen n abgeschlossen sind. In der syntaxgerichteten Definition hat jedes Nichtterminal ein einziges synthetisiertes Attribut namens val. Wir nehmen auch an, dass das Terminal ziffer ein synthetisiertes Attribut lexval hat, bei dem es sich um einen ganzzahligen Wert handelt, der von der lexikalischen Analyse zurückgegeben wird. Setz L.val = E.val, was dem nummerischen Wert des gesamten Ausdruckes entspricht Attribut val für den Kopf E al Summe der Werte bei E1 und T berechnet. Wert von val als für E als das Gleiche wie den Wert von val bei dem Kind von T definiert wie 2 Und 6 kopieren die Werte für kind 7. Gibt F.val den Wert einer Ziffer, also den numerischen Wert des Tokens ziffer, den die lexikalische Analyse zurückgibt. Syntaxgerichtete Definition eines einfachen Taschenrechners

Syntaxgerichtete Übersetzung Wir sehen hier einen kommentierten Parse-Baum für den Eingabestring 3*5+4. Ein Kommentierter Parse-Baum, ist ein Parse-Baum welche die Werte seiner Attribute zeigt. Es wird angenommen, dass die Werte von lexval von der lexikalischen Analyse geliefert werden. Jeder Knoten für ein Nichtterminal hat ein Attribut val, das in einer Botton up Reihenfolge berechnet wird, wobei wir die mit jedem Knoten verbundenen Ergebniswerten sehen. Kommentierter Parse-Baum für 3*5+4

Auswertungsreihenfolge für syntaxgerichtete Definitionen Abhängigkeitsgraph Informationsfluss zwischen den Attributinstanzen Kanten drücken die durch Semantikregeln auferlegten Einschränkungen aus Abhängigkeitsgraph Informationsfluss zwischen den Attributinstanzen Kanten drücken die durch Semantikregeln auferlegten Einschränkungen aus Abhängigkeitsgraphen sind ein nützliches Werkzeug zur Bestimmung einer Auswertungsreihenfolge für die Attributinstanzen eines gegebenen Parse-Baumes. Während ein kommentierter Parse-Baum die Werte von Attributen zeigt, hilft uns ein Abhängigkeitsgraph bei der Bestimmung, wie sich diese Werte berechnen lassen. Ein Abhängigkeitsgraph stellt den Informationsfluss zwischen den Attributinstanzen eines bestimmten Parse-Baumes dar. Eine Kante von einer Attributinstanz zu einer anderen bedeutet, dass der Wert der ersten benötigt wird, um den der zweiten zu berechnen. Kanten drücken die durch die semantischen Regeln auferlegten Einschränkungen aus. Grammatik (3*5) beginnt mit der Produktion 1. Hier generiert F die Ziffer 3, aber der Operator * wird von T‘ generiert. Der linke Operand 3 erscheint somit in einem anderen Unterbaum des Parse Baumes als *. Deshalb wird ein ererbtes Attribut verwendet, um den Operanden an den Operator zu übergeben. Die Knoten des Abhängigkeitsgraphen, die durch die Zahlen 1 bis 9 dargestellt werden, entsprechen den Attributen im kommentierten Parse Baum. Die Kanten von Knoten 1 zu 3 und von Knoten 2 zu 4 ergeben sich aus der semantischen Regel, die F.val durch digit.lexval definiert. Tatsächlich ist F.val gleich digit.lexval, aber die Kante stellt eine Abhängigkeit und keine Gleichheit dar. Die Knoten 5 und 6 stellen das ererbte Attribut T´.inh dar, das mit jedem Auftreten des Nichtterminals T´ verbunden ist.

Auswertungsreihenfolge für syntaxgerichtete Definitionen S-attributierte Definition Alle Attribute sind synthetisiert Abhängigkeitsgraph mit zirkulären Bezügen wird nicht zugelassen Auswertungsreihenfolge garantiert Auswertung durch Botton Up Reihenfolge postorder (N) { for (jedes Kind C von N von links aus) postorder (C); fasse Attribute von/mit N zusammen; }

Auswertungsreihenfolge für syntaxgerichtete Definitionen L-attributierte Definition Zwischen den mit der Produktion verbundenen Attritbuten verlaufen die Kanten im Abhängigkeitsgraphen nur von links nach rechts Attribute sind synthetisiert oder vererbt (eingeschränkt) Vererbte Attribute sind mit dem Regelkopf verbunden Auswertung durch eine Top Down Reihenfolge dfvisit (N) { for (jeden Nachfolger M von N von links nach rechts) werte ererbte Attribute aus; dfvisit (M); werte die synthetisierten Attribute von N aus; }

Anwendung der syntaxgerichtete Übersetzung Syntaxbaum Verdichteter Parse-Baum Jeder Knoten eines Syntaxbaums stellt ein Konstrukt dar Die Kinder des Knotens repräsentieren die sinnvollen Komponente des Konstrukts Zwischendarstellung

Syntaxgerichtete Übersetzungsschemata Ergänzende Notation zur syntaxgerichteten Definition Kontextfreie Grammatik mit Programmfragmenten die in die Produktionsrümpfe eingebettet sind Programmfragmente (semantische Aktionen) können an jeder Stelle eines Produktionsrumpfes erscheinen. Auswertungsreihenfolge der semantischen Regeln durch Position gegeben Aktionen werden mit {..} eingeschlossen Ergänzende Notation zur syntaxgerichteten Definition Kontextfreie Grammatik mit Programmfragmenten, die in die Produktionsrümpfe eingebettet sind Programmfragmente (semantische Aktionen) können an jeder Stelle eines Produktionsrumpfes erscheinen Auswertungsreihenfolge der semantischen Regeln durch Position gegeben Aktionen werden mit {..} eingeschlossen rest → + term {printf (‚+‘}; rest 1 Ein syntaxgerichtetes Übersetzungsverfahren ist eine Notation, bei der eine Übersetzung festgelegt wird, indem Programmfragmente den Produktionen in einer Grammatik hinzugefügt werden. Mit Ausnahme der Tatsache, dass die Auswertungsreihenfolge der semantischen Regeln ausdrücklich angegeben ist, gleichen Übersetzungsverfahren syntaxgerichteten Definitionen. Beim Zeichen eines Parse Baumes für ein Übersetzungsverfahren wird eine Aktion angezeigt, indem für die Aktion ein Extrakind erstellt und durch eine unterbrochene Linie mit dem Knoten verbunden wird, der dem Kopf der Produktion entspricht. Da knoten für eine semantische Aktion keine Kinder haben, wird die Aktion ausgeführt sobald der Knoten zum ersten mal gesehen wird. Verfahren zur syntaxgerichteten Übersetzung

Syntaxgerichtete Übersetzungsschemata Ausdrücke in Infix-Notation (9-5)+2 oder 9-(5+2) Ausdrücke in Postfix-Notation 9 5 – 5 + oder 9 5 2 + - Beispiel: Übersetzungsschemata Definition um Ausdrücke in Infix Notation in Postfix Notation zu transformieren.

Syntaxgerichtete Übersetzungsschemata ( 9 – 5) + 2

Syntaxgerichtete Übersetzungsschemata (9 – 5) + 2 Der Parse Baum hat print Anweisungen auf zusätzlichen Blättern die durch unterbrochene Linien mit innereren Knoten des Parse baums verbunden sind. Diese Ausdrücke werden von den im rumpf einer Produktion eingebettenen Aktionen in eine Postfixnotation übersetzt, vorausgesetzt, wir führen einen Depth first Durchlauf des Baumes von links nach rechts durch und führen jede print Anweisung beim Besuch ihres Blattes aus.

Syntaxgerichtete Übersetzungsschemata (9 – 5) + 2 9 9 5 9 5 – 9 5 – 2 9 5 – 2 + Der Parse Baum hat print Anweisungen auf zusätzlichen Blättern die durch unter

Implementierung von L-attributierten syntaxgerichteten Definitionen Übersetzung beim Durchlaufen eines Parse-Baumes Aufbauen und Kommentieren des Parse-Baumes Aufbauen des Parse-Baumes, Hinzufügen von Aktionen und Ausführen der Aktionen in Postorder Übersetzung während des Parserns Verwenden eines rekursiven absteigenden Parsers Generieren von Code im laufenden Betrieb Implementieren einer syntaxgerichteten Übersetzung zusammen mit einem LL-Parser Implementieren einer syntaxgerichteten Übersetzung zusammen mit einem LR-Parser Übersetzung beim Durchlaufen eines Parse-Baumes Aufbauen und Kommentieren des Parse-Baumes Aufbauen des Parse-Baumes, Hinzufügen von Aktionen und Ausführen der Aktionen in Postorder Übersetzung während des Parserns Verwenden eines rekursiven absteigenden Parsers Generieren von Code im laufenden Betrieb Implementieren einer syntaxgerichteten Übersetzung zusammen mit einem LL-Parser Implementieren einer syntaxgerichteten Übersetzung zusammen mit einem LR-Parser

Implementierung von L-attributierten syntaxgerichteten Definitionen L-attributierte syntaxgerichtete (LL-Grammatik) Aktionen in den Produktionen eingebettet Übersetzung während der LL-Syntaxanalyse Implementierung von L-attributierten syntaxgerichteten Definitionen L-attributierte syntaxgerichtete (LL-Grammatik) Aktionen in den Produktionen eingebettet Übersetzung während der LL-Syntaxanalyse Aktionsdatensatz: Enthält einen Zeiger auf ausführbaren Code (meist Auswertung von ererbten Attributen) Synthetisierungsdatensatz: Enthält Anweisungen zur Synthese von Attributen und Aktionen (kopieren der synthetisierten Attribute in andere Datensätze weiter unten im Stack) Wir können dann die Übersetzung während der LL Syntaxanalyse vornehmen, indem wir den Parserstack erweitern, um aktionen und bestimmte Datenelemente zu halten, die für die Auswertung der Attribute benötigt werden. Zusätzlich zu den Datensätze zur Darstellung von Terminalen und Nichtterminalen enthält der Parserstack Aktionsdatensätze, die die auszuführenden Aktionen darstellen, und Synthetisierungsdatensätze, um die synthetisierte Attribute für Nichtterminalen zu halten. L-attributierte syntaxgerichtete Definitionen und LL-Syntaxanalyse

Dynamische und statische Überprüfung Wir unterscheiden zwischen Statischen Überprüfung (während der Kompilierung) Dynamischen Überprüfung (zur Laufzeit) Statische Überprüfung Typüberprüfung Überprüfung der Kontrollflusses Überprüfung auf Eindeutigkeit Auf Namen bezogene Überprüfung Dynamische Überprüfung Dynamische Typüberprüfung ist erforderlich, wenn der Typ von Variablen und Objekten nur zur Laufzeit bestimmt werden kann Typüberprüfungen Ein Compiler sollte einen Fehler melden wenn einem integer ein string zugewiessenwerden soll. Überprüfungen der Kontrollflusses Es gibt Anweisungen wie z.B das break die den Kontrollfluss eines Konstrukteswie der while-for-Schleife oder switch-Anweisung verlassen ,ein Compiler sollte einen Fehler melden wenn eine solche umschließende Anweisung nicht existiert. Überprüfung auf Eindeutigkeit Sollte der Name einer Variable innerhalb des gleichen Anweisungsblockes definieren, so muss der Compiler eine Fehler melden. Auf Namen bezogene Überprüfung Es gibt gewisse Definitionen die auf bestimmte Namenskonventionen basierender Compiler muss das Überprüfen.

Typüberprüfung Was wird überprüft? Ob Operatoren und Operanden kompatibel sind Welche Programmelemente haben einen Typ? Konstanten Variablen Ausdrücke Parameter Welche Attribute werden durch Typen festgelegt? Werte von Konstanten Wertebereiche / Operationen für Variable, Ausdrücke, Parameter Übergabemechanismus für Parameter Verwendung von Informationen über Typen Ermittlung des Speicherbedarf Erzeugung von Code für die Umwandlung von einem Typ in einen anderen Ermittlung des Resultatttyps

Typüberprüfung - Beispiele x div y → x, y müssen vom Typ integer sein. array [INDEX] of …. → INDEX muss Ordnungstyp sein. procedure p(formal_1: Typ_1, var formal 2: Typ 2); …… p (aktuell_1, aktuell_2); aktuell_1 mit formal_1 verträglich? aktuell_2 mit formal_2 verträglich? aktuell_2 muss eine Variable sein.

Typsysteme Was ist ein Typsystem? Ein Typsystem für eine Programmiersprache ist eine Menge von Regeln, die die korrekte Verwendung von Typen im Kontext bestimmen. Für bestimmte Konstrukte muss der Typ gegeben sein (Definition) und für andere kann der Typ aus der Struktur bestimmt werden. Ein Typsystem heißt stark, wenn alle möglichen statischen Typkonflikte zur Übersetzungszeit erkannt werden können. Ein Typsystem besteht aus gewissen Basistypen (Typnamen) und Konstruktoren, mit denen neue Typen aus vorhandenen konstruiert werden können. Mit den Konstruktoren werden Typausdrücke gebildet

Typüberprüfung von Ausdrücke Defintion einiger Basistypen Der ausdruck, der durch die Anwendung der mod Operation auf zwei Teilausdrücke von Typ interger gebildet wird, hat den Typ interger. Bei einem Fehler kommt es zum Typ In einer Array-Referenz E1[E2] muss der Indexausdruck E2 den Typ integer haben. In dem Fall ist das Ergebnis der Elementtyp t, den man aus dem Typ array(s,t) des Ausdrucks E1 erhält.

Typüberprüfung von Anweisung Da Sprachkonstruktewie Anweisungen typischerweise keine Wertehaben, kann diesen der spezielle einfache Typ void zugewiesen werden. Sollte innerhalb eine Anweisung ein Fehler auftreten, so wird der Anweisung das Typ type_error zugewiesen.

Fazit Der allgemeine Ansatz für die syntaxgerichtete Übersetzung besteht darin, einen Parser- oder Syntaxbaum zu konstruieren und dann die Werte der Attribute an dem Knoten des Baumes zu berechnen, indem diese Knoten aufgesucht werden. Zwei Notationen möglich Syntaxgerichtete Definition. Sie verbergen viele Implementierungsdetails und befreien den Benutzer von der expliziten Spezifikation der Reihenfolge, in der die Übersetzung stattfindet Übersetzungsschemata legen die Reihenfolge fest, in der die semantischen Regeln auszuwerten sind, daher erlauben sie es, einige Implementierungsdetails zu zeigen.

Fazit

if <complex test> the 5 else <type error> Fazit Typüberprüfung Wichtig, um mögliche Programmfehler fest zu stellen Statische und dynamische Überprüfung if <complex test> the 5 else <type error> Dieser Code (einer gedachten Programmiersprache) ist typkorrekt, da er niemals zu einer problematischen Zuweisung führen kann. Dennoch würde eine statische Typprüfung die Zuweisung eines Strings an eine Integer-Variable normalerweise als Typfehler auffassen und zur Übersetzungszeit scheitern lassen. Es lässt sich leicht überlegen, dass in weniger zugespitzten Fällen Programmcode vom Typsystem zurückgewiesen wird, obwohl er nachweislich typkorrekt ist. Das Typsystem müsste eine erhebliche Komplexität erreichen, um das Laufzeitverhalten von Programmen bei den Typprüfungen zu berücksichtigen, was umgekehrt das Typsystem komplexer und schwerer handhabbar (und damit anfälliger für Fehlverwendungen durch den Programmierer) machen würde. Typsysteme sind daher immer Kompromisse zwischen möglichst strikten statischen Prüfungen und einer die Flexibilität und Ausdrucksstärke der Sprache bewahrenden dynamischen Prüfung.

Backup-Folien

Implementierung von L-attributierten syntaxgerichteten Definitionen Syntaxgerichtete Übersetzung für while-Anweisungen Implementierung von L-attributierten syntaxgerichteten Definitionen Syntaxgerichtete Übersetzung für while-Anweisungen Hier ist S das Nichtterminal, das alle Arten von Anweisungen generiert. C steht für einen bedingten Ausdruck ( einen booleschen Ausdruck, der als true oder false ausgewertet wird) das Ererbte Attribut s.next kennzeichnet den Anfang des Codes der ausgeführt werden muss, nachdem s fertig ist. S. Code ist die Folge von Zwieschencodeschritte, die eine Anweisung S implementiert und mit einem Sprung nach s.next enden. c.Code ist die Folge von Zwischencodeschritten, die die Bendigung c implementiert und entweder nach c.true oder nach c.false springe je ob true oder false. A Zeitpunkt an dem wir damit beginnen, die while Produktion zum expandieren von s zu verwenden. Der Datensatz oben auf den Stack ist für S und enthält nur das ererbte Attribut S.next, von dem wir annehmen das es den Wert x hat. Da wir jetzt ein Top Down Parsing vornehmen, zeigen wir das obere Ende des stacks auf der linken seite. B L-attributierte syntaxgerichtete Definitionen und LL-Syntaxanalyse

Backup-Folien Attribut Auswertung

Backup-Folien Attributierte LR – Grammatik für Ausdrücke (Infix → Postfix)

Backup-Folien Attributierte LL – Grammatik für Ausdrücke (Infix → Postfix)

Backup-Folien

Backup-Folien Typ-Ausdrücke

Backup-Folien Grafische Darstellung von Typausdrücke

Backup-Folien Syntaxgesteuerte Überprüfung von Typen

Backup-Folien Übersetzungsschema für Deklarationen

Backup-Folien Übersetzungsschema für Anweisungen

Backup-Folien Äquivalenz von Typen Grundtypen (interger, char, boolean,…) sind immer äquivalent Typkonstruktoren (array, x, pointer,..) Überprüfung der strukturellen Äquivalenz Äquivalenz von Typen

Backup – Folien Überprüfung der strukturellen Äquivalenz

Backup – Folien Namensäquivalenz

Backup – Folien Strukturäquivalenz

Backup-Folien Ererbte Attribute - Typdeklarationen

Backup-Folien

Backup-Folien Wie kommt man zu einen Übersetzungsschema