Programmiersprachen II Integration verschiedener Datenstrukturen

Slides:



Advertisements
Ähnliche Präsentationen
8. Termin Teil B: Wiederholung Begriffe Baum
Advertisements

ALP II: Objektorientierte Programmierung Sommersemester 2006
Randomisierte Algorithmen Präfix Suche und Konsistentes Hashing
3. Operatoren und Ausdrücke
Der k-d-Baum Richard Göbel.
B-Bäume.
Kapitel 6: Klassifizierung von Sortiertechniken
7. Natürliche Binärbäume
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
10. Grundlagen imperativer Programmiersprachen
Synonyme: Stapel, Keller, LIFO-Liste usw.
Kapitel 4 Syntaktische Analyse: LR Parsing.
Parser generieren Yet Another Compiler – Compiler YACC.
Sortieren mit Binären Bäumen
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Dynamische Programmierung (2) Matrixkettenprodukt
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
WS Algorithmentheorie 08 – Dynamische Programmierung (2) Matrixkettenprodukt Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Algorithmen und Datenstrukturen
Informatik II – Kapitel 13
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung
Beispiele für Ausdrucksalgebren
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 bekannt: Einfache Variable Feld Vereinbarung Zuweisung Block while-Schleife Bedingte Anweisung (if) Typ.
Zusammenfassung Vorwoche
Semantische Fehler Seminar im Grundstudium WS2002/2003:
A. Zündorf, SE Group Reverse Engineering K2 1 Ziele Heute Compilerbau Nachlese Ausnutzung von Laufzeittypinformation.
Kapitel 2: Datenstrukturen
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Splay Trees Von Projdakov Benjamin.
2. Die rekursive Datenstruktur Baum 2
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Übung Datenbanksysteme II Index- strukturen
Einführung in die Programmiersprache C 4
Binäre Bäume Louis Moret und Reto Huber, 5. 11
Agenda für heute, 7. April, 2005 Bedingte ProgrammausführungBedingte Programmausführung Algorithmische Grundlagen Vergleichsoperatoren, Wahrheitswerte.
Übung 4.1 Strukturierte Datentypen
Programmieren in C Grundlagen C 2
PHP: Operatoren und Kontrollstrukturen
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Grundlagen C 2
Das Traveling Salesman Problem (TSP)
Analyse der Laufzeit von Algorithmen
Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung
Algorithmen und Datenstrukturen 1 SS 2002
Wann ist eine Funktion (über den natürlichen Zahlen) berechenbar?
Binärbäume.
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Fortsetzung Datenstrukturen Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Vorbesprechung Klausur Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Fortsetzung Datenstrukturen Balancierte Bäume 2 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler.
Programmiersprachen II Fortsetzung Datenstrukturen Balancierte Bäume 3 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Fortsetzung Datenstrukturen Balancierte Bäume 1 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Fortsetzung Datenstrukturen Einfache Bäume Übung 13 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
 Präsentation transkript:

Programmiersprachen II Integration verschiedener Datenstrukturen Übung 17 Prof. Dr. Reiner Güttler Fachbereich GIS HTW

Kapitel 3: Folge Datenstrukturen Ziel: Komplexe Übung als „Mini-Projekt“ mit Einsatz verschiedener bisher behandelter Datenstrukturen Besonderes Gewicht auf sauberem objektorientierten Ansatz „reales“ Projekt mit konkretem fachlichen Hintergrund (Compilerbau) Dabei weglassen von allen realen Details, die das Projekt „aufblähen“, ohne konzeptionell etwas zusätzliches beizutragen

Kapitel 3: Folge Datenstrukturen Hintergrund: Von den verschiedenen Modulen eines Compilers sind zwei ausgewählte Gegenstand des Projekts: Die sog. Symboltabellenverwaltung: Hierunter versteht man das Verwalten einer Datenstruktur, die in allen Compilerphasen die notwendigen Informationen zu einem im Programm vorkommenden Identifier bereitstellt Das Parsen von arithmetischen Ausdrücken mit Erzeugung von auswertbaren „Expression-Trees

Kapitel 3: Folge Datenstrukturen Symboltabellenverwaltung: Pro Identifier ein Eintrag mit den zugehörigen Informationen wie Der Identifier selbst Adresse Typ Geltungsbereich Wert ... Für unsere Aufgabe: nur Identifier und Wert

Kapitel 3: Folge Datenstrukturen Rahmenbedingung: dynamisch (für grössere und kleinere Quellprogramme) Strings als Schlüssel benötigte Operationen: insert() bei Deklaration find() bei Zugriffen Fazit: Hash-Tabelle ist eine sehr geeignete (und meistens auch gewählte) Datenstruktur

Kapitel 3: Folge Datenstrukturen Parsen: Gegeben: ein arithmetischer Ausdruck der Form (denzer*pick+pauly*(guettler-folz)) Zur Vereinfachung: Nur Identifier als Operanden (keine Konstanten) Nur +,- und *,/ (mit Prioritäten!) als Operatoren Klammerung beliebig (d.h. auch nicht notwendige Klammerung erlaubt) Ziel Arithmetischen Ausdruck analysieren Konstruktion eines auswertbaren expression-tree‘s, der die Semantik des Ausdrucks genau wiederspiegelt

Kapitel 3: Folge Datenstrukturen Ausdruck: denzer*pick+pauly*(guettler-folz) Zugehöriger expression-tree (konzeptionell): + * * denzer pick pauly - guettler folz

Kapitel 3: Folge Datenstrukturen Für unsere Aufgabe (vgl. Übung 14) guettler folz pauly denzer pick schmidt

Kapitel 3: Folge Datenstrukturen Auswertung: Wenn jedem Identifier in der Tabelle ein Wert zugeordnet ist, ist die Auswertung des Baums offensichtlich: Bei jedem Knoten wird auf die schon berechneten (oder bei Blättern: aus der Symboltabelle geholten) Werte der beiden Söhne die Knotenoperation angewendet. Das Ergebnis der Operation erhält der Knoten als Wert. Der Wert der Wurzel entspricht dem Wert des gesamten arithmetischen Ausdrucks.

Kapitel 3: Folge Datenstrukturen Parsen: Wir benötigen zwei stacks: Einen Operandenstack opndStack Einen Operatorstack optStack Verfahren an Tafel vorführen für: a+b+c a*b+c a+b*c a+b*(c-d) (a+b*(c-d)) ((a+b)*((c-d)))

Kapitel 3: Folge Datenstrukturen Regeln: lies den Eingabestring item für item und jeweils folgende Regeln an (pseudo-code) Eingabe-Item Operand opnd ( ) Aktion Kreiere opnd-Knoten, push Knotenpointer auf opndStack push ( auf optStack While optStack nonempty repeat das nachfolgende {pop opTop aus optstack if opTop == ( exit loop else kreiere opTop-Knoten mit rechter Sohn = pop von opndStack linker Sohn =pop von opndStack push opTop_knotenpointer auf opndStack}

Kapitel 3: Folge Datenstrukturen Operator opThis If optStack empty push opThis auf optStack else {while optStack nonempty repeat das nachfolgende {pop opTop aus optStack if opTop == ( push it auf optStack else if opTop < opThis push it else kreiere opTop-Knoten wie vorne push opTop_knotenpointer auf opndStack if opTop==( or opTop<opThis exit loop} push opThis}

Kapitel 3: Folge Datenstrukturen Eingabe leer while optStack nonempty repeat das nachfolgende {pop opTop aus optStack kreiere opTop-Knoten wie vorne push opTop_knotenpointer auf opndStack} Noch einzufügen: Endbedingungen Fehlerfälle und Fehlerbehandlung Empfehlung: einfach bis zum Ende parsen und danach die stacks überprüfen (was dürfen die im korrekten Fall noch enthalten??)

Kapitel 3: Folge Datenstrukturen Projektaufgabe Entwickeln sie eine Applikation zum Initialisieren einer Symboltabelle durch Deklarationen (Form siehe später): insert() der deklarierten Identifier Parsen eines arithmetischen Ausdrucks unter Verwendung der Identifier in der initialisierten Symboltabelle (Identifier nicht deklariert => Fehler) Generieren des zugehörigen expression-trees (inkl. Ausgabe) In einer Schleife Zuweisen von Werten an die Identifier Auswerten des Trees

Kapitel 3: Folge Datenstrukturen Dazu benötigen sie: Symboltabelle (Hash-Tabelle) expression-tree (binärer Baum, wie in Übung 14) Parsen (inkl. der benötigten stacks und der Erzeugung des expression-trees) Wertzuweisung Auswertung Jeweils inkl. Ausnahmenbehandlung: bzgl. Form und Vollständigkeit der Eingabe beim Parsen: zwei Typen von „Parse-Fehler“ unkorrekter arithmetischer Ausdruck Verwendung einer nicht deklarierten Variable

Kapitel 3: Folge Datenstrukturen Form der Eingabe: Deklaration: Nur die zu benutzenden Identifier, je einen pro Zeile Arithmetischer Ausdruck: Genau ein arithmetischer Ausdruck (Trennung durch Blanks optional) Wertzuweisung: in einer Schleife jeweils ein „Eingabepaket“ Je ein Integerwert pro Identifier, je einen pro Zeile

Kapitel 3: Folge Datenstrukturen Eingabebeispiel (korrekt): folz denzer guettler folz + denzer * guettler 73 22 5 7 2 1

Kapitel 3: Folge Datenstrukturen Ausgabe: Der expression tree, dabei Form wie in PS1 (Wurzel links) für jeden Operatorknoten der jeweilige Operator für jeden Operandenknoten der entsprechende Identifier aus der Symboltabelle Pro „Eingabepaket“ das Ergebnis der Auswertung

Kapitel 3: Folge Datenstrukturen guettler * denzer + folz 183 9

Kapitel 3: Folge Datenstrukturen Objektorientierung? u.a. auf Kapselung achten, z.B. Ein Auswechseln der Symboltabellenimplementierung z.B. durch Binärbaum (das machen manche Compiler!) darf keinen Einfluss auf die anderen Klassen haben. Ein Auswechseln des Parsealgorithmus z.B. durch einen „Kellerautomaten“ (das machen die meisten Compiler!) darf keinen Einfluss auf die anderen Klassen haben. saubere objektorientierte Lösung für folgendes: Jeder Knoten im exression-tree kann potentiell zwei verschiedene Typen von Söhnen haben. Der Operandenstack kann Einträge verschiedenen Typs haben.