Algorithmen und Datenstrukturen II

Ähnliche Dokumente
Algorithmen und Datenstrukturen II. Algorithmen und Datenstrukturen II 1

Universität Bielefeld

7. Syntax: Grammatiken, EBNF

Sprachen sind durch folgenden Aufbau gekennzeichnet:

Programmierkurs Java

Syntax von Programmiersprachen

Alphabet, formale Sprache

Universität Bielefeld

Kapitel 2. Methoden zur Beschreibung von Syntax

Einführung in die Programmierung für NF. Rückgabewerte, EBNF, Fallunterscheidung, Schleifen

Teil IX. Eine kleine Programmiersprache

Java für Anfänger Teil 2: Java-Syntax. Programmierkurs Manfred Jackel

Einführung in die Programmierung I. 1.0 EBNF 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Formale Sprachen und Grammatiken

Java für Anfänger Teil 2: Java-Syntax. Programmierkurs Manfred Jackel

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

Einführung in die Informatik. Programming Languages

SWE1 / Übung 2 ( )

Einführung in die Informatik. Programming Languages

Kapitel IV Formale Sprachen und Grammatiken

Imperative Programmierung in Java. Algorithmen und Datenstrukturen II 1

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Algorithmen und Datenstrukturen

Formale Sprachen, reguläre und kontextfreie Grammatiken

Formale Sprachen. Inhaltsverzeichnis. M. Jakob. 10. Dezember Allgemeine Einführung. Aufbau formaler Sprachen

Sprachen und Programmiersprachen

1 Syntax von Programmiersprachen

Simulation und Testen von Algorithmen

Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen -

2.1 Grundlagen: Kontextfreie Grammatiken

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Algorithmen und Datenstrukturen II

Syntaxanalyse Ausgangspunkt und Ziel

Theoretische Informatik 2 bzw. Formale Sprachen und Berechenbarkeit. Sommersemester Herzlich willkommen!

Kapitel 5: Syntaxdiagramme und Grammatikregeln

3.4 Struktur von Programmen

Begriffe (Wiederholung)

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

Hashing. Algorithmen und Datenstrukturen II 1

TU Kaiserslautern. Übungsblatt 2: Software-Entwicklung 1 (WS 2017/18) Hinweise zu Einreichaufgaben. Hinweise zu den Übungen

Automaten und formale Sprachen Klausurvorbereitung

Mehrdeutige Grammatiken

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme

Algorithmen und Datenstrukturen II

2.1 Allgemeines. Was ist eine Sprache? Beispiele:

Einführung in die Informatik I (autip)

Herzlich willkommen!!!

Übung Praktische Informatik I

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

Abschnitt 4: Daten und Algorithmen

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

Automaten und Formale Sprachen alias Theoretische Informatik. Sommersemester 2011

Theoretische Informatik Mitschrift

Repetitorium Informatik (Java)

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 45

Programmiersprachen und Übersetzer

Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl

Grammatik Prüfung möglich, ob eine Zeichenfolge zur Sprache gehört oder nicht

EIGENSCHAFTEN VON SPRACHEN

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Programmieren I. Formale Sprachen. Institut für Angewandte Informatik

Grundlagen der theoretischen Informatik

Informatik B von Adrian Neumann

Lexikalische Programmanalyse der Scanner

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

Die Programmiersprache C Eine Einführung

Javakurs für Anfänger

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

Einführung in die Informatik Grammars & Parsers

Formale Sprachen. Inhalte. Lehrplan. Hinweis

Programmierpraktikum

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Elementare Konzepte von

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Kontextfreie Sprachen Kontextfreie Sprachen und Grammatiken. Satzformen sind die Wörter aus (N T ). Notation: Wir verwenden oft

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

GTI. Hannes Diener. 18. Juni. ENC B-0123,

Imperative Programmierung in Java. Algorithmen und Datenstrukturen II 1

Einführung Grundbegriffe

9.4 Grundlagen des Compilerbaus

7. Formale Sprachen und Grammatiken

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

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

Berechenbarkeit und Komplexität Vorlesung 11

q 0 q gdw. nicht (q A) (q A) q i+1 q gdw. q i q oder ( a Σ) δ(q, a) i δ(q, a) L = {a n b n : n N} für a, b Σ, a b

Formale Sprachen und Automaten

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

3. Zeichenreihen und formale Sprachen

Syntax (= Satzgefüge), vgl. auch Grammatik

Inhalt Kapitel 5: Syntax

Was ist ein Compiler?

6. Iteration (Schleifenanweisungen)

Vorlesung Programmieren

Algorithmen und Programmierung II

Algorithmen und Datenstrukturen II

Transkript:

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Algorithmen und Datenstrukturen II AG Praktische Informatik Technische Fakultät Vorlesung Sommer 2009

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Veranstalter Vorlesung und Übungen Raum: M3-124 Tel.: 0521/106-2906 Email: psteffen@techfak.uni-bielefeld.de

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Webseite zur Vorlesung Informationen zur Vorlesung und den Übungen Folien, Skript, Übungszettel http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIISS09/

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Webseite zur Vorlesung Informationen zur Vorlesung und den Übungen Folien, Skript, Übungszettel http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIISS09/ Account-Antrag: https://www.techfak.uni-bielefeld.de/rechner/ accountantrag.html Abholung nach ca. 2 Tagen im Support-Büro M3-100.

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Übungsgruppen Anmeldung zu den Übungen durch Eintrag auf den Listen am schwarzen Brett der Technischen Fakultät Zeitraum der Anmeldung: Dienstag 14.4., ca. 15 Uhr bis Donnerstag 16.4., 16 Uhr Raumnummern und Tutoren werden ab Freitag, dem 17.4., am schwarzen Brett bekanntgegeben

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Aufgabenzettel erstes Übungsblatt am 21.4. (dann jeweils am Dienstag in der Vorlesung) Aufgaben in Gruppen von 3 Studierenden bearbeiten Lösungen werden eine Woche nach der Ausgabe in der Vorlesung eingesammelt Leistungsnachweis: 1 mindestens 50% der möglichen Punktzahl in den Übungszetteln 2 erfolgreiche Bearbeitung der Projektaufgabe 3 regelmäßige aktive Teilnahme an den Übungen. Es darf maximal zweimal unentschuldigt gefehlt werden. Ansonsten ist ein ärztliches Attest erforderlich. Die Übungen beginnen in der Woche vom 20.04 bis 24.04.

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Einzelprojekt Vorbereitung auf TdPE Veranstaltung Java-Programmieraufgabe als Einzelarbeit Ausgabe der Projektaufgabe am 23.06.09 Abgabe der Lösungen spätestens am 14.07.09

Syntax und Semantik Java: Der Einstieg Imperative Programmierung in Java Algorithmen zur exakten Suche in Texten Objektori Übersicht 1 Syntax und Semantik 2 Java: Der Einstieg 3 Imperative Programmierung in Java 4 Algorithmen zur exakten Suche in Texten 5 Objektorientierte Programmierung in Java 6 Übergang von funktionaler zu OOP 7 Programmieren im Großen 8 Hashing 9 Ein- und Ausgabe 10 Grafische Benutzeroberflächen 11 Graphen

Teil I Syntax und Semantik

Einführung Programmiersprachen sind formale Sprachen. Es ist präzise festgelegt, welche Zeichenreihen überhaupt Programme einer Sprache L sind (Syntax), welche Ein-/Ausgabefunktion ein Programm berechnet (Semantik).

Konkrete/abstrakte Syntax konkrete Syntax Genaue textuelle Aufschreibung für Programme. abstrakte Syntax Bindeglied zur Semantik; gibt an, wie ein Programm(-stück) aufgebaut ist.

Beispiel abstrakt assign x add var const y 5

Beispiel abstrakt konkret assign x := y + 5 Pascal x = y + 5 C, Fortran, Java x add LET x = y + 5 Basic (anno 1963) ADD 5 TO y GIVING x COBOL STORE y + 5 TO x dbase var const y 5

Operatoren und Konstrukte In der abstrakten Syntax tauchen die primitiven Konstrukte einer Programmiersprache auf, sowie Operatoren, die diese zu neuen Konstrukten kombinieren. primitiv: Bezeichner, Zahl Kombination: var: Bezeichner Ausdruck const: Zahl Ausdruck add: Ausdruck Ausdruck Ausdruck assign: Bezeichner Ausdruck Anweisung

Wörter Definition Ein Alphabet A ist ein endlicher Zeichenvorrat (eine endliche Menge). Die Mengen aller endlichen Zeichenreihen über einem Alphabet A bezeichnen wir mit A. Das leere Wort der Länge 0 bezeichnen wir mit ε.

Formale Sprachen Definition Eine Menge L A heißt formale Sprache über dem Alphabet A. Einen abstrakteren Sprachbegriff kann man kaum definieren. Die einzige Frage, die man sich über w A stellen kann, ist: Gilt w L oder w L? Diese Frage nennt man das Wortproblem von L.

Programmiersprachen Definition Eine Programmiersprache ist ein Paar (L, L), wobei L A eine formale Sprache und L : L (A A ) die Semantik von L ist. Damit ordnet L jedem L-Programm l L als seine Bedeutung die Ein-/Ausgabefunktion L(l) zu, wobei Ein- und Ausgabe ebenfalls Zeichenreihen über A sind. Für L(l) schreiben wir auch kurz Ll.

Kontextfreie Grammatiken Definition Eine kontextfreie Grammatik ist ein 4-Tupel G = (N, A, P, S), wobei 1 N ein Alphabet von sogenannten Nonterminalsymbolen, 2 A ein Alphabet von sogenannten Terminalsymbolen mit N A =, 3 P eine endliche Menge von Produktionen (Regeln) der Form V α mit V N und α (V A) und 4 S N ein Startsymbol ist.

Satzformen einer Grammatik Die Menge S(G) der Satzformen von G ist die kleinste Teilmenge von (N A) mit den folgenden Eigenschaften: 1 S S(G). 2 Wenn αv β S(G) für ein Nonterminalsymbol V N und Zeichenfolgen α, β (N A) und wenn V γ P eine Regel ist, so gilt auch αγβ S(G) ( Ableitungsschritt ).

Sprache einer Grammatik Die durch G definierte Sprache ist L(G) def = S(G) A. Den Test, ob ein gegebenes Wort w durch eine Grammatik G erzeugt werden kann, also ob w L(G) gilt, nennt man das Wortproblem von G.

Syntax und Semantik von Sprachen: Bohrkopfsteuerung N W E O S N, E, W, S: Bewegung um 1 Gitterpunkt (north, east, west, south) O: Einstellen auf Nullpunkt (origin) D: Senken des Bohrkopfes mit Bohrung (drill) U: Heben des Bohrkopfes (up)

Programme zur Maschinensteuerung ONNNEEDO Bohrung am Punkt (2,3) mit Rückkehr zum Nullpunkt ODUDUDU DUNDUWDUSDU Dreifach-Bohrung am Nullpunkt bohrt Gitterquadrat, wo der Kopf gerade steht

Steuersprache In der ersten Variante unserer Steuersprache lassen wir beliebige Befehlsfolgen zu. Außerdem kann jedes Programm als Eingabe ein Paar von Start-Koordinaten erhalten. L 1 = {N, E, W, S, U, D, O} Eingabe: (Int, Int) L 1 : L 1 (Int, Int) [(Int, Int)]

Maschinenzustand x y l cs aktuelle x-koordinate aktuelle y-koordinate aktueller Hebezustand des Bohrkopfes: 0 gesenkt, 1 oben Liste bisheriger Bohr-Koordinaten

Semantik von Befehlen bef :: Befehl Zustand Zustand bef b (x, y, l, cs) = case b of O (0, 0, 1, cs) N (x, y + 1, l, cs) W (x 1, y, l, cs) S (x, y 1, l, cs) E (x + 1, y, l, cs) D (x, y, 0, (x, y) : cs) U (x, y, 1, cs)

Befehlsfolgen beff :: Befehl Zustand [(Int, Int)] beff [ ](x, y, l, cs) = reverse cs beff (b : bs)(x, y, l, cs) = beff bs(bef b (x, y, l, cs))

Befehlsfolgen beff :: Befehl Zustand [(Int, Int)] beff [ ](x, y, l, cs) = reverse cs beff (b : bs)(x, y, l, cs) = beff bs(bef b (x, y, l, cs)) Die Semantik L 1 wird beschrieben durch die Funktion prog :: Befehl (Int, Int) [(Int, Int)] prog bs (i, j) = beff bs (i, j, 1, [])

Programmiersprache L 1 und ihre Semantik L 1 sind sehr naiv. Man sollte zum Beispiel bedenken, dass das Werkstück und vielleicht auch die Maschine beschädigt werden, wenn mit abgesenktem Bohrkopf Bewegungen ausgelöst werden. Freilich solange niemand solche Steuerprogramme erzeugt, geht alles gut. Jedoch wollen wir uns nicht darauf verlassen...

Syntaktische vs. semantische Verfeinerung Generell gibt es zwei Möglichkeiten, eine Sprache (L, L) zu verfeinern: syntaktisch oder semantisch. Semantisch heisst: das Unglück kann programmiert werden, tritt aber nicht ein. Syntaktisch heisst: das Unglück wird bereits als syntaktisch fehlerhaftes Programm abgewiesen.

Aufgabe Modifiziere die Semantik L 1 (bei unverändertem L 1 ) in zwei verschiedenen Weisen. Tritt eine Bewegung mit abgesenktem Bohrkopf auf, so wird a) die Ausführung des Programms abgebrochen und nur die Koordinaten der bisherigen Bohrungen ausgegeben, b) die Ausführung des Programms abgebrochen und keine Koordinaten angegeben.

Forderungen an die Steuersprache Wir entscheiden uns nun für die syntaktische Verfeinerung und stellen Forderungen an die Steuersprache L: 1 Auf Befehl D muss stets U oder O folgen. 2 Befehl O ist immer möglich, U nur unmittelbar nach D. 3 Alle Programme enden mit dem Bohrkopf am Nullpunkt. 4 Auf dem Weg von einer Bohrung zur nächsten sind gegenläufige Richtungswechsel unerwünscht, zum Beispiel... NSNS... oder... NES..., weil sie die Maschine in Schwingung versetzen können. Alle diese Forderungen lassen sich durch Einschränkungen von L 1 erfüllen, erfordern aber verfeinerte Methoden zur syntaktischen Sprachbeschreibung. Solche Mittel sind Grammatiken.

Grammatik 1 Grammatik G 1 (zur Beschreibung von L 1 ) A = { N, E, W, S, U, D, O} N = { moves, move} S = moves P = { moves ε move moves move N E W S U D O}

Grammatik 1 Grammatik G 1 (zur Beschreibung von L 1 ) A = { N, E, W, S, U, D, O} N = { moves, move} S = moves P = { moves ε move moves move N E W S U D O} Hier gilt L(G 1 ) = A. Es ist w L(G 1 ) mit w = WENDEDENUDOSUED Übung: Leite w mit dieser Grammatik ab.

Verfeinerte Grammatik 2 Verfeinerte Grammatik G 2 (berücksichtigt Forderungen (1) - (3), aber nicht (4)). A, N, S wie G 1 P = { moves O DO move moves move N E W S O DU DO}

Verfeinerte Grammatik 2 Verfeinerte Grammatik G 2 (berücksichtigt Forderungen (1) - (3), aber nicht (4)). A, N, S wie G 1 P = { moves O DO move moves move N E W S O DU DO} Frage: Warum brauchen wir die Regel moves DO überhaupt?

Verfeinerte Grammatik 2 Verfeinerte Grammatik G 2 (berücksichtigt Forderungen (1) - (3), aber nicht (4)). A, N, S wie G 1 P = { moves O DO move moves move N E W S O DU DO} Frage: Warum brauchen wir die Regel moves DO überhaupt? Antwort: Sonst ist DO / S(G 2 ).

Warum ist nun w = WENDEDENUDOSUED / S(G 2 )? Versuch einer Ableitung: moves move moves W moves W move moves W E moves 3 W E N move moves W E N? Hier kann nur DU oder DO erzeugt werden, aber nicht D allein oder DE.

Verfeinerte Grammatik 3 Verfeinerte Grammatik G 3 (berücksichtigt Forderungen (1) und (4), (2) nur teilweise und (3) gar nicht): A, S wie G 1 N = { moves, ne, nw, se, sw, drill } P = { moves ε ne moves nw moves se moves sw moves ne N ne E ne drill se S se E se drill nw N nw W nw drill sw S sw W sw drill drill DU DO }

RNA-Sekundärstrukturen Ein RNA-Molekül besteht aus Basen A,C,G,U. Durch Wasserstoff-Brücken zwischen A U, G C, G U bilden sich Basenpaarungen, die zu einer Sekundärstruktur führen. Primärsequenz C A C C U A A G G U C C Sekundärstruktur C A C C U A A G G U C C C A U C C C G U C A G Helix-Bildung schafft St A

Sekundärstruktur-Grammatik Grammatik zur Beschreibung der Sekundärstruktur (Ausschnitt): A = { A, C, G, U } N = { struct, any, stack, loop } S = struct P = { struct any any struct struct any stack ε any A C G U stack A stack U U stack A G stack C C stack G G stack U U stack G loop loop any loop any any any }

Ableitung von RNA-Sequenzen Allein mit den ersten beiden Produktionen kann man alle RNA-Sequenzen ableiten: struct any struct A struct A any struct AC struct... Damit ist L(G) = A. Der Witz der Grammatik ist, dass manche Ableitungen das Vorliegen möglicher Sekundärstrukturen anzeigen dann nämlich, wenn sie die Produktionen für stack benutzen.

Ableitung == Struktur struct 2 C struct 4 C struct CC C stack CC CA stack UCC 2 CACC stack GGUCC CACC loop GGUCC 4 CACCUAAGGUCC

Syntaxbaum struct any struct C struct any any C struct C stack U A C C any stack U stack G stack G loop any any A A

EBNF, Historisches Syntaxbeschreibung von FORTRAN und COBOL (am Anfang) durch Beispiele und Gegenbeispiele. 1958 formale Beschreibung der Syntax von ALGOL durch John Backus; Backus-Normalform (BNF). Kleine Verbesserungen in der Notation durch Peter Naur, daher spricht man heute von der Backus-Naur-Form (BNF). Niklaus Wirth hat die Backus-Naur-Form noch einmal überarbeitet und erweitert (EBNF Extended BNF).

EBNF, Definition Die Metazeichen der EBNF (vgl. Klaeren [5], S. 104) sind: das Definitionszeichen = das Alternativzeichen die Anführungszeichen die Wiederholungsklammern { } die Optionsklammern [ ] die Gruppenklammern ( ) der Punkt.

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol.

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol.

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch 1 (α) ET,

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch 1 (α) ET, 2 [α] ET und

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch 1 (α) ET, 2 [α] ET und 3 {α} ET.

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch 1 (α) ET, 2 [α] ET und 3 {α} ET. 4 Für α 1,..., α n ET sind auch

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch 1 (α) ET, 2 [α] ET und 3 {α} ET. 4 Für α 1,..., α n ET sind auch 1 α 1... α n ET und

EBNF, Terme Die Menge ET der EBNF-Terme ist gegeben durch: 1 Ist V eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnt, so gilt V ET und gilt als Nonterminalsymbol. 2 Ist w eine Folge von beliebigen Symbolen, so ist w ET und gilt als ein (!) Terminalsymbol. 3 Für α ET sind auch 1 (α) ET, 2 [α] ET und 3 {α} ET. 4 Für α 1,..., α n ET sind auch 1 α 1... α n ET und 2 α 1 α 2... α n ET.

EBNF-Definitionen Eine EBNF-Definition besteht aus einer endlichen Menge von EBNF-Regeln der Form V = α. wobei V ein Nonterminalsymbol entsprechend obiger Konvention und α ein EBNF-Term ist. Das Nonterminalsymbol auf der linken Seite der ersten Regel ist das Startsymbol.

EBNF-Definition für Mini-Java (1) program = class ident { mainmethod }. mainmethod = public static void main ( String [ ] argsident ) bloc statement = int ident = expression ; ident = expression ; if ( condition ) statement while ( condition ) statement block System. out. println ( expression ) ; ; int [ ] arrayident = new int [ expression ] ; arrayident [ expression ] = expression ;. block = { { statement } }. condition = expression ( ==!= < <= > >= ) expression. expression = [ ( + - ) ] term { ( + - ) term }. term = factor { ( * / ) factor }.

EBNF-Definition für Mini-Java (2) factor = ident number ( expression ) Integer. parseint ( argsident [ expression ] ) argsident. length arrayident. length arrayident [ expression ]. ident = ( letter _ $ ) { letter digit }. number = ( 0 digit { digit 0 } ). digit = 1 2... 9. letter = A... Z a... z. argsident = ident. arrayident = ident.

Operationen auf Sprachen Seien L, L 1 und L 2 beliebige Sprachen (Wortmengen) über einem gemeinsamen Alphabet. Dann definieren wir: def 1. Komplex-Produkt: L 1 L 2 = {w 1 w 2 w 1 L 1, w 2 L 2 } (also L = L = ; L{ε} = {ε}l = L) 2. n-fache Iteration: L 0 def = {ε}, L n+1 := LL n 3. Stern-Operation: L def = n N Ln

Semantik der EBNF (1) Die Semantik der EBNF definieren wir durch Rekursion über die EBNF-Terme. Sei E eine EBNF-Definition (wobei S das Startsymbol, N die Menge der Nonterminals und A die Menge der Terminals sei) und ET die Menge der EBNF-Terme. Dann ist die von E erzeugte Sprache L(E) definiert als S E, wobei E : ET P(A ) wie folgt definiert ist (vgl. Klaeren [5], S. 107):

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst 2 w E def = {w}

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst def 2 w E = {w} def 3 (α) = α E E

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst def 2 w E = {w} def 3 (α) = α E E def 4 [α] = {ε} α E E

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst def 2 w E = {w} def 3 (α) = α E E def 4 [α] = {ε} α E E def 5 {α} = α E E

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst def 2 w E = {w} def 3 (α) = α E E def 4 [α] = {ε} α E E def 5 {α} = α E E 6 α 1... α n E def = α 1 E... α n E

Semantik der EBNF (2) 1 Für V N{ ist def α E falls V = α. eine Regel in E ist V E = sonst def 2 w E = {w} def 3 (α) = α E E def 4 [α] = {ε} α E E def 5 {α} = α E E 6 α 1... α n E def = α 1 E... α n E 7 α 1 α n E def = α 1 E α n E

Beispiel eines syntaktisch korrekten Mini-Java-Programms class BubbleSort { public static void main(string[] args) { int[] array = new int[args.length]; int i = 0; while (i < args.length) { array[i] = Integer.parseInt(args[i]); i = i+1; } i = 1; while (i < array.length) { int j = array.length - 1; while (j >= i) { if (array[j] < array[j-1]) { int tmp = array[j]; array[j] = array[j-1]; array[j-1] = tmp; } j = j-1; } i = i+1; } i = 0; while (i < array.length) { System.out.println(array[i]); i = i+1; } } }

EBNF-Definition für Mini-Java (1) program = class ident { mainmethod }. mainmethod = public static void main ( String [ ] argsident ) bloc statement = int ident = expression ; ident = expression ; if ( condition ) statement while ( condition ) statement block System. out. println ( expression ) ; ; int [ ] arrayident = new int [ expression ] ; arrayident [ expression ] = expression ;. block = { { statement } }. condition = expression ( ==!= < <= > >= ) expression. expression = [ ( + - ) ] term { ( + - ) term }. term = factor { ( * / ) factor }.

EBNF-Definition für Mini-Java (2) factor = ident number ( expression ) Integer. parseint ( argsident [ expression ] ) argsident. length arrayident. length arrayident [ expression ]. ident = ( letter _ $ ) { letter digit }. number = ( 0 digit { digit 0 } ). digit = 1 2... 9. letter = A... Z a... z. argsident = ident. arrayident = ident.

Syntaxdiagramme für EBNF-Definitionen (1) w : w für alle w A. V : V für alle V N. [α] : α {α} : α

Syntaxdiagramme für EBNF-Definitionen (2) α 1... α n : α 1 α n α 1 α n : α 1. α n

Beispiel: Syntaxdiagramme für Mini-Java (1) program class ident { mainmethod } mainmethod public static void main ( String [ ] argsident ) block

Beispiel: Syntaxdiagramme für Mini-Java (2) statement int ident = expression ; ident = expression ; if ( condition ) statement while ( condition ) statement block System. out. println ( expression ) ; ; int [ ] arrayident = new int [ expression ] ; arrayident [ expression ] = expression ;

Beispiel: Syntaxdiagramme für Mini-Java (3) condition expression!= == expression < block { } <= >= statement >

Beispiel: Syntaxdiagramme für Mini-Java (4) expression term + term + term factor factor * /

Beispiel: Syntaxdiagramme für Mini-Java (5) factor ident number ( expression ) Integer. parseint ( argsident [ expression ] ) argsident. length arrayident. length arrayident [ expression ]

Beispiel: Syntaxdiagramme für Mini-Java (6) ident letter _ $ letter digit number digit 0 digit 0

Beispiel: Syntaxdiagramme für Mini-Java (7) letter A... digit 1 Z a...... 9 z

K. Arnold, J. Gosling: Java TM - Die Programmiersprache. Addison-Wesley, 1996. T.H. Cormen, C.E. Leierson, R.L. Rivest: Introduction to Algorithms. MIT Press, 1990. D. Flanagan: Java in a Nutshell. O Reilly & Associates Inc., 1996. F. Jobst: Programmieren in Java. Hanser Verlag, 1996. H. Klaeren: Vom Problem zum Programm. 2.Auflage, B.G. Teubner Verlag, 1991. K. Echtle, M. Goedicke: Lehrbuch der Programmierung mit Java. dpunkt-verlag, 2000.