Compilerbau. Vorlesungsskript. Prof. Dr. Ursula Goltz Dr. Thomas Gehrke Dipl.-Inform. Malte Lochau. 11. Mai 2010

Größe: px
Ab Seite anzeigen:

Download "Compilerbau. Vorlesungsskript. Prof. Dr. Ursula Goltz Dr. Thomas Gehrke Dipl.-Inform. Malte Lochau. 11. Mai 2010"

Transkript

1 TECHNISCHE UNIVERSITÄT CAROLO-WILHELMINA ZU BRAUNSCHWEIG Vorlesungsskript Compilerbau Prof. Dr. Ursula Goltz Dr. Thomas Gehrke Dipl.-Inform. Malte Lochau 11. Mai 2010 Institut für Programmierung und Reaktive Systeme

2

3 Vorwort Das vorliegende Skript ist als Ausarbeitung der Compilerbau-Vorlesung entstanden, die ich seit dem Sommersemester 1992, zunächst an der Universität Hildesheim, seit 1998 an der Technischen Universität Braunschweig halte. Die erste Version der Vorlesung war stark durch die Compilerbau-Vorlesung Prof. Dr. Klaus Indermark, die ich in den 80 er Jahren an der RWTH Aachen als Mitarbeiterin betreuen durfte, beeinflusst. Sie basiert außerdem zu großen Teilen auf dem klassischen Drachenbuch [Aho08] von Aho et. al. Sehr hilfreich bei der Weiterentwicklung der Vorlesung war das zwischenzeitlich erschienene Buch von Reinhard Wilhelm und Dieter Maurer [WM96]. Darüber hinaus haben im Laufe der Jahre viele Beteiligte zur Ausarbeitung und Weiterentwicklung dieses Skripts beigetragen, denen ich an dieser Stelle danken möchte. Zunächst danke ich Dr. Michaela Huhn und Dr. Peter Niebert, die mich bei der Konzeption der Vorlesung in Hildesheim hervorragend unterstützt haben. Besonderer Dank gebührt meinen Mitautoren Dr. Thomas Gehrke und Malte Lochau, die dieses Skript mit hoher Selbstständigkeit bearbeitet haben. Dr. Werner Struckmann und Tilo Mücke haben durch Ergänzungen und hilfreiche Hinweise beigetragen. Jochen Kamischke hat uns als studentische Hilfskraft sehr gut unterstützt. Die Studierenden, die diese Vorlesung in den vergangenen Jahren gehört haben, haben durch ihre aktive Teilnahme ebenfalls zur Weiterentwicklung des Skripts beigetragen; auch Ihnen gebührt mein herzlicher Dank. Braunschweig, den 5. März 2009 Ursula Goltz i

4

5 Inhaltsverzeichnis Verzeichnis der Abbildungen Verzeichnis der Tabellen Listings v vii viii 1 Einführung Inhalte und Gliederung Höhere Programmiersprachen Implementierung von Programmiersprachen Interpreter Compiler Virtuelle Maschinen als Zielplattform Umgebung eines Compilers Aufbau eines Compilers Analyse Synthese Front-End, Back-End Läufe Lexikalische Analyse Terminologie Reguläre Sprachen und endliche Automaten Reguläre Sprachen Reguläre Ausdrücke Endliche Automaten Reguläre Definitionen Sieber Fehlerbehandlung Syntaktische Analyse Kontextfreie Grammatiken Kontextfreie Grammatiken Ableitungen Strukturbäume iii

6 Inhaltsverzeichnis Mehrdeutige Grammatiken Konstruktion von Parsern Kellerautomat Top-Down-Syntaxanalyse LL(k)-Grammatiken Transformierung von Grammatiken Erweiterte kontextfreie Grammatiken Fehlerbehandlung bei der Top-Down-Analyse Bottom-Up-Syntaxanalyse LR(k)-Grammatiken Fehlerbehandlung bei der Bottom-Up-Analyse Parser Generatoren Semantische Analyse Attributierte Grammatiken Typüberprüfung Typsysteme Gleichheit von Typausdrücken Typumwandlungen Zwischencode-Erzeugung Abstrakte Keller-Maschinen Syntaxbäume Zwischencode für die Keller-Maschine Befehle zur Steuerung des Kontrollflusses Drei-Adreß-Code Übersetzung von Syntaxbäumen in Drei-Adreß-Code Übersetzung in Drei-Adreß-Code unter Verwendung von attributierten Grammatiken Vergleich der beiden Arten von Zwischencode Literaturverzeichnis 158 iv

7 Verzeichnis der Abbildungen 1.1 Umgebung eines Compilers Phasen eines Compilers Übersetzung einer Zuweisung Parse-Baum der Zuweisung Interaktion zwischen Scanner und Parser Beispiel eines Übergangsgraphen Konstruktion eines NEA zu einem regulärem Ausdruck Beispiel einer NEA-Konstruktion Beispiel zur Potenzmengenkonstruktion DEA mit minimaler Zustandsmenge Beispiel zur Minimalisierung Übergangsgraphen für die Symbole des Beispiels Analyse eines Programmausschnitts Interaktion zwischen Scanner, Parser und restlichem Front-End Beispiel eines Strukturbaums Konstruktion eines Strukturbaums Verschiedene Strukturbäume zu einem Satz Mögliche Strukturbäume des dangling else -Problems Lösung des dangling else -Problems Schema eines Kellerautomaten Konstruktion des Strukturbaums anhand der Ausgabe des Parsers Fehlerhafte Konstruktion eines Strukturbaums für die Eingabe a Transformation in rechtsrekursive Grammatik Beispiel einer regulären Ableitung Übergangsgraphen für arithmetische Ausdrücke Übergangsgraphen für Pascal-Typen Beispiel eines recursive descent-parsers Aufrufgraph einer recursive descent-syntaxanalyse Erzeugung eines Strukturbaums für einen arithmetischen Ausdruck Beispiel eines charakteristischen endlichen Automaten Beispiel eines LR-DEA Struktur einer LR(1)-Parse-Tabelle v

8 Verzeichnis der Abbildungen 3.20 Zustandsmenge des LR-DEA der Grammatik zur Beschreibung der C-Zuweisung aus Beispiel Zustandsmenge des charakteristischen endlichen Automaten mit LR(1)- Items zur Grammatik aus Beispiel Charakteristischer endlicher LR(1)-Automat zur Grammatik aus Beispiel Zustandsmenge des charakteristischen endlichen Automaten mit SLR(1)- Items für die Grammatik aus Beispiel Zustandsmenge des charakteristischen endlichen Automaten mit LALR(1)- Items für die Grammatik aus Beispiel Charakteristischer endlicher LR(1)-Automat zur Grammatik aus Beispiel Beispiel eines attributierten Strukturbaums Synthetische und inherite Attribute Berechnung von Typinformationen im Strukturbaum Attributierter Strukturbaum zur Analyse einer Binärzahl Attributierter Strukturbaum zur Analyse einer Binärzahl mit inheritem Attribut Darstellung der direkten Abhängigkeiten zwischen Attributvorkommen Beispiel eines Abhängigkeitsgraphen Verklebter Abhängigkeitsgraph Semantische Regeln für Beispielsprache Attributierter Strukturbaum für ein Beispielprogramm Attributierter Strukturbaum für ein fehlerhaftes Beispielprogramm Funktion zur Überprüfung, ob zwei Typausdrücke identisch sind Attributierter Strukturbaum einer Zuweisung Attributierter Strukturbaum einer Zuweisung mit Attributabhängigkeiten Attributierter Strukturbaum einer Zuweisung mit Typfehler Einordnung der Zwischencode-Erzeugung Syntaxbaum Konstruktion eines Syntaxbaums aus Postfix-Notation Auswertung eines Postfix-Ausdrucks mit Hilfe eines Stacks Attributierter Strukturbaum mit Zwischencode Attributierter Strukturbaum einer verschachtelten if-anweisung Syntaxbaum mit temporären Namen Syntaxbaum mit Attributen für die Erzeugung von Drei-Adreß-Code. 156 vi

9 Verzeichnis der Tabellen 2.1 Beispiele für Symbole, Muster und Lexeme Übergangsrelation in Tabellenform Reguläre Ausdrücke und die dazugehörigen Symbole und Attributwerte Beispielableitung eines Top-Down-Parsers Beispiel einer Parse-Tabelle Parse-Tabelle für dangling-else-grammatik Für Fehlerbehandlung modifizierte Parse-Tabelle Beispiel einer Ableitung mit Fehlerbehandlung Beispielableitung eines Bottom-Up-Parsers vii

10 Listings NEA nach DEA DEA Minimalisierung Berechnung von FIRST 1 Mengen Berechnung von FOLLOW 1 Mengen Transformation einer linksrekursiven in eine rechtsrekursive Grammatik.. 60 Linksfaktorisierung Konstruktion der Parse Tabelle zu einer Grammatik Deterministische Top Down Analyse mit Parse Tabelle Konstruktion der FIRST und FOLLOW Mengen einer ELL(1) Grammatik 69 Beispiel eines recursive descent Parsers LR DEA Konstruktion Algorithmus LR(1) GEN Konstruktion der LR(1) action Tabelle LR(1) Parse Algorithmus Konstruktion der SLR(1) action Tabelle Ueberpruefung ob zwei Typausdruecke identisch sind viii

11 1 Einführung 1.1 Inhalte und Gliederung Die Techniken zur Konstruktion von Übersetzern (Compiler) als der altehrwürdigen Disziplin der Informatik sind unverändert allgegenwärtig. Wie kaum ein anderes Gebiet der Informatik werden beim Compilerbau Themen aus Theorie und Praxis miteinander verbunden. Auf der einen Seite bilden Automatentheorie und formale Sprachen das theoretische Fundament bei der Implementierung von Programmiersprachen. Zugleich gehören aber auch praktische Fragestellungen beim Entwurf und der Entwicklung von Programmiersprachen für konkrete Aufgabenstellungen zu diesem Beschäftigungsfeld. Schließlich muss sich der Compilerbauer auch mit den Ressourcen, Befehlssätzen etc. unterschiedlichster Rechnerarchitekturen möglicher Zielplattformen auseinander setzen. Auch bei aktuellen Themen und Problemstellungen der Informatik kommt man an Techniken des Compilerbaus nicht vorbei. Dazu zählen Themen wie virtuelle Maschinen, Parallelisierung, Speicherlokalität und Programmanalyse und -optimierung. Das vorliegende Skript ist in zwei Teile gegliedert. Der erste Teil befasst sich mit den Teilen des Compilers, die als Front-End bezeichnet werden. Dazu zählen alle Phasen des Übersetzungsvorgangs einer Eingabesprache, die unabhängig von der Zielsprache und Ausführungsplattform für übersetzte Programme erfolgen. Dazu zählen insbesondere die Analysephasen zur Überprüfung der Korrektheit des Eingabeprogrammes sowie die im Rahmen der einzelnen Übersetzungsschritte erzeugten Zwischendarstellungen des Eingabeprogrammes. Nach dem einführenden Kapitel, das die Grundbegriffe des Übersetzerbaus einführt, folgen aufeinander aufbauend die ausführliche Einführung der Konzepte der lexikalischen, syntaktischen und (statischen) semantischen Analyse. Die Vorgehensweise in den einzelnen Phasen wird jeweils durch Beispiele veranschaulicht, so zum Beispiel die Typüberprüfung im Rahmen der semantischen Analyse. Eine systematische Einführung in die theoretischen Grundlagen von Typsystemen erfolgt dann im zweiten Teil des Skripts. Als Abschluss des ersten Teils werden verschiedene Techniken der Zwischencode-Erzeugung beschrieben, die den vorbereitenden Schritt für die anschließende Code-Generierung durch das Back-End darstellen. Der zweite Teil des Skripts ist dem Back-End des Compilers gewidmet, also den Zielplattform-spezifischen Phasen, in denen die Synthese des Zielprogrammes aus dem Quellprogramm erfolgt. Der Schwerpunkt wird in diesem Teil auf der Überset-

12 1 Einführung zung objektorientierter Programmiersprachen liegen, deren statische und dynamische Eigenschaften im Detail untersucht werden. Als exemplarische Zielplattform werden abstrakte bzw. virtuelle Maschine betrachtet. Die theoretischen Grundlagen werden dann ausführlich an einer konkreten Programmiersprache, der objektorientierten Sprache Java, verdeutlicht. Den Abschluss bilden Optimierungstechniken für Übersetzer, wobei sowohl allgemeine Ansätze, als auch speziell objektorientierte Ansätze beschrieben werden. 1.2 Höhere Programmiersprachen In der Anfangszeit der Informatik wurde die Programmierung von Rechnern in der jeweiligen Maschinensprache des entsprechenden Rechners vorgenommen. Aufgrund der Rechnerorientierung dieser Sprachen war der Entwurf sowie die nachfolgende Anpassung und Änderung des Programmcodes äußerst aufwendig und mit hohen Kosten verbunden. Speicherzellen mußten direkt über ihre jeweiligen Adressen angesprochen werden. Wurden nachträglich Änderungen am Programm vorgenommen, mußten diese Adressen von Hand angepaßt werden. Eine erste Verbesserung wurde durch die Einführung der Assemblersprachen erzielt. Den Befehlen der Maschinensprache wurden kurze Buchstabenfolgen, sogenannte Mnemonics 1, zugeordnet, die die Lesbarkeit von Programmtexten erhöhen. Das Programm zur Generierung des zu einem Assemblertext gehörenden Maschinenprogramms, ebenfalls Assembler genannt, erlaubte eine rudimentäre Überprüfung des Programmtextes auf Fehler. Außerdem wurde durch die Möglichkeit zur Vergabe symbolischer Adressen (labels) die Pflege von Programmen erleichtert. Trotz der Überlegenheit der Assemblersprachen gegenüber den Maschinensprachen besitzt die Programmerstellung mittels Assembler eine Reihe bedeutender Nachteile. Durch die direkte Zuordnung von Mnemonics zu Maschinenbefehlen ist der Abstraktionsgrad von Programmen gering, so daß sich die Programmierung immer noch an der Maschine und nicht am konkreten Problem orientieren muß. Assemblerprogramme sind aufgrund ihres Mangels an Strukturelementen nur schwer verständlich, was eine erschwerte Wartbarkeit von Programmen zur Folge hat. Durch den Mangel an Datenstrukturen ist die Handhabung der Daten eines Programms aufwendig. Außerdem sind Assemblerprogramme nur auf einem Maschinentyp einsetzbar, so daß Portierungen von Programmen auf andere Maschinentypen mit anderer Maschinensprache i. allg. nicht möglich sind. Um die Nachteile der Assemblersprachen zu vermeiden und um eine problembezogene Programmierung zu unterstützen, wurden die höheren Programmiersprachen eingeführt. Diese Sprachen abstrahieren von den Eigenschaften der verwendeten Rechner. Kontrollstrukturen wie z.b. Schleifen und Rekursion erlauben eine Steuerung 1 Mnemonik ist die Kunst, das Gedächtnis durch Hilfsmittel zu unterstützen. 2

13 1.3 Implementierung von Programmiersprachen des Programmflusses ohne die Verwendung von Sprungbefehlen. Das Konzept der Variablen und der Datentypen entlastet den Programmierer von der aufwendigen Speicherverwaltung. Durch den Abstraktionsgrad wird zudem die Portierung von Programmen auf andere Rechnerarchitekturen erleichtert. 1.3 Implementierung von Programmiersprachen Um Programme einer höheren Programmiersprache auf einem Rechner ausführen zu können, muß diese Sprache auf diesem Rechner verfügbar gemacht (implementiert) werden. Die dazu existierenden Konzepte werden in zwei Klassen eingeteilt Interpreter EinInterpreterI L zureinerprogrammiersprachelisteinprogramm,dasalseingabe einprogrammp L dersprachelundeineeingabefolgeeerhältundeineausgabefolge a errechnet. Da bei der Interpretation von p L auch Fehler auftreten können, läßt sich die Funktionalität des Interpreters darstellen als I L : L D D {error}, wenn sowohl Eingabe- wie auch Ausgabedaten aus einem gemeinsamen Bereich D stammen. Die Ausführung des Programms p L mit Eingabefolge e und Ausgabefolge a ist durch die Gleichung I L (p L,e) = a beschrieben. Die Arbeitsweise eines Interpreters ist gekennzeichnet durch eine gleichzeitige Bearbeitung des Programms p L und der Eingabe e. Dies führt dazu, daß der Interpreter bei jeder, also auch bei wiederholter, Ausführung eines Programmkonstrukts zuvor das Konstrukt analysieren muß. Daher kann der Interpreter auch keine globalen Informationen, etwa zur Optimierung der Speicherverwaltung, über p L verwenden Compiler Um die aus der lokalen Sicht eines Interpreters auf das auszuführende Programm resultierenden Ineffizienzen zu vermeiden, werden beim Compiler die Verarbeitung des Programms und der Eingabe nacheinander durchgeführt. Zuerst wird das Programm p L ohne die Berücksichtigung von Eingabedaten analysiert und in eine andere Form überführt. Diese erlaubt die effizientere Ausführung des Programms mit beliebigen Eingabefolgen, ohne daß die Analyse und die Überführung des Programms wiederholt werden müssen. 3

14 1 Einführung Wir nennen unsere zu übersetzende Sprache L im folgenden Quellsprache. Die Übersetzung besteht in der Überführung eines Programms p L der Quellsprache in ein Programm p M, wobei M die Maschinen- oder die Assemblersprache eines konkreten oder abstrakten Rechners ist. Wir nennen p M Zielprogramm und folglich M die Zielsprache des Übersetzers. Nach der Übersetzung wird das erzeugte Programm p M zur Laufzeit mit der Eingabefolge e ausgeführt. Dabei gehen wir davon aus, daß p M mit der Eingabe e die Ausgabe a erzeugt, wenn ein Interpreter für L mit I L (p L,e) = a dieselbe Ausgabe erzeugt. Wenn wir die Maschine, deren Maschinensprache unsere Zielsprache M ist, als Interpreter I M für M auffassen, so muß gelten: wenn I L (p L,e) = a,dann I M (p M,e) = a. Neben der Generierung des Zielprogramms wird während der Übersetzung eines Programms eine umfassende Überprüfung auf Fehler des zu analysierenden Programmtextes vorgenommen. Durch diese globale Analyse können manche Fehler bereits vor der Ausführung des Programms gefunden werden, während dies beim Interpreter aufgrund seiner lokalen Sicht auf den Programmtext erst zur Laufzeit geschehen kann. Der Compiler erkennt nur Fehler eines Programmes, die von der konkreten Eingabe während eines Programmlaufs unabhängig sind. Hierzu gehören neben syntaktischen Fehlern auch semantische Fehler, z.b. Zugriffe auf nichtdeklarierte Variablen. Fehler, die aus der Eingabe e resultieren, können auch beim Compiler erst zur Laufzeit des Zielprogramms p M entdeckt werden Virtuelle Maschinen als Zielplattform Bei der klassischen Implementierung einer Programmiersprache auf einer Zielplattform sind wir bisher sowohl bei der Verwendung eines Interpreters als auch eines Compilers von der Maschinensprache des realen Rechners als Zielsprache ausgegangen. Dieser Ansatz hat mehrere Nachteile: Der Compiler-Entwickler muss für eine Vielzahl unterschiedlicher Instruktionssätze von Prozessoren entsprechende Back-Ends(siehe unten) zur Verfügung stellen. Der Compiler-Entwickler möchte für eine effiziente Code-Erzeugung auf Befehle zurückgreifen, die eventuell nicht im Instruktionssatz enthalten sind. Das gilt insbesondere für die Umsetzung spezieller Konstrukte der Quellsprache, beispielsweise zur Behandlung von Ausnahmen. Insbesondere möchte der Entwickler für die Übersetzung von Programmen entwickelte Ansätze trotz sich ändernder Instruktionssätze und Rechnerarchitekturen gleich bleibende Rahmenbedingungen vorfinden. 4

15 1.4 Umgebung eines Compilers Aus diesen Gründen wird bei der Implementierung neuerer Programmiersprachen zunehmend dazu übergegangen, den Instruktionssatz einer idealisierten abstrakten oder virtuellen Maschine (VM) als Zielsprache des Compilers einzuführen. Die so definierte zusätzliche Abstraktionsschicht auf der Zielplattform hat mehrere Vorteile: Die Implementierung der virtuellen Maschine für eine spezifische Plattform kann unabhängig von der Entwicklung des Compilers vorgenommen werden, solange beides mit Hinblick auf einen festen Instruktionssatz der VM erfolgt. Für die VM erzeugte Code ist auf jedem System lauffähig, auf dem die VM implementiert ist (Portierbarkeit). Der Befehlssatz der VM kann passend zu Paradigmen und Konstrukten der Quellsprache gewählt werden und erlaubt so eine effiziente Übersetzung der Quellprogramme. Beispiel: Der Java Bytecode (JBC) als Instruktionssatz der Java Virtual Machine (JVM) beinhaltet spezielle Befehle zum Umgang mit Objekten, da die Quellsprache Java objektorientiert ist. Der durch den Compiler erzeugte Code wird nicht direkt auf dem Zielsystem ausgeführt, sondern auf einer Zwischenschicht, wodurch eine sicherere Ausführung gewährleistet werden kann (Sand-Boxing). Somit kann der Einsatz einer virtuellen Maschine für die Implementierung einer Programmiersprache als Kombination beider zuvor vorgestellten Ansätze gesehen werden: 1. Die Übersetzung des Quellprogramms in ein Programm für die virtuelle Maschine erfolgt durch einen Compiler. 2. Die virtuelle Maschine ist ein Interpreter für das durch den Compiler erzeugte Zielprogramm. In zweiten Teil der Vorlesung werden wir uns ausführlich mit den Konzepten virtueller Maschinen beschäftigen. 1.4 Umgebung eines Compilers Zur Umgebung eines Compilers gehören i. allg. weitere Programme, die für die Übersetzung und die Ablauffähigkeit eines Programms benötigt werden (Abbildung 1.1 [ASU99]). Am Beginn des Übersetzungsprozesses steht ein rohes Quellprogramm. Dieses Quellprogramm enthält neben dem eigentlichen Programm zusätzliche Meta-Anweisungen, die beschreiben, wie das Quellprogramm vor der Übersetzung mit dem Compiler modifiziert werden soll. Dabei kann es sich z.b. um die Definition von Makros (z.b.#def ine in C [KR90]), um die Generierung zusätzlicher Befehle zur Fehlersuche oder um das Einfügen weiterer Quelltexte (z.b. \include in L A TEX[Kop02]) handeln. Diese Modifikationen des Quelltextes werden von einem sogenannten Präprozessor 5

16 1 Einführung "rohes" Quellprogramm Präprozessor Quellprogramm Compiler Assemblerprogramm Assembler relokatibler Maschinencode Lader / Binder ausführbarer Maschinencode Abbildung 1.1: Umgebung eines Compilers. vorgenommen. Nach der Behandlung des Quelltextes durch den Präprozessor kann der Compiler das Zielprogramm erzeugen. Wie zuvor erwähnt, handelt es sich bei dem Zielprogramm entweder um ein Maschinenspracheprogramm bzw. einen Assemblertext. Im zweiten Fall muß der Assemblertext nun in einem zusätzlichen Schritt durch den Assembler in Maschinencode übersetzt werden. Oft wird heutzutage vom Compiler statt des Assemblertextes ein C-Programm erzeugt, welches vom C-Compiler weiterverarbeitet wird. Der vom Compiler erzeugte Maschinencode ist i. allg. noch nicht ausführbar, da es sich um sogenannten relokatiblen Code handelt. In diesem Code sind die Sprungadressen noch nicht festgelegt, so daß der Code im Speicher frei verschiebbar ist. Außerdem müssen die Bibliotheken des jeweiligen Übersetzers noch zum erzeugten Maschinencode hinzugefügt werden. Diese Bibliotheken enthalten z.b. die Ein- und Ausgaberoutinen der Programme (z.b. das Modul InOut in Modula-2 [Wir97]) sowie weitere Routinen, die zur Laufzeit eines Programmes benötigt werden. Es gibt zwei Verfahren zur Einbindung der Bibliotheken in ein Programm. Der Binder faßt den relokatiblen Maschinencode und den Code der Bibliotheken zu einem neuen Programm zusammen und ersetzt dabei die abstrakten Programmadressen des relokatiblen Codes durch die statischen Adressen der Unterprogramme der Bibliotheken. Dieses erzeugte Programm ist ohne die Unterstützung weiterer Programme ausführbar. Der 6

17 1.5 Aufbau eines Compilers Quellprogramm lexikalische Analyse Analyse syntaktische Analyse semantische Analyse Codeerzeugung Symboltabellenverwaltung Fehlerbehandlung Zwischencodeerzeugung Codeoptimierung Synthese Zielprogramm Abbildung 1.2: Phasen eines Compilers. Lader lädt hingegen den relokatiblen Code und den Code der benötigten Bibliotheken in den Hauptspeicher und ersetzt die abstrakten Adressen dort dynamisch. Aus diesem Grund muß der Lader bei jedem Aufruf des Zielprogramms verwendet werden. 1.5 Aufbau eines Compilers Die Aufgabe eines Compilers läßt sich zunächst in zwei grundlegende Teilaufgaben zerlegen (Abbildung 1.2): die Analyse des Quellprogramms und die Synthese des Zielprogramms. Beide Aufgaben werden in einer Reihe von Phasen bearbeitet Analyse In den Analysephasen wird das Quellprogramm in seine Bestandteile zerlegt. Dabei wird eine Überprüfung auf statische (also von der konkreten Eingabe eines Programmablaufs unabhängige) Korrektheit des zu analysierenden Programmtextes vorgenommen. Enthält das Programm erkennbare Fehler, werden entsprechende Fehler- 7

18 1 Einführung meldungen an den Benutzer ausgegeben. Weiterhin wird eine Zwischendarstellung des Programms erzeugt, die nur noch die für die Synthesephasen benötigten Informationen des Programmtextes enthält. Im folgenden erläutern wir die Analysephasen aus Abbildung 1.2 [ASU99] an der Übersetzung der Zuweisung position := initial+rate 60. Dabei nehmen wir an, daß die Variablen position, initial und rate als Fließkomma- Variablen deklariert sind. Lexikalische Analyse (scanning): Die lexikalische Analyse dient der Zerlegung des Zeichenstroms der Eingabe in Symbole. Die Zuweisung wird dabei in folgende Symbole zerlegt: 1. Bezeichner (position) 2. Zuweisungssymbol 3. Bezeichner (initial) 4. Additionssymbol 5. Bezeichner (rate) 6. Multiplikationssymbol 7. Konstante (60) Wird als Symbol ein Bezeichner erkannt, wird dieser Bezeichner in die Symboltabelle des Compilers eingetragen. Jedem Bezeichner wird eine eindeutige Nummer zugewiesen, in unserem Beispiel der Einfachheit halber gemäß der Reihenfolge des Auftretens im Quellprogramm. An die nachfolgenden Phasen wird nicht mehr der Bezeichner selbst, sondern die ihm zugeordnete Nummer weitergegeben (in Abbildung 1.3 [ASU99] ist während der lexikalischen Analyse position durch id 1 ersetzt worden, initial durch id 2 und rate durch id 3 ). Das Teilprogramm, das die lexikalische Analyse des Quelltextes durchführt, wird Scanner genannt. Syntaktische Analyse (parsing): In der syntaktischen Analyse werden Gruppen von Symbolen mit hierarchischer Struktur erkannt. Die Quellsprache wird durch die Regeln einer kontextfreien Grammatik definiert. Anhand der Produktionen dieser Grammatik wird die von der lexikalischen Analyse gelieferte Symbolfolge auf Korrektheit überprüft. Dabei wird ein sogenannter Strukturbaum (parse-tree) erzeugt, der die Analyse des Programmtextes gemäß den Regeln der Grammatik darstellt. Für die Analyse der Zuweisung nehmen wir die folgende kontextfreie Grammatik an (kursiv gedruckte Wörter sind Nichtterminalsymbole): 8

19 1.5 Aufbau eines Compilers position := initial + rate * 60 lexikalische Analyse id 1 := id 2 +id 3 60 syntaktische Analyse := id 1 + id 2 * id 3 60 semantische Analyse := id 1 + id * 2 id 3 inttoreal Zwischencode-Erzeugung temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 Code-Optimierung Symboltabelle position... initial... rate... temp1 := id3 * 60.0 id1 := id2 + temp1 Code-Generierung MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 Abbildung 1.3: Übersetzung einer Zuweisung. 9

20 1 Einführung Zuweisung Bezeichner := Ausdruck position Ausdruck + Ausdruck Bezeichner Ausdruck * Ausdruck initial Bezeichner rate Zahl 60 Abbildung 1.4: Parse-Baum der Zuweisung. Zuweisung Bezeichner := Ausdruck Ausdruck Bezeichner Zahl Ausdruck + Ausdruck Ausdruck * Ausdruck Der Strukturbaum der Zuweisungsanweisung gemäß dieser Grammatik ist in Abbildung 1.4 dargestellt. Der Strukturbaum enthält neben den Terminalsymbolen der Eingabe auch die Nichtterminalsymbole der Grammatik, die bei der Ableitung der Eingabe verwendet wurden. Diese Nichtterminalsymbole werden in den weiteren Phasen des Compilers nicht mehr benötigt. Daher wird als Endprodukt der syntaktischen Analyse ein Syntaxbaum erzeugt, wie er in Abbildung 1.3 dargestellt ist 2. Das Teilprogramm zur syntaktischen Analyse heißt Parser. Semantische Analyse: Nach der Überprüfung auf syntaktische Korrektheit des Programms wird in der semantischen Analyse die statische Semantik des Quellprogramms analysiert. Statisch bedeutet in diesem Zusammenhang, daß die semantischen Merkmale untersucht werden, die nicht von den Eingabedaten abhängig und daher für alle dynamischen Ausführungen gleich sind. Zur semantischen Analyse gehören die Überprüfung auf korrekte Typisierung, die Einhaltung von Gültigkeitsbereichen und eventuelle Typanpassungen. Während der semantischen Analyse werden die Bezeichner in der Symboltabelle mit Attributen versehen. Hierzu gehören z.b. der Variablentyp und der Gültigkeitsbereich der Variablen. Im Beispiel in Abbildung 1.3 hatten wir angenommen, daß die drei Bezeichner Varia- 2 Im Gegensatz zu unserer Terminologie werden die Begriffe Syntaxbaum und Strukturbaum in [WM96] synonym verwendet. 10

21 1.5 Aufbau eines Compilers blen vom Typ REAL darstellen. Bei der Typüberprüfung des Programms wird in der semantischen Analyse festgestellt, daß die ganze Zahl 60 mit dem Inhalt einer REAL- Variablen multipliziert werden soll. Daher wird in den Syntaxbaum die Information eingefügt, daß vor der Multiplikation eine Typumwandlung der Zahl vorgenommen werden muß Synthese In den Synthesephasen wird das zum Quellprogramm gehörende Zielprogramm erzeugt. Dabei werden die Informationen, die in den Analysephasen über den Programmtext gesammelt wurden, verwendet. Zwischencode-Erzeugung: Vor der Erzeugung des eigentlichen Zielprogramms wird oft eine Zwischendarstellung des Programms generiert, die einerseits bereits maschinennah, andererseits noch an keiner konkreten Zielmaschine orientiert ist. Diese Zwischensprache wird Zwischencode genannt. In Abbildung 1.3 wird als Zwischencode ein Drei-Adreß-Code erzeugt. Jeder Befehl dieses Codes darf maximal drei Adressen verwenden. Zwei Adressen geben an, wo sich die Operanden des Befehls befinden. Die dritte Adresse bezeichnet den Speicherplatz, an dem das Ergebnis des Befehls abgelegt werden soll. Die Speicherzellen an den Adressen id1, id2 und id3 enthalten die Werte der zugehörigen Variablen. Die Adressen temp1, temp2 und temp3 bezeichnen temporäre Speicherplätze für Zwischenergebnisse. Code-Optimierung: Die Verwendung eines maschinenunabhängigen Zwischencodes bietet den Vorteil, daß auf dem erzeugten Zwischencode eine ebenfalls maschinenunabhängige Code-Optimierung vorgenommen werden kann. Bei dieser Optimierung wird der Zwischencode auf Redundanzen hin untersucht und in bezug auf Laufzeit und Speicherplatzverbrauch verbessert. Im Beispiel wird in der Code-Optimierung erkannt, daß statt der Umwandlung einer ganzen Zahl in eine REAL-Zahl gleich die entsprechende Fließkommakonstante im Code verwendet werden kann. Hierdurch entfallen ein temporärer Speicherplatz und eine Konvertierungs-Operation. Außerdem kann das Ergebnis des Additionsbefehls direkt in id1 gespeichert werden, so daß die letzte Zuweisung entfällt. Code-Generierung: In dieser letzten Compilerphase wird das Zielprogramm für die Zielmaschine erzeugt. Dabei wird jeder Befehl des optimierten Zwischencodes in eine kurze Sequenz von Maschinenbefehlen übersetzt. Nach Möglichkeit werden die Speicherplätze des Zwischencodes durch Register der konkreten Maschine ersetzt, um zeitaufwendige Zugriffe auf den Hauptspeicher zu vermeiden. 11

22 1 Einführung Eventuell schließt sich an die Phase der Code-Generierung noch eine maschinenabhängige Code-Optimierung an, die Ineffizienzen im erzeugten Maschinencode beseitigt(z.b. überflüssige Kopierbefehle entfernt oder einzelne Maschinenbefehle durch effizientere Befehle mit derselben Wirkung ersetzt) Front-End, Back-End Bei der Einteilung des Compilers in Phasen werden häufig die Begriffe Front-End und Back-End verwendet. Das Front-End eines Compilers umfaßt alle zielsprachenunabhängigen Compilerphasen, das Back-End entsprechend alle quellsprachenunabhängigen Phasen des Compilers. Für die Portierung eines Compilers auf eine andere Zielsprache kann i. allg. das Front- End unverändert weiterverwendet werden, so daß nur das entsprechende Back-End neu implementiert werden muß. Im umgekehrten Fall kann die Verbindung mehrerer Front-Ends mit einem gemeinsamen Back-End sinnvoll sein, um innerhalb eines Programms Teilprogramme in einer jeweils für das Teilproblem optimalen Programmiersprache zu schreiben und aus diesen Teilprogrammen ein gemeinsames Zielprogramm zu erzeugen Läufe Es ist üblich, mehrere Übersetzungsphasen in einem einzelnen Lauf (pass) zu implementieren. Ein Lauf steht dabei für einen Durchlauf durch eine Darstellung des Programms. Dabei kann es sich sowohl um den Quelltext als auch um eine interne Darstellung des Programms wie z.b. den Syntaxbaum handeln. Dabei bietet es sich an, Phasen, deren Arbeitsschritte eng miteinander verzahnt sind, in einem Lauf zusammenzufassen. Eine Möglichkeit wäre zum Beispiel die Integration von lexikalischer und syntaktischer Analyse in einem Lauf sowie der semantischen Analyse und der Codegenerierung in einem zweiten Lauf. Einen Extremfall stellt der Ein-Pass-Compiler dar, der die Analyse des Quellprogramms und die Synthese des Zielprogramms während eines einzigen Durchlaufs durch den Programmtext durchführt. In diesem Fall muß gewährleistet sein, daß jeder Bezeichner vor seiner Verwendung deklariert wurde, da nachträgliche Änderungen am Zielprogramm nicht mehr möglich sind. Aus diesem Grund ist in vielen Compilern für die Sprache Pascal [JW91] die Vordeklaration von Bezeichnern mit der forward-anweisung vorgesehen. Andere Programmiersprachen wie z.b. Algol-68[OT97] erlauben die Verwendung von Bezeichnern vor ihrer Deklaration, so daß für diese Sprachen die Implementierung mittels eines Ein-Pass-Compilers nicht möglich ist. Bei der Implementierung einer Sprache mittels einer virtuellen Maschine gilt: Der 12

23 1.5 Aufbau eines Compilers vom Compiler erzeugte Code ähnelt dem idealisierten Zwischencode, der durch die virtuelle Maschine interpretiert wird, also auf Instruktionen der realen Hardware zum Zeit der Ausführung abgebildet wird. Somit kann die virtuelle Maschine auch als Middle-End bezeichnet werden. Das bedeutet in der Regel aber nicht, dass bei dieser Variante die Phase der Zwischencode-Erzeugung entfällt. Vielmehr existiert im Allgemeinen eine weitere Zwischendarstellung des Programms zwischen semantischer Analyse und dem Code für die virtuelle Maschine, auf deren Grundlage Optimierungen unabhängig von der VM durchgeführt werden können. 13

24 2 Lexikalische Analyse Die lexikalische Analyse arbeitet als erste Phase des Compilers direkt mit dem zu übersetzenden Programmtext (siehe Abbildung 2.1). Der Programmteil zur Durchführung der lexikalischen Analyse wird Scanner genannt. Der Scanner erfüllt die folgenden Aufgaben: Das Quellprogramm wird zeichenweise gelesen und dabei in Symbole zerlegt. Bei dieser Zerlegung werden Leerzeichen, Kommentare, Zeilenenden etc. entfernt, so daß sie in den weiteren Compilerphasen nicht mehr beachtet werden müssen. Die Bezeichner des Programms werden in der Reihenfolge ihres Auftretens im Quelltext mit erläuternden Informationen in die Symboltabelle eingefügt. Für die eventuelle Ausgabe von Fehlermeldungen werden Informationen gesammelt (z.b. Zeilennummern). Ein wichtiger Gesichtspunkt bei der Realisierung eines Scanners ist Effizienz, da die nachfolgenden Phasen des Compilers direkt vom Scanner abhängig sind und deren Laufzeit daher durch einen langsamen Scanner negativ beeinflußt wird. Meist wird der Scanner als Unterprogramm des Parsers realisiert (eventuell als Coroutine). Der Scanner liefert jeweils nach Aufforderung durch den Parser ein Symbol. 2.1 Terminologie In diesem Abschnitt führen wir die Begriffe Symbol, Muster und Lexem ein. Symbol Quellprogramm Scanner Parser nächstes Symbol anfordern Symboltabelle Abbildung 2.1: Interaktion zwischen Scanner und Parser.

25 2.2 Reguläre Sprachen und endliche Automaten Symbole sind die vom Scanner an den Parser zu liefernden Grundeinheiten der Programmiersprache. Mengen von gleichartigen Symbolen nennen wir Symbolklassen. Typische Symbolklassen sind die Menge der Integer-Konstanten und die Menge der Zeichenketten. Muster beschreiben die möglichen Auftreten eines Symbols im Quellprogramm. Die Zeichenfolgen im Programmtext, die Symbolen entsprechen, nennen wir Lexeme. Beispiele für Symbole und die zugehörigen Muster und Lexeme sind in Tabelle 2.1 angeführt. Symbol Musterbeschreibung mögliche Lexeme if if if id Buchstabe, gefolgt von pi, D2 Buchstaben oder Ziffern Tabelle 2.1: Beispiele für Symbole, Muster und Lexeme. 2.2 Reguläre Sprachen und endliche Automaten Grundlage für die lexikalische Analyse ist die Theorie der regulären Sprachen. Wir wiederholen zunächst einige wichtige Grundbegriffe der formalen Sprachen. Ein Alphabet Σ ist eine endliche Menge von Zeichen; z.b. {0,1}, {0,...,9,A,...,Z} oder der ASCII-Zeichensatz. Ein Wort über einem Alphabet Σ ist eine endliche Folge von Zeichen aus dem Alphabet; z.b , A195, Das leere Wort bezeichnen wir mit ε. Die Menge aller Wörter über einem Alphabet Σ bezeichnen wir mit Σ. Eine Sprache über einem Alphabet ist eine Menge von Wörtern über dem Alphabet, z.b., {ε}, {A,B,C,AB,AC,ABC} sowie die Menge aller syntaktisch wohlgeformten Modula 2-Programme. Seien v und w Wörter über dem Alphabet Σ. Die Konkatenation von v und w, geschrieben vw, ist dasjenige Wort, das durch das Anhängen von w an v ensteht. Für v = compiler und w = bau ergibt sich als Konkatenation vw das Wort compilerbau. Es gilt εw = wε = w für beliebige Wörter w. Die Exponentiation von Wörtern ist wie folgt definiert: w 0 = ε w i = w i 1 w für i > 0. Es gilt w 1 = w. Operationen auf Sprachen: Seien L, M Sprachen. Dann sind die folgenden Operationen definiert: 15

26 2 Lexikalische Analyse Vereinigung: L M := {w w L w M} Konkatenation: LM := {vw v L w M} Exponentiation: L 0 := {ε}, L i := L i 1 L für i > 0 Kleene-Abschluß: L := i=0 Li Positiver Abschluß: L + := i=1 Li Beispiel 1 Seien L = {A,B,...,Z,a,b,...,z} und D = {0,1,...,9} Sprachen mit Wörtern der Länge 1. Dann ist L D die Sprache der Buchstaben und Ziffern, LD die Sprache, die lauter Wörter der Form Buchstabe Ziffer enthält, L 4 die Sprache aller Wörter mit genau vier Buchstaben über L, L die Sprache aller beliebig langen Wörter aus Buchstaben (inkl. ε), L((L D) ) die Sprache aller Wörter aus Buchstaben und Ziffern, die mit einem Buchstaben beginnen, D + die Sprache aller nicht-leeren Wörter aus Ziffern Reguläre Sprachen Sei Σ Alphabet. Definition 1 Die regulären Sprachen über Σ sind induktiv definiert durch ist reguläre Sprache, für alle a Σ ist {a} reguläre Sprache, falls L 1,L 2 reguläre Sprachen, so sind auch L 1 L 2, L 1 L 2 und L 1 reguläre Sprachen. Nichts sonst ist eine reguläre Sprache über Σ. Bemerkung: {ε} wird durch den -Operator aus gewonnen. Also ist {ε} regulär Reguläre Ausdrücke Reguläre Ausdrücke sind spezielle Formeln, mit denen reguläre Sprachen definiert werden. Definition 2 Die Menge der regulären Ausdrücke über Σ, reg(σ), ist induktiv definiert durch 16

27 2.2 Reguläre Sprachen und endliche Automaten reg(σ), ε reg(σ), für jedes a Σ ist a reg(σ), falls r 1,r 2 reg(σ), dann (r 1 r 2 ) reg(σ),(r 1 r 2 ) reg(σ) und (r 1 ) reg(σ). Bemerkung: Die Zeichen (,),, in regulären Ausdrücken sind Metazeichen. Sie sind keine Elemente des Alphabets Σ, sondern dienen als Operatoren zur Bildung der regulären Ausdrücke. Die Metazeichen müssen von den Zeichen des Alphabets zu unterscheiden sein, damit die von dem regulären Ausdruck beschriebene Sprache eindeutig zu bestimmen ist. Sind die Metazeichen im Alphabet Σ enthalten, wird die hieraus resultierende Doppeldeutigkeit durch eine spezielle Kennzeichnung der Metazeichen vermieden (siehe Beispiel 2). Die Sprache, die von einem regulären Ausdruck definiert wird, wird in der folgenden Definition eingeführt. Definition 3 Sei r regulärer Ausdruck. Die Sprache L(r) ist induktiv definiert durch L( ) = L(ε) = {ε} L(a) = {a} L((r 1 r 2 )) = L(r 1 ) L(r 2 ), L((r 1 r 2 )) = L(r 1 )L(r 2 ), L((r 1 ) ) = (L(r 1 )) Bemerkung: Es gilt: r reg(σ) L(r) ist reguläre Sprache. Wir verdeutlichen die regulären Ausdrücke anhand von Beispielen. Beispiel 2 a b beschreibt {a} {b} = {a,b} (ab) beschreibt ({a}{b}) = {ab} = {ε,ab,abab,...} (A... Z a... z) beschreibt {A,...,Z,a,...,z} Sei Σ = {(,)}. Die Zeichen des Alphabets sind in den Metazeichen regulärer Ausdrücke enthalten. Daher kennzeichen wir die Metazeichen durch Unterstreichung. Damit beschreibt ( ( ) ) die Sprache, deren Wörter mit beliebig vielen öffnenden Klammern beginnen und mit einer schließenden Klammer enden: {),(),((),(((),...} 17

28 2 Lexikalische Analyse Konventionen: Um bei der Angabe regulärer Ausdrücke Klammern zu sparen und Mehrdeutigkeiten zu vermeiden, ordnen wir den Operatoren dieser Ausdrücke Prioritäten zu. hat die höchste Priorität, so daß a b und (a b) unterschiedliche Sprachen beschreiben. Zudem ist der -Operator linksassoziativ, d.h. a = (a ). Die Konkatenation besitzt die zweithöchste Priorität und ist ebenfalls linksassoziativ. hatdieniedrigstepriorität( (a b) cvs.a b c )undistebenfallslinksassoziativ. Bemerkung: Unterschiedliche reguläre Ausdrücke können dieselbe Sprache beschreiben. So ist L((a b)(a b)) = {aa, ab, ba, bb} = L(aa ab ba bb). Algebraische Eigenschaften: Für die Operatoren und Konkatenation gelten die folgenden algebraischen Eigenschaften, wobei wir reguläre Ausdrücke genau dann gleichsetzen, wenn sie dieselbe Sprache beschreiben (r = s bedeutet L(r) = L(s)): r s = s r (Kommutativität von ) r (s t) = (r s) t (Assoziativität von ) r(st) = (rs)t (Assoziativität der Konkatenation) Endliche Automaten Nach der Einführung der regulären Sprachen und der regulären Ausdrücke in den vorigen Abschnitten geben wir nun einen Mechanismus zur Erkennung von Wörtern regulärer Sprachen an. Hierzu verwenden wir die endlichen Automaten. Definition 4 EinnichtdeterministischerendlicherAutomat(NEA) ist eintupelm = (Σ,Q,,q 0,F), wobei Σ endliches Alphabet (das Eingabealphabet), Q endliche Menge (von Zuständen), q 0 Q (der Anfangszustand), F Q (die Menge der Endzustände) und Q (Σ {ε}) Q (die Übergangsrelation) ist. Definition 5 Sei M = (Σ,Q,,q 0,F) ein NEA. Ein Paar (q,w),q Q,w Σ heißt Konfiguration von M, (q 0,w) heißt Anfangskonfiguration, (q f,ε) mit q f F Endkonfiguration. Die Schritt-Relation ist eine binäre Relation M (Q Σ ) (Q Σ ), definiert durch 18

29 2.2 Reguläre Sprachen und endliche Automaten (q,aw) M (q,w) : (q,a,q ) für q,q Q und a Σ oder a = ε. M sei die reflexive transitive Hülle von M. Die von M akzeptierte Sprache ist L(M) = {w Σ (q 0,w) M (q f,ε), q f F}. Ein endlicher Automat soll ein Eingabewort daraufhin überprüfen, ob es zu einer bestimmten Sprache gehört. Dabei wird die Eingabe von links nach rechts zeichenweise gelesen. Zu Beginn befindet sich der Automat im Anfangszustand q 0 und der Eingabezeiger zeigt auf das erste Zeichen des Eingabewortes. Nach dem Lesen eines Zeichens wird das entsprechende Zeichen aus der Eingabe entfernt und der Automat geht in Abhängigkeit vom gelesenen Zeichen mittels der Übergangsrelation in einen neuen Zustand über. Weiterhin ist der Übergang in einen anderen Zustand ohne das Lesen eines Eingabezeichens möglich (ε-übergang). Ein Übergang eines Automaten in einen anderen Zustand wird Schritt genannt. Ist die Eingabe vollständig gelesen und der Automat befindet sich in einem Endzustand, wird das gelesene Wort akzeptiert. Befindet sich der Automat nach dem vollständigen Lesen der Eingabe nicht in einem Endzustand oder ist in einem Zustand kein Übergang für das nächste Eingabezeichen möglich, wird das Eingabewort verworfen. Das Verhalten eines NEA wird also in jedem Schritt durch den aktuellen Zustand des Automaten und die restliche Eingabe bestimmt. Diese beiden Faktoren bilden zusammen die aktuelle Konfiguration des endlichen Automaten. Die Übergänge zwischen Konfigurationen werden durch die Schritt-Relation beschrieben. Der Automat erkenntdie Worte, für die er durch eine Folge von Schritten aus der Anfangskonfiguration eine Endkonfiguration erreichen kann. Die Menge der von einem NEA erkannten Worte bildet die von ihm akzeptierte Sprache. Graphische Darstellung: Zur Verbesserung der Übersichtlichkeit werden NEAs durch Übergangsgraphen dargestellt. Die Knoten des Graphen repräsentieren die Zustände des Automaten. Die Kanten stellen die Zustandsübergänge des Automaten dar und sind mit dem Zeichen beschriftet, das während des Übergangs gelesen wurde (bzw. mit ε, falls kein Zeichen gelesen wurde). Beispiel 3 DerÜbergangsgraphinAbbildung2.2stellt einennea dar, der diesprachel((a b) abb) = {abb, aabb, babb, aaabb, ababb,...} akzeptiert. Ein NEA akzeptiert ein Eingabewort w genau dann, wenn es im Übergangsgraphen einen Pfad vom Startzustand in einen Endzustand gibt, so daß die gelesenen Eingabesymbole die Kanten des Pfades beschriften. Die Übergangsrelation eines NEA kann in Form einer Tabelle dargestellt werden. Die Tabelle 2.2 enthält die Übergangsrelation des in Abbildung 2.2 dargestellten Automaten. 19

30 2 Lexikalische Analyse a a b b b Abbildung 2.2: Beispiel eines Übergangsgraphen. Zustand / Eingabe a b ε 0 {0,1} {0} {2} {3} Tabelle 2.2: Übergangsrelation in Tabellenform. Satz 1 Zu jedem regulären Ausdruck r gibt es einen nichtdeterministischen endlichen Automaten, der die von r beschriebene reguläre Sprache akzeptiert. Beweis Wir führen den Beweis konstruktiv durch, indem wir für jeden regulären Ausdruck eine Überführung in entsprechende Automaten angeben, wobei Kanten zunächst mit regulären Ausdrücken beschriftet sein dürfen. Handelt es sich bei dem Ausdruck r um, der die leere Sprache beschreibt, besteht der Automat aus nur einem Zustand, der zugleich Endzustand ist, und enthält keine Übergänge. Andernfalls beginnen wir mit einem Graphen für den regulären Ausdruck r, wie er in in Abbildung 2.3 oben angegeben ist. Die Überführungsschritte für die einzelnen Operatoren sind in Abbildung 2.3 aufgeführt. r,r 1,r 2 sind reguläre Ausdrücke. (A) beschreibt die Behandlung der Alternative, (K) der Konkatenation, (S) des Stern-Operators und (KL) die Behandlung von Klammern. Beispiel 4 In Abbildung 2.4 wird schrittweise der Automat für den regulären Ausdruck a(a 0) konstruiert. Neben den einzelnen Konstruktionsschritten ist die Regel aus Abbildung 2.3 angegeben, die in diesem Schritt verwendet wurde. 20

31 2.2 Reguläre Sprachen und endliche Automaten 1 r 2 q r p r q p q p r 1 (A) r 2 r 1 r 2 q p r 1 q q1 r 2 p ε q r p q ε q1 q2 ε p r (K) (S) ε (r) q p q r p (KL) Abbildung 2.3: Konstruktion eines NEA zu einem regulärem Ausdruck. a(a 0) 0 1 a (a 0) (a 0) 0 a 2 ε 3 4 ε 1 ε (K) (S) ε a a ε ε 1 ε (KL),(A) ε Abbildung 2.4: Beispiel einer NEA-Konstruktion. 21

32 2 Lexikalische Analyse Da es sich bei dem mit dem Verfahren erzeugten Automaten um einen nichtdeterministischen endlichen Automaten handelt, ist eine direkte Umsetzung des Automaten in ein Programm aufgrund des Nichtdeterminismus nicht ohne weiteres möglich. Aus der Theorie der formalen Sprachen ist bekannt, daß es zu jedem NEA einen deterministischen endlichen Automaten (DEA) gibt, der dieselbe Sprache erkennt. Definition 6 Sei M = (Q,Σ,,q 0,F) ein NEA. M heißt deterministischer endlicher Automat (DEA), wenn eine Funktion σ : Q Σ Q ist. In einem DEA treten keine ε-übergänge auf. Weiterhin gibt es für jeden Zustand unter jeder Eingabe höchstens einen Folgezustand. Satz 2 Wird eine Sprache L von einem NEA akzeptiert, so gibt es einen DEA, der L akzeptiert. Beweis Der Beweis wird konstruktiv geführt, indem wir ein Verfahren angeben, das zu einem NEA einen DEA generiert, der dieselbe Sprache erkennt. Dieses Verfahren wird Potenzmengenkonstruktion genannt. Die Potenzmengenkonstruktion verwendet die beiden folgenden Definitionen: Definition 7 Sei M = (Q,Σ,,q 0,F) ein NEA und sei q Q. Die Menge der ε-folgezustände von q ist ε FZ(q) = {p (q,ε) M (p,ε)}, also die Menge aller Zustände p, inklusive q, für die es einen ε-weg im Übergangsgraphen zu M von q nach p gibt. Wir erweitern ε FZ auf Mengen von Zuständen S Q: ε FZ(S) = q Sε FZ(q). Definition 8 Sei M = (Q,Σ,,q 0,F) ein NEA. Der zu M gehörende DEA M = (Q,Σ,δ,q 0,F ) ist definiert durch: Q = P(Q), die Potenzmenge von Q, q 0 = ε FZ(q 0 ), F = {S Q S F } und δ(s,a) = ε FZ({p (q,a,p) fürq S}) für a Σ,S Q. 22

33 2.2 Reguläre Sprachen und endliche Automaten Der folgende Algorithmus konstruiert zu einem NEA M den zu M gehörenden DEA M, wobei nicht erreichbare Zustände weggelassen werden. Algorithmus NEA nach DEA Eingabe: NEA M = (Q,Σ,,q 0,F) Ausgabe: DEA M = (Q,Σ,δ,q 0,F ) 1 q 0 := ε FZ(q 0 ); Q := {q 0};\\ 2 marked(q 0) := false; δ := ;\\ 3 while existiert S ǫq and marked(s) = false do 4 marked(s) := true; 5 foreach aǫσ do 6 T := ε FZ({pǫQ (q,a,p)ǫ undq ǫs}) 7 if T / Q then 8 Q := Q {T}; ( neuer Zustand ) 9 marked(t) := false 10 fi ;\\ 11 δ := δ {(S,a) T} ( neuer Ubergang ) 12 od 13 od Die Zustände von M sind Mengen von Zuständen von M (daher der Name Potenzmengenkonstruktion). Zwei Zustände p und q von M fallen in dieselbe Zustandsmenge S (also in denselben Zustand von M ), wenn es ein Wort w gibt, welches den NEA M sowohl nach p als auch nach q bringt. Nach Definition 8 erhält man den Folgezustand eines Zustands S in M unter einem Zeichen a, indem man die Nachfolgezustände aller Zustände q S unter a zusammenfaßt und deren ε-folgezustände hinzufügt. Wir verdeutlichen die Arbeitsweise der Potenzmengenkonstruktion, indem wir für den in Abbildung 2.4 erzeugten NEA einen DEA generieren, der ebenfalls die durch den regulären Ausdruck a(a 0) beschriebene Sprache erkennt. In Abbildung 2.5 [WM96] sind die einzelnen Schritte des Verfahrens dargestellt. Die Zustände des zu konstruierenden DEA sind mit 0,1,2 und benannt, wobei 0 der Anfangszustand ist. ist ein Fehlerzustand, der als Folgezustand eines Zustands q unter a verwendet wird, wenn es keinen Übergang im NEA unter a aus q heraus gibt. Sind für einen Zustand des DEA für alle möglichen Zeichen aus Σ die entsprechenden Nachfolgezustände des DEA berechnet, wird der Zustand markiert (in Abbildung 2.5 durch Unterstreichung dargestellt) und braucht nicht weiter behandelt zu werden. Endzustände des DEA sind die Zustände, in deren Menge von Zuständen des NEA ein Endzustand auftritt (1 und 2 sind Endzustände, da sie den NEA-Endzustand 1 beinhalten). 23

10 Erweiterung und Portierung

10 Erweiterung und Portierung 10.1 Überblick In vielen Fällen werden Compiler nicht vollständig neu geschrieben, sondern von einem Rechnersystem auf ein anderes portiert. Das spart viel Arbeit, ist aber immer noch eine sehr anspruchsvolle

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

Grundbegriffe der Informatik

Grundbegriffe der Informatik Grundbegriffe der Informatik Einheit 15: Reguläre Ausdrücke und rechtslineare Grammatiken Thomas Worsch Universität Karlsruhe, Fakultät für Informatik Wintersemester 2008/2009 1/25 Was kann man mit endlichen

Mehr

Grundlagen Theoretischer Informatik I SoSe 2011 in Trier. Henning Fernau Universität Trier fernau@uni-trier.de

Grundlagen Theoretischer Informatik I SoSe 2011 in Trier. Henning Fernau Universität Trier fernau@uni-trier.de Grundlagen Theoretischer Informatik I SoSe 2011 in Trier Henning Fernau Universität Trier fernau@uni-trier.de 1 Grundlagen Theoretischer Informatik I Gesamtübersicht Organisatorisches; Einführung Logik

Mehr

Programmiersprachen und Übersetzer

Programmiersprachen und Übersetzer Programmiersprachen und Übersetzer Sommersemester 2010 19. April 2010 Theoretische Grundlagen Problem Wie kann man eine unendliche Menge von (syntaktisch) korrekten Programmen definieren? Lösung Wie auch

Mehr

Formale Sprachen und Grammatiken

Formale Sprachen und Grammatiken Formale Sprachen und Grammatiken Jede Sprache besitzt die Aspekte Semantik (Bedeutung) und Syntax (formaler Aufbau). Die zulässige und korrekte Form der Wörter und Sätze einer Sprache wird durch die Syntax

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

Theoretische Grundlagen der Informatik

Theoretische Grundlagen der Informatik Theoretische Grundlagen der Informatik Vorlesung am 12.01.2012 INSTITUT FÜR THEORETISCHE 0 KIT 12.01.2012 Universität des Dorothea Landes Baden-Württemberg Wagner - Theoretische und Grundlagen der Informatik

Mehr

IT-Basics 2. DI Gerhard Fließ

IT-Basics 2. DI Gerhard Fließ IT-Basics 2 DI Gerhard Fließ Wer bin ich? DI Gerhard Fließ Telematik Studium an der TU Graz Softwareentwickler XiTrust www.xitrust.com www.tugraz.at Worum geht es? Objektorientierte Programmierung Konzepte

Mehr

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester 2012. hack@cs.uni-saarland.de. boesche@cs.uni-saarland.

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester 2012. hack@cs.uni-saarland.de. boesche@cs.uni-saarland. 1 Programmierung 2 Übersetzer: Code-Erzeugung Sebastian Hack hack@cs.uni-saarland.de Klaas Boesche boesche@cs.uni-saarland.de Sommersemester 2012 Bytecodes Der Java Übersetzer erzeugt keine Maschinensprache

Mehr

2.11 Kontextfreie Grammatiken und Parsebäume

2.11 Kontextfreie Grammatiken und Parsebäume 2.11 Kontextfreie Grammatiken und Parsebäume Beispiel: Beispiel (Teil 3): Beweis für L(G) L: Alle Strings aus L der Länge 0 und 2 sind auch in L(G). Als Induktionsannahme gehen wir davon aus, dass alle

Mehr

Was ist ein Compiler?

Was ist ein Compiler? Was ist ein Compiler? Was ist ein Compiler und worum geht es? Wie ist ein Compiler aufgebaut? Warum beschäftigen wir uns mit Compilerbau? Wie ist die Veranstaltung organisiert? Was interessiert Sie besonders?

Mehr

Fachseminar WS 2008/09

Fachseminar WS 2008/09 Fachseminar WS 2008/09 Fachgebiet: Compilerbau Thema: Lexikalische Analyse (Scanner) Referent: Ali Sediq Betreuer: Prof. Dr. Helmut Weber 1 Inhaltsverzeichnis Lexikalische Analyse 1.0 Grundprobleme der

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:

Mehr

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt AMPEL-Steuerung(en) Die Beschreibung und Programmierung der Ampel (vor allem Ampel_5) können sehr kompliziert

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3

Mehr

4.9 Deterministische Kellerautomaten Wir haben bereits definiert: Ein PDA heißt deterministisch (DPDA), falls

4.9 Deterministische Kellerautomaten Wir haben bereits definiert: Ein PDA heißt deterministisch (DPDA), falls 4.9 Deterministische Kellerautomaten Wir haben bereits definiert: Ein PDA heißt deterministisch (DPDA), falls δ(q, a, Z) + δ(q, ɛ, Z) 1 (q, a, Z) Q Σ. Die von einem DPDA, der mit leerem Keller akzeptiert,

Mehr

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel.

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel. Kontextfreie Kontextfreie Motivation Formale rundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen Bisher hatten wir Automaten, die Wörter akzeptieren Frank Heitmann heitmann@informatik.uni-hamburg.de

Mehr

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland OECD Programme for International Student Assessment Deutschland PISA 2000 Lösungen der Beispielaufgaben aus dem Mathematiktest Beispielaufgaben PISA-Hauptstudie 2000 Seite 3 UNIT ÄPFEL Beispielaufgaben

Mehr

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte 50. Mathematik-Olympiade. Stufe (Regionalrunde) Klasse 3 Lösungen c 00 Aufgabenausschuss des Mathematik-Olympiaden e.v. www.mathematik-olympiaden.de. Alle Rechte vorbehalten. 503 Lösung 0 Punkte Es seien

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Einführung in die Algebra

Einführung in die Algebra Prof. Dr. H. Brenner Osnabrück SS 2009 Einführung in die Algebra Vorlesung 13 Einheiten Definition 13.1. Ein Element u in einem Ring R heißt Einheit, wenn es ein Element v R gibt mit uv = vu = 1. DasElementv

Mehr

Übung Theoretische Grundlagen

Übung Theoretische Grundlagen Übung Theoretische Grundlagen Berechenbarkeit/Entscheidbarkeit Nico Döttling November 26, 2009 INSTITUT FÜR KRYPTOGRAPHIE UND SICHERHEIT KIT University of the State of Baden-Wuerttemberg and National Laboratory

Mehr

Aufklappelemente anlegen

Aufklappelemente anlegen Aufklappelemente anlegen Dieses Dokument beschreibt die grundsätzliche Erstellung der Aufklappelemente in der mittleren und rechten Spalte. Login Melden Sie sich an der jeweiligen Website an, in dem Sie

Mehr

Deterministische Turing-Maschinen (DTM) F3 03/04 p.46/395

Deterministische Turing-Maschinen (DTM) F3 03/04 p.46/395 Deterministische Turing-Maschinen (DTM) F3 03/04 p.46/395 Turing-Machine Wir suchen ein Modell zur formalen Definition der Berechenbarkeit von Funktionen und deren Zeit- und Platzbedarf. Verschiedene Modelle

Mehr

Mathematische Grundlagen der Informatik 2

Mathematische Grundlagen der Informatik 2 Zusammenfassung Math2I Mathematische Grundlagen der Informatik 2 Emanuel Duss emanuel.duss@gmail.com 12. April 2013 1 Zusammenfassung Math2I Mathematische Grundlagen der Informatik 2 Dieses Dokument basiert

Mehr

Theoretische Informatik I

Theoretische Informatik I Theoretische Informatik I Einheit 2.4 Grammatiken 1. Arbeitsweise 2. Klassifizierung 3. Beziehung zu Automaten Beschreibungsformen für Sprachen Mathematische Mengennotation Prädikate beschreiben Eigenschaften

Mehr

GITS Steckbriefe 1.9 - Tutorial

GITS Steckbriefe 1.9 - Tutorial Allgemeines Die Steckbriefkomponente basiert auf der CONTACTS XTD Komponente von Kurt Banfi, welche erheblich modifiziert bzw. angepasst wurde. Zuerst war nur eine kleine Änderung der Komponente für ein

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

Vorlesung Theoretische Informatik

Vorlesung Theoretische Informatik Vorlesung Theoretische Informatik Automaten und Formale Sprachen Hochschule Reutlingen Fakultät für Informatik Masterstudiengang Wirtschaftsinformatik überarbeitet von F. Laux (Stand: 09.06.2010) Sommersemester

Mehr

Informatik Kurs Simulation. Hilfe für den Consideo Modeler

Informatik Kurs Simulation. Hilfe für den Consideo Modeler Hilfe für den Consideo Modeler Consideo stellt Schulen den Modeler kostenlos zur Verfügung. Wenden Sie sich an: http://consideo-modeler.de/ Der Modeler ist ein Werkzeug, das nicht für schulische Zwecke

Mehr

Compiler, Übersetzer. Allgemeine Erklärung / Definition

Compiler, Übersetzer. Allgemeine Erklärung / Definition Compiler, Übersetzer Allgemeine Erklärung / Definition Ein Übersetzer ist ein Programm, das ein S 1 -Wort den Quelltext in ein S 2 -Wort umwandelt den Zieltext wobei die Semantik erhalten bleibt. Frage:

Mehr

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

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Informationsblatt Induktionsbeweis

Informationsblatt Induktionsbeweis Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln

Mehr

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken. In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access Die Grundlagen der Datenbanken kurspc15 Inhaltsverzeichnis Access... Fehler! Textmarke nicht

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Übung Theoretische Grundlagen Nachtrag zur Vorlesung Dirk Achenbach 21.11.2013

Übung Theoretische Grundlagen Nachtrag zur Vorlesung Dirk Achenbach 21.11.2013 Übung Theoretische Grundlagen Nachtrag zur Vorlesung Dirk Achenbach 21.11.2013 INSTITUT FÜR KRYPTOGRAPHIE UND SICHERHEIT KIT University of the State of Baden-Wuerttemberg and National Laboratory of the

Mehr

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln Stefan Brass: OOP (Java), 3. Syntaxdiagramme und Grammatikregeln 1/32 Objektorientierte Programmierung Kapitel 3: Syntaxdiagramme und Grammatikregeln Stefan Brass Martin-Luther-Universität Halle-Wittenberg

Mehr

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup Universität Dortmund Lehrstuhl Informatik VI Grundzüge der Informatik * WS 28/29 Prof. Dr. Joachim Biskup Leitung der Übungen: Arno Pasternak Lösungs-Ideen Übungsblatt 6 A: Grammatiken, Syntaxdiagramme

Mehr

Die Komplexitätsklassen P und NP

Die Komplexitätsklassen P und NP Die Komplexitätsklassen P und NP Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen 3. Dezember 2009 Berthold Vöcking, Informatik 1 () Vorlesung Berechenbarkeit und

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

Grammatiken. Einführung

Grammatiken. Einführung Einführung Beispiel: Die arithmetischen Ausdrücke über der Variablen a und den Operationen + und können wie folgt definiert werden: a, a + a und a a sind arithmetische Ausdrücke Wenn A und B arithmetische

Mehr

Enigmail Konfiguration

Enigmail Konfiguration Enigmail Konfiguration 11.06.2006 Steffen.Teubner@Arcor.de Enigmail ist in der Grundkonfiguration so eingestellt, dass alles funktioniert ohne weitere Einstellungen vornehmen zu müssen. Für alle, die es

Mehr

Informatik IC2. Balazs Simon 2005.03.26.

Informatik IC2. Balazs Simon 2005.03.26. Informatik IC2 Balazs Simon 2005.03.26. Inhaltsverzeichnis 1 Reguläre Sprachen 3 1.1 Reguläre Sprachen und endliche Automaten...................... 3 1.2 Determinisieren.....................................

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

VBA-Programmierung: Zusammenfassung

VBA-Programmierung: Zusammenfassung VBA-Programmierung: Zusammenfassung Programmiersprachen (Definition, Einordnung VBA) Softwareentwicklung-Phasen: 1. Spezifikation 2. Entwurf 3. Implementierung Datentypen (einfach, zusammengesetzt) Programmablaufsteuerung

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Stammdatenanlage über den Einrichtungsassistenten

Stammdatenanlage über den Einrichtungsassistenten Stammdatenanlage über den Einrichtungsassistenten Schritt für Schritt zur fertig eingerichteten Hotelverwaltung mit dem Einrichtungsassistenten Bitte bereiten Sie sich, bevor Sie starten, mit der Checkliste

Mehr

5. Übung: PHP-Grundlagen

5. Übung: PHP-Grundlagen 5.1. Erstes PHP-Programm 1. Schreiben Sie PHP-Programm innerhalb einer Webseite, d.h. innerhalb eines HTML-Dokument. Ihr PHP-Programm soll einen kurzen Text ausgeben und Komentare enthalten. Speichern

Mehr

Algorithmen und Datenstrukturen. Große Übung vom 29.10.09 Nils Schweer

Algorithmen und Datenstrukturen. Große Übung vom 29.10.09 Nils Schweer Algorithmen und Datenstrukturen Große Übung vom 29.10.09 Nils Schweer Diese Folien Braucht man nicht abzuschreiben Stehen im Netz unter www.ibr.cs.tu-bs.de/courses/ws0910/aud/index.html Kleine Übungen

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Zahlensysteme: Oktal- und Hexadezimalsystem

Zahlensysteme: Oktal- und Hexadezimalsystem 20 Brückenkurs Die gebräuchlichste Bitfolge umfasst 8 Bits, sie deckt also 2 8 =256 Möglichkeiten ab, und wird ein Byte genannt. Zwei Bytes, also 16 Bits, bilden ein Wort, und 4 Bytes, also 32 Bits, formen

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Softwareentwicklungspraktikum Sommersemester 2007. Grobentwurf

Softwareentwicklungspraktikum Sommersemester 2007. Grobentwurf Softwareentwicklungspraktikum Sommersemester 2007 Grobentwurf Auftraggeber Technische Universität Braunschweig

Mehr

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren: 4. AUSSAGENLOGIK: SYNTAX 4.1 Objektsprache und Metasprache 4.2 Gebrauch und Erwähnung 4.3 Metavariablen: Verallgemeinerndes Sprechen über Ausdrücke von AL 4.4 Die Sprache der Aussagenlogik 4.5 Terminologie

Mehr

1 ÜBERSETZER. Compilerbau 1

1 ÜBERSETZER. Compilerbau 1 1 ÜBERSETZER 1 A.V.Aho, J.D.Ullmann: Principles of Compiler Design, Addison Wesley (1977) J.Amsterdam: Building a computer in Software, BYTE (Okt. 1985) Programming Project: A SIMPL Compiler, BYTE (Dez.

Mehr

Einführung in die Systemprogrammierung

Einführung in die Systemprogrammierung Einführung in die Systemprogrammierung Sprachen und Übersetzer Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 4. Juni 2015 Sprachen vs. Übersetzer Sprache C11 Übersetzer GNU C

Mehr

Bundesverband Flachglas Großhandel Isolierglasherstellung Veredlung e.v. U g -Werte-Tabellen nach DIN EN 673. Flachglasbranche.

Bundesverband Flachglas Großhandel Isolierglasherstellung Veredlung e.v. U g -Werte-Tabellen nach DIN EN 673. Flachglasbranche. Bundesverband Flachglas Großhandel Isolierglasherstellung Veredlung e.v. U g -Werte-Tabellen nach DIN EN 673 Ug-Werte für die Flachglasbranche Einleitung Die vorliegende Broschüre enthält die Werte für

Mehr

Anwendungshinweise zur Anwendung der Soziometrie

Anwendungshinweise zur Anwendung der Soziometrie Anwendungshinweise zur Anwendung der Soziometrie Einführung Die Soziometrie ist ein Verfahren, welches sich besonders gut dafür eignet, Beziehungen zwischen Mitgliedern einer Gruppe darzustellen. Das Verfahren

Mehr

Auf der linken Seite wählen Sie nun den Punkt Personen bearbeiten.

Auf der linken Seite wählen Sie nun den Punkt Personen bearbeiten. Personenverzeichnis Ab dem Wintersemester 2009/2010 wird das Personenverzeichnis für jeden Mitarbeiter / jede Mitarbeiterin mit einer Kennung zur Nutzung zentraler Dienste über das LSF-Portal druckbar

Mehr

Kapitel 4. Einführung in den Scannergenerator Flex. Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9

Kapitel 4. Einführung in den Scannergenerator Flex. Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9 Kapitel 4 Einführung in den Scannergenerator Flex Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9 Generatoren für die lexikalische Analyse Scannergeneratoren werden eingesetzt um die

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 4 Die Datenbank Kuchenbestellung In diesem Kapitel werde ich die Theorie aus Kapitel 2 Die Datenbank Buchausleihe an Hand einer weiteren Datenbank Kuchenbestellung

Mehr

Lineare Funktionen. 1 Proportionale Funktionen 3 1.1 Definition... 3 1.2 Eigenschaften... 3. 2 Steigungsdreieck 3

Lineare Funktionen. 1 Proportionale Funktionen 3 1.1 Definition... 3 1.2 Eigenschaften... 3. 2 Steigungsdreieck 3 Lineare Funktionen Inhaltsverzeichnis 1 Proportionale Funktionen 3 1.1 Definition............................... 3 1.2 Eigenschaften............................. 3 2 Steigungsdreieck 3 3 Lineare Funktionen

Mehr

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4. Agenda für heute, 4. Mai, 2006 Programmierparadigmen Imperative Programmiersprachen In Prozeduren zusammengefasste, sequentiell ausgeführte Anweisungen Die Prozeduren werden ausgeführt, wenn sie als Teil

Mehr

Grafische Interaktionssysteme/ dynamische Visualisierung des endlichen Automaten

Grafische Interaktionssysteme/ dynamische Visualisierung des endlichen Automaten Sprachliche Informationsverarbeitung 29.01.2007 HS Intelligente Systeme Prof. Dr. J. Rolshoven (WS 06/07) Grafische Interaktionssysteme/ dynamische Visualisierung des endlichen Automaten Referentin: Melinda

Mehr

Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden?

Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden? Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden? Anforderung Durch die Bearbeitung einer XML-Datei können Sie Ihre eigenen Dokumentationen (z.b. PDF-Dateien, Microsoft Word Dokumente

Mehr

Theoretische Informatik 2 (WS 2006/07) Automatentheorie und Formale Sprachen 19

Theoretische Informatik 2 (WS 2006/07) Automatentheorie und Formale Sprachen 19 Inhalt 1 inführung 2 Automatentheorie und ormale prachen Grammatiken Reguläre prachen und endliche Automaten Kontextfreie prachen und Kellerautomaten Kontextsensitive und yp 0-prachen 3 Berechenbarkeitstheorie

Mehr

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007 Fachhochschule Bonn-Rhein-Sieg University of Applied Sciences Fachbereich Informatik Prof. Dr. Peter Becker Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Mehr

Rente = laufende Zahlungen, die in regelmäßigen Zeitabschnitten (periodisch) wiederkehren Rentenperiode = Zeitabstand zwischen zwei Rentenzahlungen

Rente = laufende Zahlungen, die in regelmäßigen Zeitabschnitten (periodisch) wiederkehren Rentenperiode = Zeitabstand zwischen zwei Rentenzahlungen 5.2. entenrechnung Definition: ente = laufende Zahlungen, die in regelmäßigen Zeitabschnitten (periodisch) wiederkehren entenperiode = Zeitabstand zwischen zwei entenzahlungen Finanzmathematisch sind zwei

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Brückenkurs Mathematik TU Dresden 2015 Lineare Gleichungssysteme Schwerpunkte: Modellbildung geometrische Interpretation Lösungsmethoden Prof. Dr. F. Schuricht TU Dresden, Fachbereich Mathematik auf der

Mehr

Wie halte ich Ordnung auf meiner Festplatte?

Wie halte ich Ordnung auf meiner Festplatte? Wie halte ich Ordnung auf meiner Festplatte? Was hältst du von folgender Ordnung? Du hast zu Hause einen Schrank. Alles was dir im Wege ist, Zeitungen, Briefe, schmutzige Wäsche, Essensreste, Küchenabfälle,

Mehr

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6 Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in

Mehr

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch Ein Blick voraus des Autors von C++: Bjarne Stroustrup 04.06.2005 Conrad Kobsch Inhalt Einleitung Rückblick Nur eine Übergangslösung? Was würde C++ effektiver machen? Quelle 2 Einleitung Wo steht C++,

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

Theorie der Informatik

Theorie der Informatik Theorie der Informatik 6. Formale Sprachen und Grammatiken Malte Helmert Gabriele Röger Universität Basel 17. März 2014 Einführung Beispiel: Aussagenlogische Formeln Aus dem Logikteil: Definition (Syntax

Mehr

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Inhalt SWP Funktionale Programme (2. Teil) Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Interpreter für funktionale Sprache

Mehr

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen reguläre Grammatiken/prachen Beschreibung für Bezeichner in Programmiersprachen Beschreibung für wild cards in kriptsprachen (/* reguläre Ausdrücke */)?; [a-z]; * kontextfreie Grammatiken/prachen Beschreibung

Mehr

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen 1. Einführung Über die Tabellen-Auswertungen können Sie eigene Auswertungen nach Ihren Wünschen erstellen. Diese Auswertungen werden immer anhand der aktuellen Daten aus orgamax ermittelt, Sie können also

Mehr

Ein neues System für die Allokation von Spenderlungen. LAS Information für Patienten in Deutschland

Ein neues System für die Allokation von Spenderlungen. LAS Information für Patienten in Deutschland Ein neues System für die Allokation von Spenderlungen LAS Information für Patienten in Deutschland Ein neues System für die Allokation von Spenderlungen Aufgrund des immensen Mangels an Spenderorganen

Mehr

Güte von Tests. die Wahrscheinlichkeit für den Fehler 2. Art bei der Testentscheidung, nämlich. falsch ist. Darauf haben wir bereits im Kapitel über

Güte von Tests. die Wahrscheinlichkeit für den Fehler 2. Art bei der Testentscheidung, nämlich. falsch ist. Darauf haben wir bereits im Kapitel über Güte von s Grundlegendes zum Konzept der Güte Ableitung der Gütefunktion des Gauss im Einstichprobenproblem Grafische Darstellung der Gütefunktionen des Gauss im Einstichprobenproblem Ableitung der Gütefunktion

Mehr

Kompetitive Analysen von Online-Algorithmen

Kompetitive Analysen von Online-Algorithmen Kompetitive Analysen von Online-Algorithmen jonas echterhoff 16. Juli 004 1 Einführung 1.1 Terminologie Online-Algorithmen sind Algorithmen, die Probleme lösen sollen, bei denen Entscheidungen getroffen

Mehr

Anwendertreffen 20./21. Juni

Anwendertreffen 20./21. Juni Anwendertreffen Verbindungsmittelachsen VBA Allgemein Die Verbindungsmittelachsen werden nun langsam erwachsen. Nach zwei Jahren Einführungszeit haben wir bereits viele Rückmeldungen mit Ergänzungswünschen

Mehr

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Mitgliederbereich (Version 1.0) Bitte loggen Sie sich in den Mitgliederbereich mit den Ihnen bekannten Zugangsdaten

Mehr

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

Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x), Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 25. August 2014 Programmier-Labor 04. + 05. Übungsblatt Aufgabe 21: a) Schreiben Sie eine Methode

Mehr

Erstellen eigener HTML Seiten auf ewon

Erstellen eigener HTML Seiten auf ewon ewon - Technical Note Nr. 010 Version 1.2 Erstellen eigener HTML Seiten auf ewon 30.08.2006/SI Übersicht: 1. Thema 2. Benötigte Komponenten 3. Funktionsaufbau und Konfiguration 3.1. Unterpunkt 1 3.2. Unterpunkt

Mehr

1. Einführung 2. 2. Erstellung einer Teillieferung 2. 3. Erstellung einer Teilrechnung 6

1. Einführung 2. 2. Erstellung einer Teillieferung 2. 3. Erstellung einer Teilrechnung 6 Inhalt 1. Einführung 2 2. Erstellung einer Teillieferung 2 3. Erstellung einer Teilrechnung 6 4. Erstellung einer Sammellieferung/ Mehrere Aufträge zu einem Lieferschein zusammenfassen 11 5. Besonderheiten

Mehr

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik Grundlagen der Informatik II Teil I: Formale Modelle der Informatik 1 Einführung GdInfoII 1-2 Ziele/Fragestellungen der Theoretischen Informatik 1. Einführung abstrakter Modelle für informationsverarbeitende

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr