Einführung in die Informatik. Programming Languages

Ähnliche Dokumente
Einführung in die Informatik. Programming Languages

Einführung in die Informatik Grammars & Parsers

7. Syntax: Grammatiken, EBNF

Alphabet, formale Sprache

Kapitel IV Formale Sprachen und Grammatiken

7. Formale Sprachen und Grammatiken

Syntax von Programmiersprachen

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

Sprachen sind durch folgenden Aufbau gekennzeichnet:

Kapitel 5: Syntaxdiagramme und Grammatikregeln

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

Kapitel 2. Methoden zur Beschreibung von Syntax

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

Theorie der Informatik

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

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

1 Syntax von Programmiersprachen

Algorithmen und Datenstrukturen

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme

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

Abschnitt 4: Daten und Algorithmen

3.4 Struktur von Programmen

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

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

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

Kapitel: Die Chomsky Hierarchie. Die Chomsky Hierarchie 1 / 14

Lexikalische Programmanalyse der Scanner

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

Mehrdeutige Grammatiken

Was ist ein Compiler?

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

Von der Chomsky-Hierarchie

Einführung in die Informatik I (autip)

Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen -

2.1 Grundlagen: Kontextfreie Grammatiken

Programmierkurs I. Gliederung: Deklarationsteil als BNF 2. Blöcke in Ada95 (Lebenszeit, Sichtbarkeit von Variablen)

Programmiersprachen und Übersetzer

Formale Sprachen, reguläre und kontextfreie Grammatiken

Grundbegriffe. Grammatiken

Inhalt Kapitel 5: Syntax

Sprachen/Grammatiken eine Wiederholung

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

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

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

Grammatiken und ANTLR

Tutorium 23 Grundbegriffe der Informatik (10. Sitzung)

Theoretische Informatik Mitschrift

Theoretische Grundlagen des Software Engineering

6 Kontextfreie Grammatiken

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

2.1 Allgemeines. Was ist eine Sprache? Beispiele:

Lemma Für jede monotone Grammatik G gibt es eine kontextsensitive

Theoretische Informatik I

1 Formale Sprachen, reguläre und kontextfreie Grammatiken

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 45

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

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

Algorithmen und Formale Sprachen

Elementare Konzepte von

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

Programmierkurs Java

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

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Automaten und formale Sprachen Klausurvorbereitung

9 Theoretische Informatik und Compilerbau

Kapitel 3: Grundlegende Ergebnisse aus der Komplexitätstheorie Gliederung

Formale Sprachen und Grammatiken

EINFÜHRUNG IN DIE THEORETISCHE INFORMATIK

Formale Sprachen und Automaten

Was bisher geschah: Formale Sprachen

Werkzeuge zur Programmentwicklung

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

(Prüfungs-)Aufgaben zu formale Sprachen

Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

3AA. Prof. Dr. Wolfgang P. Kowalk. Universität Oldenburg WS 2005/2006

Interpreter - Gliederung

Automaten und Formale Sprachen alias Theoretische Informatik. Sommersemester 2011

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

Berechenbarkeit und Komplexität Vorlesung 11

es gibt viele gute Info-I-Lehrbücher ( Einführung in die Informatik ).

Formale Sprachen. Grammatiken. Grammatiken und die Chomsky-Hierarchie. Rudolf FREUND, Marion OSWALD. Grammatiken: Ableitung

Syntax von Programmiersprachen

16. Die Chomsky-Hierarchie

Grundlagen der Theoretischen Informatik

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

Einstieg in die Informatik mit Java

Syntax. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Theoretische Grundlagen der Informatik

9.4 Grundlagen des Compilerbaus

Formale Sprachen. Eine Einführung. Tim Lethen Düsseldorf Version II (04-06)

Formale Sprachen. Inhalte. Lehrplan. Hinweis

1 EINFÜHRUNG PROGRAMMIERSPRACHEN

Syntax. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Theoretische Informatik I

Grundlagen der Theoretischen Informatik

Grundbegriffe der Informatik

Grundlagen der Theoretischen Informatik

Transkript:

Einführung in die Informatik Programming Languages Beschreibung von Programmiersprachen Wolfram Burgard Cyrill Stachniss 1/15

Motivation und Einleitung Wir haben in den vorangehenden Kapiteln meistens vollständige Java- Programme als mögliche Beschreibungen von Algorithmen angegeben. Zumindest der Kern von Java gehört (zusammen mit while-programmen und vielen anderen Programmiersprachen) zu der Klasse der imperativen Programmiersprachen. In diesem Kapitel werden wir die charakteristischen Aspekte imperativer Programmiersprachen diskutieren. Darüber hinaus werden wir diskutieren, wie man Programmiersprachen spezifizieren kann. Schließlich werden wir auch kurz auf alternative Programmiersprachen eingehen. 2/15

Struktur normaler Computer mit Von-Neumann-Architektur Eingabewerk Speicher Ausgabewerk Rechenwerk Steuerwerk 3/15

Eigenschaften dieser Komponenten (1) Der Speicher besteht aus fortlaufend nummerierten Zellen. Speicherzellen können über ihre Adresse (symbolisch: über ihren Namen) angesprochen werden. Programm, Daten, Zwischen- und Endergebnis werden in demselben Speicher abgelegt. Die im Speicher abgelegten Befehle werden über ein durch das Steuerwerk kontrolliertes Befehlszählregister adressiert. Das Befehlszählregister gibt den jeweils nächsten auszuführenden Befehl an. Es wird in der Regel um 1 erhöht, wenn nicht ein Sprungbefehl eine Änderung der Bearbeitungsreihenfolge erzwingt. 4/15

Eigenschaften dieser Komponenten (2) Das Rechenwerk enthält Befehle zur Manipulation der Daten. Darunter sind unter anderem: arithmetische Befehle logische Befehle Transportbefehle (bedingte) Sprünge Schieben, Unterbrechen, Warten... Die Rechnerstruktur ist problemunabhängig. Problemabhängigkeit wird durch ein im Speicher abgelegtes Programm realisiert. 5/15

Programmiersprachen: Abstraktion von der konkreten Architektur Die hier angegebene Beschreibung der Von-Neumann-Rechner- Architektur ist nur sehr grob. Sie ist nur auf die wesentlichen Komponenten beschränkt und sagt nicht, wie z.b. einzelne Befehle heißen und was sie bewirken. Imperative Programmiersprachen orientieren sich jedoch an dieser Architektur und stellen abstrakte Befehle zur Manipulation der Daten und zur Kontrolle der Ausführung zur Verfügung. Damit werden sie unabhängig von dem konkreten Rechner. Der Compiler sorgt dann dafür, dass sie in die Sprache des entsprechenden Rechners übersetzt werden. Darüber hinaus erlauben sie eine Strukturierung des Programms, was die Wartung und Entwicklung deutlich vereinfacht. 6/15

Techniken zur Beschreibung der Syntax von Programmiersprachen Um Programme übersetzen zu können, muss der Rechner die Programmiersprache kennen, d.h. er muss wissen, was gültige Programme sind. Programmiersprachen sind künstliche Sprachen. Eine Sprache ist nichts anderes als eine (im allgemeinen unendliche) Menge von Sätzen, die jeweils aus einzelnen Symbolen bestehen. Die einzelnen, nicht weiter unterteilbaren Symbole nennt man auch Tokens der Sprache. Bei der Analyse eines Programms wird es in der so genannten lexikalischen Analyse zunächst in die Folge seiner Tokens zerlegt. 7/15

Kategorien von Tokens Reservierte Wörter: Dies sind Schlüsselwörter, wie z.b. boolean, int, class, static usw. Konstanten: Dazu gehören Literale, wie z.b. 4711L oder "Mehrwertsteuer". Sonderzeichen: Z.B. +, -, =, ;,... für Operatoren und Begrenzer. Bezeichner: Alle benutzerdefinierten Namen zur Benennung von Variablen, Methoden, etc Kommentare: Besonders gekennzeichnete Zeichenfolgen, die vom Compiler übersprungen werden.... 8/15

Syntax von Programmiersprachen Unter der Syntax einer Programmiersprache versteht man die Regeln, die festlegen, was gültige Programme sind. Eine typische Form zur Formulierung dieser Regeln sind so genannte kontextfreien Grammatiken. Obwohl manche Teile der Syntax-Definition nicht durch kontextfreie Grammatiken erfasst werden können, hat diese Form der Syntaxbeschreibung große Vorteile. Dazu gehört insbesondere, dass Analyseprogramme für Programme (so genannte Parser) automatisch konstruiert werden können. 9/15

Arithmetische Ausdrücke Arithmetische Ausdrücke können induktiv folgendermaßen definiert werden: 1. Jede Zahl ist ein arithmetischer Ausdruck. 2. Ist E ein arithmetischer Ausdruck, so ist auch (E) ein arithmetischer Ausdruck. 3. Sind E 1 und E 2 arithmetische Ausdrücke, so sind auch E 1 +E 2, E 1 -E 2 und E 1 *E 2, E 1 /E 2 arithmetische Ausdrücke. 4. Nur die auf diese Weise erhältlichen Zeichenreihen sind syntaktisch korrekt gebildete, arithmetische Ausdrücke. 10/15

Formale Festlegung dieser Regeln: ein kontextfreie Grammatik für arithmetische Ausdrücke Ziffer 0 1 2 3 4 5 6 7 8 9 Zahl Ziffer Ziffer Zahl Ausdruck Zahl Ausdruck (Ausdruck ) Ausdruck Ausdruck + Ausdruck Ausdruck Ausdruck Ausdruck Ausdruck Ausdruck * Ausdruck Ausdruck Ausdruck / Ausdruck 11/15

Typen von Symbolen in Grammatiken Bei den einzelnen Symbolen unterscheidet man: Metasymbole: Zeichen wie und, die zur Formulierung der Regeln benötigt werden. Terminalsymbole: Sie entsprechen den Tokens der Sprache und sind die einzigen Zeichen, die in Sätzen der Sprache auftreten können. In unserem Beispiel sind dies 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (, ), +, - und *. Nichtterminalsymbole: Dies sind die in spitze Klammern eingeschlossenen Zeichenreihen. Sie werde manchmal auch Variablen oder syntaktische Kategorien genannt. 12/15

Bedeutung der Komponenten Die oben angegebene Grammatik besteht aus einer Menge von Regeln oder Produktionen. Mit Hilfe der Regeln lassen sich, ausgehend von einem Startsymbol (hier: <Ausdruck>), Zeichenreihen erzeugen, indem man ein Vorkommen eines Nichtterminalsymbols, das auf der linken Seite einer Regel vorkommt, in der Zeichenreihe durch die rechte Seite ersetzt. Tritt auf der rechten Seite das Metasymbol auf, so fasst man die dadurch abgetrennten Zeichenreihen als alternative Ersetzungsmöglichkeiten auf. Die erste Regel ist somit als Abkürzung für zehn einzelne Regeln der Form: für Ziffer n n=0,...,9 aufzufassen 13/15

Anwendungsbeispiele Ziffer 0 1 2 3 4 5 6 7 8 9 Zahl Ziffer Ziffer Zahl Ausdruck Zahl Ausdruck (Ausdruck ) Ausdruck Ausdruck + Ausdruck Ausdruck Ausdruck Ausdruck Ausdruck Ausdruck * Ausdruck Ausdruck Ausdruck / Ausdruck 14/15

Anwendungsbeispiel Ausdruck Ausdruck Ausdruck ( Ausdruck ) Ausdruck ( Ausdruck + Ausdruck ) Ausdruck ( Zahl + Ausdruck ) Ausdruck ( Zahl Ziffer + Ausdruck ) Ausdruck ( Ziffer Ziffer + Ausdruck ) Ausdruck ( 1 Ziffer + Ausdruck ) Ausdruck ( 17+ Ausdruck ) Ausdruck ( 17+ Zahl ) Ausdruck ( 17+4) Ausdruck ( 17+4) Zahl Ziffer ( 17+4) Zahl Ziffer Ziffer ( ) Ziffer Ziffer Ziffer 17+4 ( 17+4) 3 Ziffer Ziffer ( 17+4) 3 Ziffer Ziffer ( 17+4) 37 Ziffer ( 17+4) 372 15/15

Eine formale Definition von Grammatiken Eine Grammatik ist ein 4-Tupel G= ( V,T,P,S) bestehend aus: 1. Einer Menge V von Nichtterminalsymbolen (Variablen), 2. einer Menge T von Terminalsymbolen (Tokens) mit V T =, 3. einer Menge P von Produktionen (Regeln) der Form p q mit und sowie p (V T) * q V T S V 4. einem Startsymbol. v V * V v ( ) * Hierbei bedeutet, dass eine Zeichenkette ist, die aus den Variablen in gebildet wird. 16/15

Ableitbarkeit Sei x=x 1...p...x n ein Wort aus, das die linke Seite einer Regel p q P enthält. Dann kann man durch Ersetzen von p durch q in x ein Wort y=y 1...q...y n erhalten und schreibt dafür: oder, falls erforderlich, oder. ( V T) * Wir sagen, dass y in einem Schritt aus x ableitbar ist. y heißt ableitbar aus x mithilfe von G, kurz, wenn entweder x=y ist oder es Worte x 1, x 2,..., x n gibt mit x=x 1 und x i x y G x p q y=x n,, und n 2, für i=1,..., n-1. G x i+1 y x y 17/15

Von einer Grammatik erzeugte Sprache Die von einer Grammatik erzeugte Sprache ist die Menge der aus dem Startsymbol ableitbaren Worte, die nur aus Terminalzeichen bestehen: L(G) ist also die Menge aller aus dem Startsymbol in endlich vielen Schritten ableitbaren Terminalzeichenreihen. Meistens gibt man nur die Produktionen von G an und legt damit V und T implizit fest. Für unsere Grammatik G zur Definition arithmetischer Ausdrücke ist also L(G) die Menge aller syntaktisch korrekt gebildeten, arithmetischen Ausdrücke. 18/15

Beispiel (1) G=(V,T,P,S) sei eine Grammatik mit V = { S,A,B} T = { a,b} P= { S AB,A AA,A a,b BB,B b} Dann sieht man leicht, dass gilt: 19/15

Beispiel (2) G=(V,T,P,S) sei eine Grammatik mit V = { S} T = { a,b} P= { S asb,s ε} wobei ε das leere Wort bezeichnet. Dann ist Offensichtlich kann man mit Regeln dieser Art Klammerstrukturen erzeugen. In Java kommen solche Strukturen z.b. in Form von {...} oder if... then... else vor. 20/15

Typen von Grammatiken Nach der Art der zugelassenen Regeln klassifiziert man Grammatiken in verschiedene Typen (Chomsky-Hierarchie: Typ 0 bis Typ 3). Dies geht zurück auf Noam Chomsky, 1959, und wird in der theoretischen Informatik genauer studiert. 21/15

Die Chomsky-Hierarchie Typ Bezeichnung Regelart 0 unbeschränkte Grammatiken 1 kontextsensitive Grammatiken oder monotone Grammatiken 2 kontextfreie Grammatiken 3 reguläre Grammatiken d.h. linkslineare Grammatiken oder rechtslineare Grammatiken mit 22/15

Ein Beispiel für eine Typ-0-Grammatik Beide oben angegebenen Sprachen sind kontextfrei! Betrachten wir die folgende Typ-0-Grammatik: V = {S,a,b,c,d,n}, T ={0,1}, P={S anb, d 0, d 1, n d, n dn, 1b b0, 0b c1, ab 1, 1c c1, 0c c0, ac } Anwendungen: 23/15

Vergleich dieser Sprachtypen 0 i 3 Eine Sprache L heißt vom Typ i,, wenn es eine Grammatik vom Typ i gibt mit L=L(G). Bezeichnet L i die Familie der Sprachen vom Typ i, so gilt der (hier nicht bewiesene) Hierarchiesatz: L o L 1 L2 L3 Somit ist jede Sprache vom Typ i echt mächtiger als eine Sprache vom Typ i+1. 24/15

Existiert eine Grammatik für Java? Es ist möglich, eine Grammatik G anzugeben, so dass L(G) die Menge der korrekt gebildeten Java-Programme ist (bis auf die semantischen Nebenbedingungen). Aufgrund der semantischen Nebenbedingungen kann ein der Grammatik entsprechendes Java-Programm eventuell nicht übersetzbar sein. Beispielsweise kann man aus der Grammatik nicht ableiten, dass eine Variable erst deklariert werden muss, bevor sie benutzt wird. Eine Grammatik für Java findet man z.b. in: R. Kühnel, Java Fibel, Addison Wesley, 1996, Anhang A. 25/15

Backus-Naur-Form (BNF) Für die Spezifikation der Syntax von Programmiersprachen verwendet man häufig kontextfreie Grammatiken. Allerdings werden die Regeln meist in der Backus-Naur-Form (BNF) dargestellt: Anstelle von wird ::= (oder =) verwendet. Mit dem Metasymbol werden Regeln zusammengefasst. Nichtterminalsymbole werden als in spitzen Klammern eingeschlossene Zeichenreihen repräsentiert. Beispiel: <Zahl> ::= <Ziffer> <Zahl><Ziffer> <Ziffer> ::= 0 1 2 3 4 5 6 7 8 9 26/15

Erweiterte Backus-Naur-Form (EBNF) Hierbei stehen Terminalzeichen in Anführungszeichen oder werden anderweitig hervorgehoben. n 0 Für Wiederholungen verwendet man die Notation {...}. Optionale Teile hingegen werden in eckige Klammern [...] eingeschlossen. Lässt man führende Nullen zu, so kann man eine Integer-Zahl folgendermaßen beschreiben: Integer ::= [+ -]Ziffer{Ziffer} 27/15

Zusammenfassung Imperative Programmiersprachen wie Java orientieren sich an der Funktionsweise der Von-Neumann-Rechner. Sie stellen abstrakte Anweisungen zur Verfügung. Zur Beschreibung von Programmiersprachen verwendet man Grammatiken. Die von einer Grammatik erzeugte Sprache ist die Menge aller in endlich vielen Schritten ableitbaren, variablenfreie Zeichenketten. Je nach Struktur der Regeln sind Grammatiken unterschiedlich mächtig. Die Chomsky-Hierarchie klassifiziert verschiedene Arten von Grammatiken. Die (erweiterte) Backus-Naur-Form ist eine typische Art Grammatiken von Programmiersprachen zu notieren. 28/15