Vorlesung Compilertechnik Sommersemester 2008

Slides:



Advertisements
Ähnliche Präsentationen
Vorlesung Compilertechnik Sommersemester 2008
Advertisements

Programmierung 1 - Repetitorium
Kontextfreie Grammatiken
8. Formale Sprachen und Grammatiken
Imperative Programmierung
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUT Universität Paderborn Algorithmen und Komplexität Notationen A = ist eine endliche, nichtleere menge,
Grammatiken, Definitionen
Einige entscheidbare bzw. rekursiv aufzählbare Sprachen
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUT Universität Paderborn Algorithmen und Komplexität Grammatiken beschreiben Sprachen L µ *, indem.
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUT Universität Paderborn Algorithmen und Komplexität Reduktionen Def: L · L (L ist reduzierbar auf.
Christian Schindelhauer
Parser generieren Yet Another Compiler – Compiler YACC.
FH-Hof Extensible Markup Language Richard Göbel. FH-Hof Extensible Markup Language XML XML ist universeller Ansatz für die Strukturierung von Zeichenketten.
FH-Hof Grammatiken Richard Göbel. FH-Hof Begriffe Eine Grammatik definiert die Struktur (Syntax) einer Zeichenkette Eine Grammatik definiert nicht die.
Parser - Verfahren: Rekursiver Abstieg
Vorlesung Informatik 3 Einführung in die Theoretische Informatik (05 – Reguläre Ausdrücke) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 3 Einführung in die Theoretische Informatik (12 – Kellerautomaten, PDA) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 3 Einführung in die Theoretische Informatik (04 – Automaten mit ε-Transitionen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 3 Einführung in die Theoretische Informatik (17 –Turingmaschinen) Prof. Dr. Th. Ottmann.
M a r c – o l i v e r p a h l Informatik II – Kapitel 18 Übersetzung Zusammenfassung des Kapitel 18 Küchlin, Weber, Vorversion Einführung in die Informatik,
Prof. Dr. rer.nat. Ralph Großmann Fakultät Informatik / Mathematik Sommersemester 2012 Internet-Technologien XML-basierte Techniken Teil Metasprache der.
Prolog Grundkurs WS 98/99 Christof Rumpf
Reguläre Sprachen Karin Haenelt.
Reguläre Ausdrücke Karin Haenelt
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 1 Gisbert Dittrich; Claudio Moraga FBI Unido
? Grammatik  Orthographie ?
Beispiele für Ausdrucksalgebren
Agenda Motivation Formale Sprachen Compiler Compilerentwicklung
1 HEINZ NIXDORF INSTITUT Universität Paderborn Algorithmen und Komplexität Einführung in Berechenbarkeit, Formale Sprachen und Komplexitätstheorie Wintersemester.
Christian Schindelhauer
Einführung in Berechenbarkeit, Formale Sprachen und Komplexitätstheorie Wintersemester 2005/ Vorlesung Dominic Dumrauf.
Christian Schindelhauer
§14 Basis und Dimension (14.1) Definition: V sei wieder ein K-Vektorraum. Eine Menge B von Vektoren aus V heißt Basis von V, wenn B ist Erzeugendensystem.
§9 Der affine Raum – Teil 2: Geraden
§14 Basis und Dimension  (14.1) Definition: V sei wieder ein K-Vektorraum. Eine Menge B von Vektoren aus V heißt Basis von V, wenn B ist Erzeugendensystem.
§8 Gruppen und Körper (8.1) Definition: Eine Gruppe G ist eine Menge zusammen mit einer Verknüpfung, die jedem Paar (a,b) von Elementen aus G ein weiteres.
Grundkurs Theoretische Informatik, Folie 7.1 © 2006 G. Vossen,K.-U. Witt Grundkurs Theoretische Informatik Kapitel 7 Gottfried Vossen Kurt-Ulrich Witt.
Formale Sprachen Grundbegriffe für formale Sprachen
§10 Vektorraum. Definition und Beispiele
Christian Schindelhauer Wintersemester 2006/07 8. Vorlesung
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 13. Sitzung WS 02/03.
§10 Vektorraum. Definition und Beispiele
Formale Sprachen Grammatiken und die Chomsky-Hierarchie
Automaten, formale Sprachen und Berechenbarkeit II SoSe 2004 Prof. W. Brauer Teil 1: Wiederholung (Vor allem Folien von Priv.-Doz. Dr. Kindler vom WS 2001/02.
Städtisches Gymnasium Beverungen Friedel Berlage
Dieser nicht Fehler finden Algorithmus enthält einfach einen gravierenden welcher zu ist.
Beispiele: KFG 2.Teil Beispiel 1: Sei G eine Grammatik mit den folgenden Regeln: S  Ac | Bd A  aAb | ab B  aBbb | abb Definieren Sie.
Noam CHOMSKY, Sheila GREIBACH
Noam CHOMSKY, Sheila GREIBACH
Automaten, formale Sprachen und Berechenbarkeit II SoSe 2004 Prof. W. Brauer Teil 3: Potenzreihen und kontextfreie Sprachen (Vgl. Buch von A. Salomaa)
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Arne Vater Wintersemester 2006/07 28.
Christian Schindelhauer Wintersemester 2006/07 5. Vorlesung
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
Christian Schindelhauer Wintersemester 2006/07 3. Vorlesung
Arne Vater Wintersemester 2006/ Vorlesung
Christian Schindelhauer Wintersemester 2006/07 6. Vorlesung
Christian Schindelhauer Wintersemester 2006/07 2. Vorlesung
Informatik Formale Sprachen 1.2 Grammatiken formaler Sprachen
Mensch – Maschine - Kommunikation
Der Hund jagt die Katze. Theoretische Informatik Satz S P O
Institut für Softwarewissenschaft – Universität WienP.Brezany 1 Beispiele (Frist: ) Beispiel 1: Sei  = {a, b} ein Alphabet und Q = {q 0, q 1 } eine.
7. Formale Sprachen und Grammatiken
Inhalt Einordnung und Funktion der lexikalische Analyse Grundlagen
Kapitel 4:Die Chomsky Hierarchie
Syntax, Semantik, Spezifikation - Grundlagen der Informatik R. Hartwig Kapitel 3 / 1 Algebraische Hülle und Homomorphie A = [A, F ] sei  -Algebra. Eine.
? definierende Gleichungen  gültige Gleichungen ?
 Sortigkeit oder Arität
Sprachen und Programmiersprachen
§8 Gruppen und Körper (8.1) Definition: Eine Gruppe G ist eine Menge zusammen mit einer Verknüpfung, die jedem Paar (a,b) von Elementen aus G ein weiteres.
Teilbarkeit und Primzahlen
 Präsentation transkript:

Vorlesung Compilertechnik Sommersemester 2008 Grundlagen M. Schölzel

Zeichenketten Es sei  eine abzählbare Menge von Zeichen, Alphabet genannt. Eine Zeichenkette w ist eine totale Funktion: Für w schreiben wir auch: w(0)…w(n-1) n ist die Länge der Zeichenkette. Es gibt genau eine Zeichenkette der Länge 0; diese wird mit  bezeichnet. Eine Zeichenkette wird auch Wort genannt.

Formale Sprache n: Menge aller Zeichenketten über  mit der Länge n: *: Menge aller endlichen Zeichenfolgen über einem Alphabet : +: Menge aller nicht leeren endlichen Zeichenfolgen über einem Alphabet : Formale Sprache L: L  *

Syntax Syntax einer Sprache L legt fest, welche Zeichenketten über einem gegebenen Alphabet zur Sprache L gehören und welche nicht: Es ist syn(w) = 1 gdw. w  L syn ist damit die charakteristische Funktion (Entscheidungsfunktion) der Menge L.

Operationen auf Wort(meng)en Länge | . | : * eines Wortes ist definiert als: Verkettung .. : *** zweier Zeichenketten ist definiert als: Wir schreiben für    auch kurz . Komplexprodukt .. : (*)(*)(*) zweier Wortmengen ist definiert als: Die Zeichenkette   *ist Präfix der Zeichenkette   * (  ) gdw. eine Zeichenkette   * existiert, so dass  = .  ist echter Präfix von , falls ein   + existiert, so dass  = . Spiegelung  : ** ist definiert als: .

Grammatik Mittel zur konstruktiven Definition einer Sprache. Wichtig für den Compilerbau: Neben den Worten, die zu einer Sprache gehören, wird auch eine Struktur der Worte definiert. Grammatik G = (, M, R, S) mit   M = , S  M und R  ((  M)* - *)  (  M)* endlich Bezeichnungen:  Grundsymble/Terminalsymbole/Terminals M Metasymbole/Nicht-Terminalsymbole/Nonterminals V :=   M Vokabular Worte   * sind terminale Worte (Zeichenketten) Worte   (  M)* - * sind nichtterminale Worte (Zeichenketten) Jede Regel (l,r)  R besitzt eine linke Seite l und eine rechte Seite r (auch Alternative genannt)

Ableitungsrelation Durch die Regeln R einer Grammatik ist eine Ableitungsrelation definiert: Statt (a, b)   schreiben wir auch a  b für den Ableitungsschritt von a nach b Eine Folge von Ableitungsschritten a1  a2, a2  a3,…, an-1  an wird kurz als a1  a2  a3 …an-1  an geschrieben und als Ableitung bezeichnet. Durch Bildung des reflexiven und transitiven Abschlusses * von  kann die durch G erzeugte Sprache definiert werden als: Mit  n  wird eine Ableitung mit genau n Schritten bezeichnet Insbesondere folgt aus  0 , dass  =  Mit  +  wird eine Ableitung mit mindestens einem Schritt bezeichnet

Semantik Eine Möglichkeit die Semantik einer Programmiersprache zu beschreiben ist die denotationale Semantik Die Semantik ist dann eine Funktion, die jedem Wort einer Sprache L eine Bedeutung zuordnet: Bedeutungen sind in diesem Fall Funktionen, die einen Speicherzustand in einen anderen Speicherzustand transformieren Ein Speicherzustand ist eine Variablenbelegung Zu einem gegebenen Wort aus L kann seine Bedeutung mittels der Semantikfunktion basierend auf der Struktur des Wortes bestimmt werden.

Funktion eines Compiler Abstrakt kann ein Compiler damit wie folgt beschrieben werden: Q und Z seien zwei Alphabete Q  Q* sei eine Quellsprache Z  Z* sei eine Zielsprache Ein Compiler ist eine Funktion comp : Q*  Z  {error} mit Wichtig: Der Compiler kennt die Funktionen semQ und semZ nicht.

Chomsky-Hierarchie Die Chomsky-Hierarchie klassifiziert Grammatiken ausschließlich auf Grund der Struktur ihrer Regeln nach: Typ-0 – Grammatiken, Typ-1 – Grammatiken, Typ-2 – Grammatiken, Typ-3 – Grammatiken.

Typ-0 – Grammatiken Regeln entsprechen der allgemeinen Form: R  (V *- *)  V * Es ist 0 := {L(G) | G ist Typ 0 – Grammatik} genau die Menge der aufzählbaren Sprachen. Konsequenz: Nicht alle Sprachen aus 0 können mit Compilern übersetzt werden.

Typ-1 – Grammatiken Regeln entsprechen der Form R  (V *- *)  V + mit der Einschränkung, dass für alle (, )  R: ein A  M, ,   V*,   V+ ex., so dass  = A und  =  (kontextsensitive Regeln) oder ||  || (nicht verkürzende Regeln) gilt. Es ist 1 := {L(G) | G ist Typ-1 – Grammatik} eine Menge von entscheidbaren Sprachen. In dieser Klasse liegen praktisch alle Programmiersprachen

Typ-2 – Grammatiken: kontextfreie Grammatiken (kfG) Regeln entsprechen der Form: R  M  V * Es ist 2 := {L(G) | G ist Typ-2 – Grammatik} die Menge der kontextfreien Sprachen. Reihenfolge der Ersetzung der Metasymbole in einem Wort beeinflusst nicht dessen Ableitbarkeit zu einer terminalen Zeichenkette. Diese Klasse ist besonders wichtig für den Compilerbau. Mittels kontextfreier Grammatiken wird eine Obermenge (in der Regel sogar eine echte Obermenge) K einer Programmiersprache P beschrieben: P  K.

Typ-3 – Grammatiken Regelmenge entspricht der Form: R  M  ((M  *)  *) oder R  M  ((*  M)  *) Es ist 3 := {L(G) | G ist Typ-3 – Grammatik} die Menge der regulären Sprachen. Diese Klasse von Sprachen spielt bei der Zerlegung des Quelltextes eine Rolle (vgl. Scanner)

Backus-Naur-Form (BNF) Schreibweise für die Regeln einer kontextfreien Grammatik Wir fassen Grammatikregeln (A,1),…, (A,n) mit der gleichen linken Seite zu einer BNF-Regel A ::= 1 | … | n zusammen (i wird die i-te Alternative genannt, kurz: [A,i]). Alternativen sind also beginnend bei 1 nummeriert und durch | getrennt. Grundsymbole werden in Gänsefüßchen eingefasst. Metasymbole werden ohne Gänsefüßchen geschrieben und dürfen aus Buchstaben, Zahlen und Unterstrich zusammengesetzt werden. Das Metasymbol auf der linken Seite der ersten BNF-Regel wird als Startsymbol aufgefasst. Beispiel: S ::= "a" S "b" S | "b" S "a" S | A A ::=  | "c" A

Notationen und Bezeichnungen für kfG Bei einer Ableitung 1  2  …  n handelt es sich um eine Linksableitung/Rechtsableitung, wenn in jedem Ableitungsschritt das am weitesten links/rechts stehende Metasymbol in i ersetzt wurde (0 < i <n). Ein i wird auch Linkssatzform/Rechtssatzform genannt. Mit [A] wird die Menge aller Alternativen eines Metasymbols bezeichnet |[A]| ist die Anzahl der Alternativen zu einem Metasymbol Mit [A,i] wird die i-te Alternative des Metasymbols A bezeichnet, wobei 1  i  |[A]| Mit [A,i,j] wird das j-te Symbol in der i-te Alternative des Metasymbols A bezeichnet, wobei 1  i  |[A]| und 0  j  |[A,i]| Die Menge aller aus einem Metasymbol A ableitbaren terminalen Worte ist definiert als:

Verkürzende Schreibweisen: Iteration: Erweiterte BNF Verkürzende Schreibweisen: Iteration: Auswahl: Optionale Auswahl: A ::= … | B | … B ::= B C | C A ::= … | C+ | … A ::= … | B | … B ::= B C |  A ::= … | C* | … A ::= … | C | … C ::= 1 | … | n A ::= … |  {1 | … | n}  | … A ::= … | C | … C ::= 1 | … | n |  A ::= … |  [1 | … | n]  | …

Eine Knotenmenge B  * ist ein geordneter Baum, falls gilt: B ist endlich, Wenn i  B, dann auch  ( ist der Vater des Knotens i), mit   * und i  , Wenn (i+1)  B, dann auch i (i ist der linke Bruder des Knotens (i+1)), mit   * und i  .

Konkreter Syntaxbaum Sei  : B  V eine Markierung der Knoten eines geordneten Baums mit den Symbolen einer kfG G = (, M, S, R). Dann ist (B, ) genau dann ein Syntaxbaum, falls gilt: () = S   B: Falls () = A  M dann i   mit (A,[A,i])  R so dass für alle j mit 0  j < |[A,i]| gilt: (.j) = [A,i,j] .|[A,i]|  B   B: Falls () = a  , dann gilt .0  B Achtung: Nicht jedes Blatt im konkreten Syntaxbaum ist mit einem Terminalsymbol beschriftet

Abstrakter Syntaxbaum Sei  : B  V   eine Markierung der Knoten eines geordneten Baums und G = (, M, S, R) eine kfG. Dann ist (B, ) genau dann ein abstrakter Syntaxbaum, falls gilt: () = (S,i) mit 1  i  |[S]|   B, mit () = (A,i) und [A,i] = 0A11A2…Ann und i  *, Ai  M gilt:  hat genau n Söhne mit den Beschriftungen (Ak,nk), wobei 1  nk  |[Ak]|. Das bedeutet, dass im abstrakten Syntaxbaum auf die Knoten, die im konkreten Syntaxbaum mit Terminalsymbolen beschrifteten sind, verzichtet werden kann, wenn an jedem Knoten zusätzlich die Nummer der Alternative gespeichert wird, die zur Ableitung verwendet wurde.

Linearisierung von Syntaxbäumen Es sei /i := {(, (i.)) | (i., (i.))  } und n() := |  dom| Die Front eines konkreten Syntaxbaums mit Beschriftung  ist die Linearisierung der Beschriftung seiner mit Terminalsymbolen beschrifteten Blätter und ist definiert als front(), wobei Präfixlinearisierung eines abstrakten Syntaxbaums mit der Beschriftung  ist prelin(,), wobei Postfixlinearisierung eines konkreten Syntaxbaums mit der Beschriftung  ist postlin(,), wobei

Erstellen von kontextfreien Grammatiken Nach dem Entwurf einer Grammatik hat diese nicht immer die benötigten Eigenschaften – Ursachen dafür: Grammatik ist mehrdeutig Grammatik hat Linksrekursivitäten Grammatik besitzt -Regeln Grammatik besitzt bestimmte (noch näher zu spezifizierende) Eigenschaften (nicht), die verschiedene Transformationen verhindern Im Folgenden: Betrachtung von Techniken zur (bedeutungserhaltenden) Transformation kontextfreier Grammatiken

Wir betrachten nur reduzierte Grammatiken G = (, M, R, S), d.h.: Reduzierte kfG Wir betrachten nur reduzierte Grammatiken G = (, M, R, S), d.h.: G enthält keine Symbole A  M, die aus S nicht ableitbar sind G enthält keine Symbole A  M, die nicht zu einer terminalen Zeichenkette ableitbar sind

Eliminierung von -Regeln in kfG Gegeben ist eine kfG G = (, M, R, S) Finden der kleinsten Menge R' mit: Berechnen von R' durch Fixpunktiteration Streichen aller -Regeln in R' Für die kfG G' = (, M, R', S) gilt: L(G) – {} = L(G')

Eliminierung von Zyklen in kfG Eine kfG besitzt einen Zykel, wenn Ableitungen der Form A + A möglich sind. Entfernen von Zyklen durch Eliminierung von -Regeln und dann von Regeln der Form A  B durch: Finden der kleinsten Menge R' mit: Streiche Regeln der Form A  B

Mehrdeutigkeiten Eine kfG G ist mehrdeutig, falls zu einem Wort  mit S *  unterschiedliche Syntaxbäume existieren. Mehrdeutige Grammatiken sind ungeeignet zur Spezifikation einer Programmiersprache. Eine Sprache L ist mehrdeutig, falls es keine eindeutige Grammatik für L gibt. Drei Möglichkeiten der Behandlung: Mehrdeutigkeit kann nicht eliminiert werden (inherent mehrdeutige Sprache). Transformation der Grammatik in eine eindeutige Grammatik (nicht automatisierbar). In der Praxis wird teilweise mit mehrdeutigen Grammatiken gearbeitet und die Mehrdeutigkeit auf anderem Wege (lernen wir später kennen) behandelt.

Beispiel: Mehrdeutige Grammatiken (1) Grammatik zur Erzeugung arithmetischer Ausdrücke: E ::= E "+" E | E "*" E | | E "–" E | E "/" E | "(" E ")" | "n" Eindeutige Grammatik (ohne Prioritäten): E ::= T | T "+" E | T "*" E | T "–" E | T "/" E T ::= "n" | "(" E ")" Eindeutige Grammatik (mit Prioritäten, Operatoren rechtsassoziativ): A ::= M "+" A | M "–" A | M M ::= T "*" M | T "/" M | T T ::= "n" | "(" A ")" Eindeutige Grammatik (mit Prioritäten, Operatoren linksassoziativ): A ::= A "+" M | A "–" M | M M ::= M "*" T | M "/" T | T T ::= "n" | "(" A ")"

Beispiel: Mehrdeutige Grammatiken (2) Mehrdeutigkeit bei if-then-else (Dangling-Else): Stmt  OtherStmt | "IF" Expr "THEN" Stmt | "IF" Expr "THEN" Stmt "ELSE" Stmt Gewünschte Bedeutung: ELSE soll zum letzten IF THEN ohne ELSE gehören Eindeutige Grammatik: Stmt  MStmt | OStmt MStmt  "IF" Expr "THEN" MStmt "ELSE" MStmt | OtherStmt OStmt  "IF" Expr "THEN" Stmt | "IF" Expr "THEN" MStmt "ELSE" OStmt

Eliminierung von direkten Linksrekursivitäten Ein Metasymbol A einer Grammatik G besitzt eine direkte Linksrekursivität, falls es Regeln der Form A  A1 | … |An | 1 | … | m gibt, wobei A  M und 1,…, n, 1,…, m  V* Falls alle 1,…, m nicht mit A beginnen, Eliminierung der Linksrekursivität mittels Ersetzung von A  A1 | … |An | 1 | … | m durch: A  1A' | … | mA' A'  1A' | …| nA' |  Eine Grammatik G besitzt eine direkte Linksrekursivität, falls es in G ein Metasymbol mit einer direkten Linksrekursivität gibt.

Beispiel: Eliminierung direkter Linksrekursivitäten Direkt linksrekursive Grammatik: A  A "+" M | A "–" M | M M  M "*" T | M "/" T | T T  "n" | "(" A ")" Transformierte Grammatik: A  MA' A'  "+" M A' | "–" M A' |  M  T M' M'  "*" T M' | "/" T M' |  T  "n" | "(" A ")" Problem: Assoziativität der Operatoren hat sich geändert!

Eliminierung von indirekten Linksrekursivitäten Eine kfG G besitzt eine indirekte Linksrekursivität, falls Ableitungen der Form A + A möglich sind, wobei A  M und   V* Grammatiken darf keine -Regeln und Zyklen enthalten: A1,…,An seien die Metasymbole der Grammatik, R die Regelmenge for i = 1 to n do for j = 1 to i-1 do Ersetze in R alle Regeln der Form Ai  Aj durch Ai  1,…, Ai  k, wobei Aj  1,…, Aj  k alle Regeln zum Metasymbol Aj in R sind od Eliminiere alle direkten Linksrekursivitäten von Ai

Links-Faktorisierung Eliminieren eines gemeinsamen Präfixes mehrerer Alternativen zum selben Metasymbol: (A,1),…, (A,n) wird ersetzt durch (A,A'), (A',1),…, (A',n), wobei A' ein neues Metasymbol ist

Prinzipieller Aufbau eines Compilers Ersetzt die Beschreibung der Programmiersprache durch eine Typ 1 Grammatik Beschreibung der erkannten Sprache durch Typ 3 Grammatiken Kontext- prüfung Zielcodeabhängige Optimierungen Backend Quell-text Zwischencode und Symbol- tabelle Ziel-code Scanner Parser Zielcode- erzeugung Zielcodeunab- hängige Optimierungen Frontend Beschreibung der erkannten Sprache durch Typ 2 Grammatiken Steuerfluss im Compiler Datenfluss im Compiler

Weiter zur Lexikalischen Analyse Ende der Grundlagen Weiter zur Lexikalischen Analyse