Compilerbau. Bachelor-Programm. im SoSe Prof. Dr. Joachim Fischer Dr. Klaus Ahrens Dr. Andreas Kunert Dipl.-Inf.

Ähnliche Dokumente
7. Syntax: Grammatiken, EBNF

Alphabet, formale Sprache

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

Einführung in die Informatik. Programming Languages

Definition Compiler. Bekannte Compiler

Compilerbau für die Common Language Run-Time

Kapitel IV Formale Sprachen und Grammatiken

Sprachen sind durch folgenden Aufbau gekennzeichnet:

Grundlagen der Programmierung 3 A

Grammatiken. Grammatiken sind regelbasierte Kalküle zur Konstruktion von Systemen und Sprachen Überprüfung von Systemen und Sprachen

Einführung in die Informatik. Programming Languages

Grammatiken. Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V. Startsymbol S V. Kurzschreibweise G = (V, Σ, P, S)

Kapitel 2. Methoden zur Beschreibung von Syntax

Mehrdeutige Grammatiken

Grundlagen der Programmierung 2 (Comp-A)

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme

Grundlagen der Programmierung 2 (Comp-A)

Grundlagen der Programmierung 3 A

Theorie der Informatik. Theorie der Informatik. 6.1 Einführung. 6.2 Alphabete und formale Sprachen. 6.3 Grammatiken. 6.4 Chomsky-Hierarchie

Kontextfreie Grammatiken

Theoretische Informatik I

Syntax von Programmiersprachen

Syntax von Programmiersprachen

Einführung. (Compiler) Prof. Dr. Oliver Braun. Letzte Änderung: :49. Einführung 1/26

Mehrdeutige Grammatiken

Definitionen/Vorarbeit zum Thema Java

Kapitel 5: Syntaxdiagramme und Grammatikregeln

Software Entwicklung 2. Übersetzerbau 1

Vorlesung Automaten und Formale Sprachen Sommersemester Beispielsprachen. Sprachen

Inhalt Kapitel 11: Formale Syntax und Semantik

Programmiersprachen und Übersetzer

Sprachanalyse. Fachseminar WS 08/09 Dozent: Prof. Dr. Helmut Weber Referentin: Nadia Douiri

Varianten endlicher Automaten

Abschnitt 5. Grammatiken

2.2 Syntax, Semantik und Simulation

Compiler. Einführung. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München. Letzte Änderung:

Compiler: Einführung

Kontextfreie Sprachen. Automaten und Formale Sprachen alias Theoretische Informatik. Sommersemester Kontextfreie Sprachen

Es gibt keinen Algorithmus zum Schreiben eines Programms bzw. Algorithmus.

Kapitel 2: Methoden zur Beschreibung von Syntax

Lexikalische Programmanalyse der Scanner

Formale Sprachen. Grammatiken und die Chomsky-Hierarchie. Rudolf FREUND, Marian KOGLER

Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen -

Kapitel 2: Formale Sprachen Gliederung. 0. Grundbegriffe 1. Endliche Automaten 2. Formale Sprachen 3. Berechnungstheorie 4. Komplexitätstheorie

3 Syntax von Programmiersprachen

Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen -

Pumping-Lemma 2 Pumping-Lemma Sei L eine von einem endlichen Automaten erkannte Sprache. Dann existiert eine natürliche Zahl p N derart, dass jedes Wo

FORMALE SYSTEME. 3. Vorlesung: Endliche Automaten. TU Dresden, 17. Oktober Markus Krötzsch

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 45

Theoretische Informatik Mitschrift

WS06/07 Referentin: Katharina Blinova. Formale Sprachen. Hauptseminar Intelligente Systeme Dozent: Prof. Dr. J. Rolshoven

Syntax von Programmiersprachen

Was bisher geschah Chomsky-Hierarchie für Sprachen: L 0 Menge aller durch (beliebige) Grammatiken beschriebenen Sprachen L 1 Menge aller monotonen

Übersicht: Inhalt und Ziele. Kapitel 2: Methoden zur Beschreibung von Syntax. Aufbau von Programmen. Syntax von Programmiersprachen

3. Vorlesung: Endliche Automaten Markus Kr otzsch Lehrstuhl Wissensbasierte Systeme

Daten und Algorithmen

Compiler; Übersetzungsprogramme. Grundlagen der Programmierung 3 A. Compiler für Programmiersprachen. Phasen eines Compilers

Informatik II SS Der Kompilationsprozess (-phasen) Schreiben des Programms. Die Organisation eines typischen Compilers

Grammatiken und ANTLR

Fragenkatalog 2. Abgabegespräch Formale Modellierung 3 Reguläre Sprachen

Theoretische Informatik. Grammatiken. Grammatiken. Grammatiken. Rainer Schrader. 9. Juli 2009

Grundlagen der Theoretischen Informatik

Automaten und Formale Sprachen alias Theoretische Informatik. Sommersemester 2011

3 Syntax von Programmiersprachen

Grundlagen der Informatik III Wintersemester 2010/ Vorlesung Dr.-Ing. Wolfgang Heenes

Formalismen für REG. Formale Grundlagen der Informatik 1 Kapitel 7 Kontextfreie Sprachen. Das Pumping Lemma. Abschlusseigenschaften

Theoretische Informatik I

Von der Grammatik zum AST

Sei Σ ein endliches Alphabet. Eine Sprache L Σ ist genau dann regulär, wenn sie von einem regulären Ausdruck beschrieben werden kann.

3.1 Reservierte Wörter

Compilerbau. Bachelor-Programm. im SoSe Prof. Dr. Joachim Fischer Dr. Klaus Ahrens Dr. Andreas Kunert Dipl.-Inf.

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

Formale Sprachen und Grammatiken

Grundlagen der Theoretischen Informatik / Einführung in die Theoretische Informatik I

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Sprachen und Programmiersprachen

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

Deterministischer Kellerautomat (DPDA)

9.4 Grundlagen des Compilerbaus

Grundlagen der theoretischen Informatik

Theoretische Informatik I

Theoretische Grundlagen der Informatik. Vorlesung am 8. Januar INSTITUT FÜR THEORETISCHE INFORMATIK

Definition 4 (Operationen auf Sprachen) Beispiel 5. Seien A, B Σ zwei (formale) Sprachen. Konkatenation: AB = {uv ; u A, v B} A + = n 1 An

DisMod-Repetitorium Tag 4

Adventure-Problem. Vorlesung Automaten und Formale Sprachen Sommersemester Adventure-Problem

Interdisziplinäre fachdidaktische Übung: Modelle für Sprachen in der Informatik. SS 2016: Grossmann, Jenko

Automaten und formale Sprachen Klausurvorbereitung

Formale Methoden 1. Gerhard Jäger 28. November Uni Bielefeld, WS 2007/2008 1/15

Informatik III - WS07/08

2.1 Allgemeines. Was ist eine Sprache? Beispiele:

Transkript:

Bachelor-Programm Compilerbau im SoSe 2014 Prof. Dr. Joachim Fischer Dr. Klaus Ahrens Dr. Andreas Kunert Dipl.-Inf. Ingmar Eveslage fischer@informatik.hu-berlin.de J.Fischer 1.1

Was ist ein Compiler? Ein Compiler ist A Compiler auch Kompiler; englisch für zusammentragen bzw. lateinisch compilare aufhäufen ein Computerprogramm, B das ein (anderes) Programm, das in einer bestimmten Programmiersprache geschrieben ist, in eine bestimmte Form so überführt wird, die von einem Computer ausgeführt werden kann. nach welchen Prinzipien erfolgt die Ausführung? 1.2

Spektrum von Rechnern / Prozessoren Electronic Numerical Integrator and Computer (ENIAC) 1946 ~ 32-Bit-Chipsatz 1983; Advanced RISC Machines (ARM) Berechnung ballistischer Tabellen Mobile-Phone, PDAs, Router Tablet-Computersysteme und Spielkonsolen 1.3

Stabile konzeptionelle Randbedingungen für den Compilerbau (1) die Rechnerarchitektur als 1.4

Stabile konzeptionelle Randbedingungen für den Compilerbau (2) Prinzipien, die durch die Architektur bestimmt sind Struktur des Rechners ist unabhängig vom zu lösenden Problem. Programme müssen im Speicher abgelegt werden. Für Daten, Programme und Resultate wird derselbe Speicher genutzt. Dadurch können alle Daten im Speicher sowohl als Programme als auch als Eingabedaten interpretiert werden. Der Speicher ist eindimensional in fortlaufenden Zellen adressiert. Aufeinanderfolgende Programmbefehle folgen auch im Speicher aufeinander. Von der eigentlichen Programmfolge kann durch Sprungbefehle abgewichen werden. Daten werden grundsätzlich binär kodiert. Es existiert eine Reihe von Standardfunktionen für arithmetische, logische und Transport- Befehle sowie bedingte Sprünge 1.5

Stabile konzeptionelle Randbedingungen für den Compilerbau (3) Prinzipien, bestimmt durch die Theorie der formalen Sprachen Algol 60 Report führte bereits die grammatikalische Definition der Syntax der Sprache als formale Definition unter Verwendung der Backus-Naur-Form als Notationstechnik ein, die bald allgemein üblich wurde 1.6

Compiler Übersetzer (aber nicht allgemein benutzt) Ein Übersetzer übersetzt ein Programm aus einer formalen Quellsprache in ein semantisches Äquivalent in einer formalen Zielsprache Compiler sind spezielle Übersetzer, die Programmcode aus problemorientierten Programmiersprachen, (sogenannten Hochsprachen) in eine Assemblersprache, maschinell ausführbare Maschinensprache oder Bytecode überführen. 1.7

Unsere Definition Ein Compiler ist ein Computerprogramm, das ein (anderes) Programm, das in einer bestimmten Programmiersprache geschrieben ist, in eine bestimmte Form so überführt wird, die von einem Computer ausgeführt werden kann: eine Assemblersprache, maschinell ausführbare Maschinensprache oder Bytecode überführen. Ein Compiler, der den Quellcode einer Hochsprache in den Quellcode einer anderen Hochsprache übersetzt, wird als Transcompiler bezeichnet (Beispiel: Pascal C) 1.8

Compilationsprozess Ziel: Überführung eines Programms einer Sprache in ein Programm einer anderen Sprache zur Bewältigung dieser (i. allg. sehr komplexen) Aufgabe wird sie in - einzelne, - voneinander abgrenzbare, - leichtere Aufgaben gegliedert Lexikalische Analyse Syntaktische Analyse Semantikanalyse Codegenerierung Optimierung Fehlerbehandlung Aufgaben werden in einem wohl strukturierten Organisationsprozess (Compilationsprozess) behandelt 1.9

Struktur der LV Teil I Die Programmiersprache C Teil II Methodische Grundlagen des Compilerbaus Teil III (Praktikum) Entwicklung von Komponenten eines Compilers zweite Programmiersprache in der BA- Ausbildung (neben Java) universell, hardware-nah keine OO-Sprache Präprozessor, Pointer-Konzept Unix (1973), Sprache für eingebettete Systeme Dr. Ahrens 3 Vorlesungen 17.4., 24.4., 29.4. lange Compiler-Tradition (effiziente Codegeneratoren für verschiedenste Plattformen) ESZ, Raum 0.310 9:15 Uhr 1.10

Struktur der LV Teil I Die Programmiersprache C Prof. Dr. Fischer Vorlesungen Di, Do Teil II Methodische Grundlagen des Compilerbaus Teil III (Praktikum) Entwicklung von Komponenten eines Compilers Compilationsprozess Formalismen zur Sprachbeschreibung Lexikalische Analyse: der Scanner der Parser Parsergeneratoren: Yacc, Bison Statische Semantikanalyse Ausblick Laufzeitsystem, ESZ, Raum 0.310 9:15 Uhr Codegenerierung 1.11

Struktur der LV 14-tägige Termine 8 Praktikumsgruppen, 3 Praktikumsleiter Teil I Die Programmiersprache C Teil II Methodische Grundlagen des Compilerbaus Teil III (Praktikum) Entwicklung von Komponenten eines Compilers Dr. K. Ahrens Dr. A. Kunert Dipl.-Inf. I. Eveslage einfache Quellsprache (an C angelehnt) Analysekomponenten in C Compilergenerierungswerkzeuge zur Erzeugung von Komponenten für die lexikalische, syntaktische und semantische Analyse Di 11-13 Uhr, ESZ Raum 0.310 (nach der Vorlesung) Mi 13-15 Uhr, ESZ Raum 0.313 Do 11-13 Uhr, ESZ Raum 1.305 (nach der Vorlesung) Fr 9-11 Uhr, ESZ Raum 1.303 1.12

Position Kapitel 1 Compilationsprozess Kapitel 2 Formalismen zur Sprachbeschreibung Kapitel 3 Lexikalische Analyse: der Scanner Einführung Compiler, Phasen, Pässe Kapitel 4 Syntaktische Analyse: der Parser Kapitel 5 Parsergeneratoren: Yacc, Bison Kapitel 6 Statische Semantikanalyse Kapitel 7 Ausblick: Laufzeitsystem, Codegenerierung 1.13

Compilationsprozess (Forts.) einem Compilationsprozess können weitere Verarbeitungsprozesse vor- und nachgeschaltet sein (die nicht zur Compilation gerechnet werden) typische Beispiele - vorher: Präprozessorverarbeitung (s. C) - nacher: Assemblierung, Programmverbindung, Laden des Programms 1.15

1.20

Compiler-Phase, Compiler-Pass, Zwischencode Compilerphase eigenständige abgegrenzte Aufgabe des Compilationsprozesses Compilerpass in sich abgeschlossene separate oder auch z.t. kombinierte Realisierung einzelner Phasen durch einen Compiler Zwischencode temporäre Datenstrukturen (u.u. externe Dateien) über die die Compilerpässe untereinander kommunizieren 1.21

Vor- und Nachbereitung einer Compilation einem Compilationsprozess können weitere Verarbeitungsprozesse vor- und nachgeschaltet sein (die nicht zur eigentlichen Übersetzung gerechnet werden) typische Beispiele - vorher: Präprozessorverarbeitung (s. Sprache C) - nacher: Assemblierung, Programmverbindung, Laden des Programms 1.22

Compilerpass Compilerpässe als Transformationsschritte eines Compilers A Compiler B Unterscheidung zwischen Einpasscompiler: Programm wird nur einmal durchmustert A Einpass- Compiler B Mehrpasscompiler: besteht aus verschiedenen Übersetzungsprogrammen/Pässen (ZWC = Zwischencode) A Pass 1 ZWC 1 ZWC n Pass n B Mehrpass-Compiler... 1.23

Kriterien für Passeinteilung Ziel-Rechnerarchitektur (Hauptspeicherausstattung): Einpass-Compiler benötigen mehr Hauptspeicher Eigenschaften der Quellsprache: einige Sprachen lassen sich nicht in einem Pass übersetzen Effizienz des Compilers: Einpass-Compiler sind schneller Effizienz des erzeugten Programms: Mehrpass-Compiler generieren i.d.r. effizienteren Code Lesbarkeit/Wartbarkeit: Mehrpass-Compiler günstiger Portabilität: Mehrpass-Compiler günstiger benötigter Zw-Code kann heute meist im HS abgelegt werden 1.24

Pass-Strukturen ausgewählter Compiler Pascal: Pascal-360-Compiler Einpass-Compiler: Objektcode für IBM 360/370 Modula-2: M-Compiler (Wirth) Vierpass-Compiler 1. lexikalische und syntaktische Analyse, semantische Analyse (Aufbau der Symboltabelle) 2. semantische Analyse (Deklaration) 3. semantische Analyse (Prozedurkörper) 4. M-Code-Generierung 1.25

Pass-Strukturen ausgewählter Compiler C: GNU C-Compiler Mehrpass-Compiler 1. C attributierter Syntaxbaum (Darstellung des Quelltextes) lexikalische, syntaktische, semantische Analyse 2. attributierter Syntaxbaum virtueller Code (RTL-Code) Zwischencodegenerierung Register-Transfer-Logic-Code einheitlicher Zielcode in der GNU-Sprachfamilie 3. RTL-Code RTL-Code-Optimierung... 20. RTL-Code RTL-Code-Optimierung plattformunabhängig 21. RTL-Code Assemblercode (plattformabhängig) danach: betriebssystemabhängige Assembler, Objektlinker Maschinencode 1.26

Qualitäten eines Compilers Erzeugung von korrektem Code Effizienz des erzeugtes Programms Effizienz des Compilers Übersetzungszeit ~ Programmgröße (Unterstützung separater Übersetzungen) gute Fehlerdiagnostik gute Debugger-Integration Möglichkeit zum Aufruf von Programmen in anderen Sprachen konsistente, vorhersehbare Optimierung 1.27

Traditioneller Compiler-Ansatz Analyse Synthese Quellprogramm Frontend Zwischencode Backend Zielcode Fehlerausgabe Lösen des sogenannten Wortproblems: Erkennung eines Programm als gültiges Wort einer Sprache Problem der Theoretischen Informatik - Frontend erzeugt aus Quellprogramm korrekten Zwischencode - Backend erzeugt vom Zwischencode korrekten Zielcode - Zwischencode zur Unterstützung mehrerer Quellsprachen/Zielsprachen 1.28

Position Kapitel 1 Compilationsprozess Kapitel 2 Formalismen zur Sprachbeschreibung Kapitel 3 Lexikalische Analyse: der Scanner Kapitel 4 Syntaktische Analyse: der Parser Kapitel 5 Parsergeneratoren: Yacc, Bison Einführung Compiler, Phasen, Pässe Alphabete, Sprachen Grammatiken, Automatenmodelle Kapitel 6 Statische Semantikanalyse Kapitel 7 Ausblick: Laufzeitsystem, Codegenerierung 1.29

Formalismen im Compiler-Frontend (Big Picture) Reguläre Sprache z.b. Pascal Sprache zur Festlegung erlaubter Pascal-Token Bildungsvorschrift: Reguläre Ausdrücke Zeichenkette Programm in Sprache L Kontextsensitive Sprache 1b Scanner DFA 1a Frontend Token als Wörter einer regulären Sprache G= (V, S, P, S) Parser Kontextfreie Grammatik 2b Bildungsvorschrift: Syntaxregeln PDA 2a Programm- Strukturen als Wörter einer kontextfreien Sprache 3 Konsequenz: Sonderbehandlung von Kontextabhängigkeiten A X Y Z 4 Syntaxbaum als Zwischencode 1.30

Alphabet zentrales Konzept für Sprachen, Zustandsautomaten und Grammatiken Definition: Alphabet endliche Menge S von Zeichen mit einer darauf erklärten vollständigen Ordnung (<- Relation) Beispiele: S = {0, 1} binäres Alphabet, S = ascii-zeichensatz, S = akzeptierte Token-Menge eines Scanners jedes (textuelle) Computerprogramm ist eine wohlgeordnete Aneinanderreihung von Symbolen aus einem Alphabet (als Menge zulässiger Token) jedes Symbol (Token) eines Computerprogramms ist eine wohlgeordnete Aneinanderreihung von Zeichen aus einem Alphabet (als Menge zulässiger Zeichen einer Sprache) 1.31

Zeichenkette (Wort) sei S beliebiges Alphabet Eine Zeichenkette (Wort) ist eine endliche Folge von beliebigen Zeichen a i aus S Beispiel: S = {0, 1} Zeichenkette: 01101 1.32

Weitere Begriffe leere Zeichenkette ist eine Zeichenkette (Wort), das keine Zeichen enthält wird mitεe bezeichnet kann aus jedem Alphabet stammen Länge einer Zeichenkette als Anzahl der Positionen Beispiel 011 = 3, e = 0 Potenzen eines Alphabets S k ist die Menge aller Zeichenketten der Länge k von Zeichen/Symbolen aus S 1.33

Zeichenkette (Wort): formal Induktive Definition: Zeichenkette (ZK) über S (1) die leere Zk e ist eine ZK über S (2) wenn a eine beliebige ZK über S ist, dann ist auch xa eine ZK über S, falls x S) ß ist g.d. eine ZK über S, wenn sie laut (1) oder (2) gebildet wurde Bem.: eine ZK über S wird auch als Wort bezeichnet 1.34

Spezielle Wortmengen leeres Wort e: Ø S Wort, bestehend aus keinem Zeichen S 0 {a a: Ø S }= {e} Menge der Worte der Länge 0 S n {a a: {1,,n} S } Menge der Worte der Länge n S * S n Menge aller Worte über S n 0 S + S n Menge aller nichtleeren Worte n 1 über S Beispiel: S = {0, 1}, dann S 2 = {00, 01, 10, 11} S*= {0, 1}*= {e, 0, 1, 00, 01, 10, 11, 000, } 1.35

Sprachen (erste, noch unbefriedigende Definition) Formale Sprachen über ein Alphabet S sind Teilmengen von S* L S* (L ist eine Sprache über das Alphabet S) Eine Sprache ist die (möglicherweise unendliche) Menge zulässiger Wörter. Beispiel: {w w ist ein syntaktisch fehlerfreies C-Programm} Aufgabe: Zulässigkeit formal fassen Bem: Es ist nicht verlangt, dass dabei jedes Zeichen des Alphabets benutzt wird: sei L S* eine Sprache, dann ist auch L S1* mit S1 S eine Sprache 1.36

Operationen auf Sprachen Seien L und M beliebige Sprachen Operation Definition Vereinigung von L und M: L M Verkettung von L und M: L M Hülle von L: L* positive Hülle von L: L + 1.37

Operationen auf Sprachen Seien L und M beliebige Sprachen Operation Definition Vereinigung von L und M: L M L M = {s sl oder sm } Verkettung von L und M: L M L M = {xy: xl und ym} Hülle von L: L* L* = i=0 L i /* i als Wortlänge */ positive Hülle von L: L + L + = i=1 L i L 0= {e}, Wort der Länge 0 1.38

Wort-Problem als praktisches Problem des Compilerbaus Frage: Gehört ein gegebenes Wort zu einer bestimmten Sprache? Definition: Allgemeines Wortproblem Geg. sei eine Zeichenkette w in S*. ES ist zu entscheiden, ob w in L (L S*) enthalten ist oder nicht. ein Problem der Theoretischen Informatik aber auch zentrales Problem des Compilerbaus: Ist ein gegebenes Programm (als Zeichenkette w) ein zulässiges Programm der Sprache L? 1.39

Zusammenhang: Alphabet, Wort, Sprache S Zeichen eines Alphabets beliebige Aneinanderreihung S* Wörter über einem Alphabet S Aneinanderreihung nach Regeln L S* Wörter einer Sprache L über S Regeln legen fest, welche Teilzeichenketten zulässige Token der Sprache (Reguläre Ausdrücke) sind welche Worte aus S* zu L gehören (Syntaxregeln) welche Bedeutung die Wörter haben (Semantikregeln) Lexikalische Analyse Syntaxanalyse Semantikanalyse 1.40

Prinzipien zur Definition einer Sprache 1. Aufzählung aller gültigen Wörter (nur, wenn es nicht zu viele sind) 2. Erkennung sei a S*, so ist zu prüfen, ob a L (Prüfung durch einen Algorithmus) Endliche Automaten benutzen 3. Generierung/ Berechnung indem Wörter aus L durch Anwendung von Regeln gebildet werden Grammatiken als Regelwerke 1.41

Position Kapitel 1 Compilationsprozess Kapitel 2 Formalismen zur Sprachbeschreibung Kapitel 3 Lexikalische Analyse: der Scanner Kapitel 4 Syntaktische Analyse: der Parser Kapitel 5 Parsergeneratoren: Yacc, Bison Einführung Compiler, Phasen, Pässe Formalismen zur Sprachbeschreibung Alphabete, Sprachen Grammatiken Automatenmodelle Kapitel 6 Statische Semantikanalyse Kapitel 7 Ausblick: Laufzeitsystem, Codegenerierung 1.42

Formalismus: Grammatik Grammatik: übliche Methode zur formalen Beschreibung/ Definition einer Computersprache - eingeführt von: N. Chomsky (MIT) hoffte, natürliche Sprachen beschreiben zu können - erstmal eingesetzt: J.W. Backus beim ersten FORTRAN-Compiler Backus-Naur-Form (BNF): einfache Notation zur Beschreibung von Grammatikregeln 1.43

BNF Notationsform von Produktionsregeln: Ableitungszeichen linke Seite ::= rechte Seite oder linke Seite rechte Seite Nichtterminalsymbole < > oder Kursiv-Schreibweise (Variablen) Terminalsymbole Symbole ohne <> -Klammerung oder ' ' Alternativen-Trennung 1.44

Grundidee von Grammatiken am Beispiel Beispiel-Regel (informal): jeder Bezeichner (Identifier) besteht aus - einem Buchstaben, - gefolgt von beliebig vielen Buchstaben oder Ziffern Formalisierungsvarianten Charakterisierung durch Sprachoperatoren L L L idf letter digit L letter L letter {' A', ' B',...,' Z ', ' a ', ' b',...,' z '} {' 0', '1',...,' 9' } L digit * Idf letter X X e letter X letter ' A' ' B '... ' Z ' ' a ' ' b'... ' z ' digit Kurzschreibweise für drei Regeln Charakterisierung durch Grammatik-Regeln ' 0' '1'... ' 9' digit X Idf X als Variable für jeden beliebigen Identifier Variable für beliebige ZK des Alphabets 1.45

Ableitung eines Wortes entsprechend der Grammatik Als Ableitung wird der Vorgang bezeichnet, ein Wort nach den Regeln einer formalen Grammatik zu erzeugen. a Idf a letter X Charakterisierung durch Grammatik-Regeln Idf letter X X e letter letter ' A' ' B '... ' Z ' ' a ' ' b'... ' z ' digit ' 0' '1'... ' 9' X digit X Anwendung einer Regel bedeutet, dass in dem bislang erzeugten Wort ein Teilwort, das einer linken Regelseite entspricht, durch die rechte Seite der Regel ersetzt wird (auch als Ableitung bezeichnet) Ableitungsschritte werden ausgehend von einem Startsymbol solange ausgeführt bis das entstandene Wort nur noch aus Terminal-Symbolen besteht - ACHTUNG: Reihenfolge der Schritte ist i.allg. nicht eindeutig jedes so erzeugte Wort gehört dann zu der von der Grammatik erzeugten oder definierten Sprache 1.46

Ableitung eines Wortes am Beispiel unter den Variablen einer Grammatik muss es ein festgelegtes Startsymbol geben. sei hier: Idf Ableitung eines Wortes als Bezeichner Idf letter X letter digitx letter digitdigitx letter digitdigit B digitdigit B 3digit B 31 1 4 4 2 6 angewendete Regel B31 ist ein gültiger Bezeichner als Wort der Sprache, die durch die Grammatik definiert ist 1 2 3 4 5 6 Charakterisierung durch Grammatik-Regeln Idf X X X letter ' A' letter ' B '... letter ' z ' digit... digit letter e letter X digit X ' 0' ' 9' X 1.47

Allgemeine Grammatikdefinition Definition: Grammatik (Typ 0: allgemein, ohne zusätzliche Einschränkungen)... ist ein 4-Tupel G= (V, S, P, S) mit V ist die (endliche) Menge der Variablen (Nichtterminalsymbole/ Metasymbole) der Grammatik sie wird benutzt, um die Grammatik zu strukturieren S ist die (endliche) Menge der Terminalsymbole mit S V = Ø in unserem Falle ist sie identisch mit der gültigen Token-Menge, die der Scanner liefert P (V S) + (V S)* ist die (endliche) Menge der Produktionsregeln, sie legt fest, wie Terminal- und Nicht-Terminalsymbole kombiniert werden können, um ein Wort der Sprache zu bilden S V ist als ausgezeichnetes Nicht-Terminalsymbol das Startsymbol 1.48

Produktionsregel und Ableitung P (V S) + (V S)* Produktionsregel: statt (a, ) häufig intuitive Notation a Definition: Ableitung (als Relation ) x, y, a,, ( V S) *, AV Idf letter X x y : a,,, A : x aa y a ( A, ) P beschreibt Ableitung einer ZK aus einer anderen: eine Variable wird ersetzt durch rechte Seite der Regel, die für diese Variable festgelegt ist 1.49

Grammatik-basierte Sprachen Definition: reflexiv-transitive Hülle * x, y, w x * i ( V S) y : x y ( x * y) ( w,..., w 1 n : x w 1... w n y) Eine ZK y ist genau dann mittels der Hülle aus einer ZK x ableitbar, wenn - die beiden entweder identisch sind oder aber sich y aus - einem oder - mehreren Zwischenschritten aus x Definition: Grammatik-basierte Sprache ableiten lässt. eine Grammatik G generiert eine Sprache L(G) * { xs * S x} L( G) : Menge aller Worte x, die sich aus dem Startsymbol S ableiten lassen 1.50

Erzeugung einer Sprache Grammatik: G Idf = (V, S, P, S) Menge aller ZK, die mit einem Buchstaben beginnen und dann mit einem beliebig langen (evtl. leeren) Wort gebildet aus Buchstaben und Ziffern enden Sprache: L(G Idf ) * * { xs S x} L( G) : { Idf X} { A, B,..., Z, a, b,... z,0,1,...,9} V, S S Idf P * V S ( V S) Idf letter X X e letter letter ' A' ' B '... ' Z ' ' a ' ' b'... ' z ' digit ' 0' '1'... ' 9' X digit X Alle Regeln von G Idf sind sehr einfach Grammatiken werden nach Regeltyp klassifiziert: Typ-0, Typ-1, Typ-2, Typ-3 und Sprachen nach ihren erzeugenden Grammatiken 1.51

Zusammenhang: Formale Sprache und Grammatik eine (allgemeine) Grammatik G bestimmt eine Sprache L(G) mit L(G) = {w *, S * w} w L(G) wird als Wort der Sprache L(G) bezeichnet Bem.: Sprachen, die für den Compilerbau spannend sein wollen, müssen eine effiziente Wort-Ableitung erlauben Grammatiktypen Typ-0: ohne Einschränkung Typ-1: kontextsensitiv Typ-2: kontextfrei Typ-3: regulär praktische Bedeutung der Klassifikation von Grammatiken, hinsichtlich dieser Eigenschaft: (1) reguläre Grammatiken (2) kontextfreie Grammatiken G Idf ist eine reguläre Grammatik L(G Idf ) ist eine reguläre Sprache 1.52

Äquivalenz von Grammatiken Grammatik: G 1 = (V 1, S, P 1, S 1 ) { Idf X} { A, B,..., Z, a, b,... z,0,1,...,9} V, 1 S S Idf P * 1 V S ( V S) 1 1 1 Grammatik: G 2 = (V 2, S, P 2, S 2 ) { Idf X} { A, B,..., Z, a, b,... z,0,1,...,9} V, S S Idf 2 P 2 * V S ( V S ) 2 2 2 Idf letter X Idf letter X letter X e letter X digit X X letter X digit X letter digit letter ' A' ' B '... ' Z ' ' a ' ' b'... ' z ' letter ' A' ' B '... ' Z ' ' a ' ' b'... ' z ' digit ' 0' '1'... ' 9' digit ' 0' '1'... ' 9' Definition: Äquivalenz von Grammatiken Seien G ( V, S, P, S ), G mit dem selben Alphabet S. G 1 und 1 G 2 1 1 ( V heißen äquivalent, 1 2 2, S, P, S 2 falls L( G ) L( G 2 1 ) zwei Grammatiken 2 ). 1.53

Klasseneinteilung von Grammatiken Definition: Grammatiktypen der Chomsky-Hierarchie Sei G ( V, S, P, S) eine Grammatik. G heißt kontextsensitiv oder vom Typ1, wenn für alle Re geln u v gilt : u v, kontextfrei oder vom Typ 2, wenn P V regulär oder vom Typ 3, wenn P V ( V S) ({ e} S SV ). *, A c A e A abc A A A e a ab Grammatik ohne Einschränkung nennt man Grammatik vom Typ-0 1.54