Kapitel 5: Syntaxdiagramme und Grammatikregeln

Ähnliche Dokumente
Kapitel 4: Syntaxdiagramme und Grammatikregeln

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Alphabet, formale Sprache

Syntax von Programmiersprachen

Syntax von Programmiersprachen

Syntax von Programmiersprachen

Kapitel 2. Methoden zur Beschreibung von Syntax

Teil 3: Syntax-Diagramme

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

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

Sprachen sind durch folgenden Aufbau gekennzeichnet:

Einführung in die Programmiertechnik

Kapitel 2: Methoden zur Beschreibung von Syntax

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

7. Syntax: Grammatiken, EBNF

Kapitel 2. Methoden zur Beschreibung von Syntax

Inhalt Kapitel 11: Formale Syntax und Semantik

Einführung in die Informatik. Programming Languages

2.2 Syntax, Semantik und Simulation

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

Programmierkurs Java

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

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

Einführung in die Informatik. Programming Languages

Programmierkurs II. C und Assembler

Programmierkurs II. Prof. Dr. Wolfgang Effelsberg. Universität Mannheim. Sommersemester Wolfgang Effelsberg Programmiersprachen

Programmierkurs II. Prof. Dr. Wolfgang Effelsberg. Universität Mannheim. Sommersemester Wolfgang Effelsberg Programmiersprachen

Übung Praktische Informatik I

Kapitel IV Formale Sprachen und Grammatiken

Ein Fragment von Pascal

5.2 Endliche Automaten

Syntax von Programmiersprachen

7. Formale Sprachen und Grammatiken

3 Syntax von Programmiersprachen

3 Syntax von Programmiersprachen

Grundbegriffe der Informatik Tutorium 33

1 Formale Sprachen, reguläre und kontextfreie Grammatiken

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

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

Einführung in die Programmierung für NF. Übung

Abschnitt 4: Daten und Algorithmen

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

Backus-Notation und Syntaxanalyse

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 48

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

Daten und Algorithmen

Formale Sprachen und Grammatiken

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

Grundlagen der Programmierung 3 A

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 45

Ganze Zahlen, Ausdrücke Variablen/Konstanten

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

Von der Chomsky-Hierarchie

Empfehlenswerte Referenzen

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

Einführung in die Informatik I (autip)

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

Klausur zur Vorlesung Grundbegriffe der Informatik 5. März 2014

2.1 Allgemeines. Was ist eine Sprache? Beispiele:

Algorithmen und Formale Sprachen

Formale Sprachen, reguläre und kontextfreie Grammatiken

Beuth Hochschule Einführende Gentle-Programme WS12/13, S. 1

Lexikalische Programmanalyse der Scanner

3.4 Struktur von Programmen

3.1 Reservierte Wörter

Vorlesung Automaten und Formale Sprachen Sommersemester Beispielsprachen. Sprachen

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

15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen

Einführung in die Programmierung EBNF. Thomas R. Gross. Department Informatik ETH Zürich

Zuerst wird die Bedingung ausgewertet. Ist sie erfüllt, wird der Rumpf des while-statements ausgeführt. Nach Ausführung des Rumpfs wird das gesamte

Grundlagen der Programmiersprachen

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

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

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

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

Theoretische Informatik I

4. Induktives Definieren - Themenübersicht

Überblick. Ausdrücke. 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 Induktion und Rekursion 3.3 Ausdrücke

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

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

Definition Compiler. Bekannte Compiler

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

Syntaxanalyse Ausgangspunkt und Ziel

Reguläre Ausdrücke. Michael Jäger. 4. April 2017

Syntax von Programmiersprachen

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

Programmiersprachen und Übersetzer

Begriffe (Wiederholung)

Reguläre Grammatiken/Sprachen und endliche Automaten

Literatur Reguläre Ausdrücke

Transkript:

5. Syntaxdiagramme und Grammatikregeln 5-1 Objektorientierte Programmierung (Winter 2010/2011) Kapitel 5: Syntaxdiagramme und Grammatikregeln Syntaxdiagramme Grammatikregeln (kontextfrei) Beispiele: Lexikalische Syntax

5. Syntaxdiagramme und Grammatikregeln 5-2 Inhalt 1. Syntax-Formalismen 2. Syntaxdiagramme 3. Beispiel: Zahlkonstanten in C++

5. Syntaxdiagramme und Grammatikregeln 5-3 Syntax-Formalismen (1) Ein C++-Programm ist eine Folge von Zeichen, aber nicht jede Folge von Zeichen ist ein C++-Programm. Ein Alphabet ist eine endliche, nicht-leere Menge, deren Elemente Zeichen heißen. Ein Wort über einem Alphabet ist eine endliche Folge von Zeichen des Alphabets. Eine formale Sprache (über einem Alphabet) ist eine (meist unendliche) Menge von Worten (über dem Alphabet).

5. Syntaxdiagramme und Grammatikregeln 5-4 Syntax-Formalismen (2) Es gibt verschiedene Formalismen, um klar und eindeutig eine formale Sprache (Menge von Zeichenfolgen) zu definieren, z.b. Syntax-Diagramme (Kontextfreie) Grammatik-Regeln BNF (Backus-Naur-Form) ist eine spezielle Syntax für kontextfreie Grammatikregeln (recht verbreitet). Syntaxdiagramme und kontextfreie Grammatiken haben die gleiche Ausdruckskraft, d.h. können die gleichen Mengen von Zeichenfolgen beschreiben.

5. Syntaxdiagramme und Grammatikregeln 5-5 Syntax-Formalismen (3) Als professioneller Programmierer sollte man die Definition der Programmiersprache lesen können. Die Grammatik ist eine Referenz in unklaren Fällen, hilft aber auch zum Verständnis der Sprache. Die syntaktischen Kategorien sind oft nützliche Konzepte. Es könnte ja sein, dass der Compiler einen Fehler enthält. Man sollte sich nicht zum Sklaven eines einzelnen Compilers machen. Der Compiler hat nicht immer recht (aber meistens schon). Es gibt ein unabhängiges Gesetz (den ISO-Standard). Zumindest hilft die Aufklärung eines Fehlers, ihn zukünftig zu vermeiden. Herumprobieren ( wie hätte er es denn gern? ) ist alleine keine richtige Lösung.

5. Syntaxdiagramme und Grammatikregeln 5-6 Syntax-Formalismen (4) Mit kontextfreien Grammatiken definiert man nur eine Obermenge der C++-Programme, und stellt dann weitere einschränkende Forderungen, z.b. jede Variable muss vor ihrer Verwendung deklariert sein. Kontextfreie Grammatiken (und damit auch Syntaxdiagramme) können solche Bedingungen nicht ausdrücken. Die Trennung dieser Aufgaben in die Compiler-Phasen Parser und semantische Analyse ist aber auch für die Modularisierung nützlich.

5. Syntaxdiagramme und Grammatikregeln 5-7 Inhalt 1. Syntax-Formalismen 2. Syntaxdiagramme 3. Beispiel: Zahlkonstanten in C++

5. Syntaxdiagramme und Grammatikregeln 5-8 Syntaxdiagramme (1) Digit: 0 1 2 3 4... 8 9 Ein Syntaxdiagramm besteht aus: Namen der definierten syntaktischen Kategorie, Startknoten: Pfeil von außen in das Diagramm. Zielknoten: Pfeil, der das Diagramm verlässt. Kreise/Ovale und Rechtecke, die mit gerichteten Kanten verbunden sind.

5. Syntaxdiagramme und Grammatikregeln 5-9 Syntaxdiagramme (2) Die formale Sprache, die durch dieses Diagramm definiert wird, ist die Menge der Dezimalziffern {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Um zu prüfen, ob eine Eingabe, z.b. 2, zu der Sprache Digit gehört, die durch das Diagramm definiert wird, muss man einen Weg durch das Diagramm finden, der der Eingabe entspricht: 0 1 2 3 4... 8 9

5. Syntaxdiagramme und Grammatikregeln 5-10 Syntaxdiagramme (3) Solche Diagramme können auf zwei Arten verwendet werden: Um ein gültiges Wort der Sprache zu erzeugen, folgt man einem Pfad durch das Diagramm vom Start zum Ziel und druckt jedes Symbol in einem Kreis/Oval aus, den man durchläuft. Um festzustellen, ob eine gegebene Eingabe syntaktisch korrekt ist, muss man einen Pfad durch das Diagramm finden, so dass beim Durchlaufen eines Kreises/Ovals das Zeichen darin das nächste Eingabezeichen ist.

5. Syntaxdiagramme und Grammatikregeln 5-11 Syntaxdiagramme (4) Jede Kante hat nur eine mögliche Richtung. Manchmal ist es für den Anfänger etwas schwierig, die Richtung einer Kante zu erkennen. Wenn alle Richtungen explizit gemacht sind, sieht das Diagramm so aus: 0 1 2 3 4... 8 9 Normalerweise wird der Pfeilkopf aber nicht in jedem Segment einer Kante wiederholt.

5. Syntaxdiagramme und Grammatikregeln 5-12 Syntaxdiagramme (5) Es gibt Verzweigungsknoten, an denen man verschiedene ausgehende Kanten benutzen kann. Z.B., nach der Eingangskante könnte man nach unten gehen, und die Ziffer 0 ausgeben/einlesen, oder man kann nach rechts gehen, um eine der Ziffern 1 bis 9 zu erhalten. Um eine gegebene Eingabe zu prüfen, hilft es meist, das nächste Eingabesymbol anzuschauen, um den richtigen Pfad auszuwählen. Dies ist, was der Compiler auch macht. Man versucht sicherzustellen, dass an jeder Verzweigung, die Kreise/Ovale, die man in verschiedenen Richtungen erreichen kann, disjunkt sind. Gibt es keinen passenden Pfad: Syntaxfehler.

5. Syntaxdiagramme und Grammatikregeln 5-13 Syntaxdiagramme (6) Syntaxdiagramme können Zyklen enthalten (es gibt ja unendlich viele gültige C++-Programme). Digit Sequence: 0 1... 8 9 Aufgabe: Finden Sie einen Pfad durch das Diagramm, um zu zeigen, dass 81 korrekt ist. Man darf die gleiche Kante mehrere Male durchlaufen.

5. Syntaxdiagramme und Grammatikregeln 5-14 Syntaxdiagramme (7) Man kann an anderer Stelle definierte Diagramme als Module benutzen. Dies wird als Rechteck dargestellt, das den Namen des anderen Diagramms (def. synt. Kat.) enthält: Digit Sequence: Digit Ein Rechteck steht also für eine syntaktische Kategorie (wie Subjekt, Prädikat, Objekt ).

5. Syntaxdiagramme und Grammatikregeln 5-15 Syntaxdiagramme (8) Ein Kasten kann durch das Diagramm ersetzt werden, für das er steht (er hat wie das Diagramm eine eingehende und eine ausgehende Kante). Digit Sequence: Digit 0 1... 8 9

5. Syntaxdiagramme und Grammatikregeln 5-16 Syntaxdiagramme (9) Natürlich muss man nicht explizit das Diagramm der benutzten syntaktischen Kategorie einfügen: Man merkt sich einfach, wo man im übergeordneten Diagramm war (bei welchem Rechteck), durchläuft dann das Diagramm für die syntaktische Kategorie, die in dem Rechteck steht, anschließend (wenn man mit diesem Diagramm fertig ist) kehrt man zum übergeordneten Diagramm zurück, und folgt dort dem Pfeil, der das Rechteck verläßt.

5. Syntaxdiagramme und Grammatikregeln 5-17 Syntaxdiagramme (10) Natürlich weiß man nach einiger Zeit, wofür z.b. die syntaktische Kategorie Digit steht, und braucht das zugehörige Diagramm dann nicht mehr nachzuschlagen. Jedes Diagramm definiert eine formale Sprache. D.h. eine Menge von Zeichenketten. Wenn man ein Rechteck durchläuft, kann man jedes Element der zugehörigen Sprache ausdrucken bzw. einlesen.

5. Syntaxdiagramme und Grammatikregeln 5-18 Syntaxdiagramme (11) Kreise/Ovale und Rechtecke können beide im gleichen Diagramm benutzt werden: Zahlkonstante: (nur Beispiel, nicht Teil von C++) Digit Sequence - Dieses Diagramm definiert eine Sprache, die z.b. folgende Zeichenfolgen enthält: 123, -45, 007. Dagegen gehören folgende Zeichenfolgen nicht zu der definierten Sprache: +89, --5, 23-42, 0.56.

5. Syntaxdiagramme und Grammatikregeln 5-19 Syntaxdiagramme (12) Syntaxdiagramme können rekursiv definiert sein, d.h. das Diagramm für eine synt. Kat. X kann selbst einen mit X beschrifteten Kasten enthalten. Entsprechend könnten sich auch zwei syntaktische Kategorien X und Y gegenseitig aufrufen. Es ist nicht verlangt, dass eine syntaktische Kategorie vor ihrer Verwendung definiert ist. Es müssen nur am Ende alle verwendeten syntaktischen Kategorien auch wirklich definiert sein. Der Pfad, den man für ein Wort der Sprache durch die Diagramme geht, muss immer endlich sein. Man kann jetzt zwar nicht mehr vorab die Diagramme für die Kästen vollständig einsetzen, aber man könnte noch die tatsächlich durchlaufenen Kästen nach Bedarf expandieren.

5. Syntaxdiagramme und Grammatikregeln 5-20 Inhalt 1. Syntax-Formalismen 2. Syntaxdiagramme 3. Beispiel: Zahlkonstanten in C++

5. Syntaxdiagramme und Grammatikregeln 5-21 Zahlkonstanten in C++ (1) integer-literal: dec-literal int-suffix oct-literal int-suffix hex-literal int-suffix

5. Syntaxdiagramme und Grammatikregeln 5-22 Zahlkonstanten in C++ (2) Im C++ Buch von Stroustrup (dem Erfinder der Sprache) werden keine Syntaxdiagramme verwendet, sondern Grammatik-Regeln. Dort finden sich auf Seite 796 folgende Definition, die obigem Diagramm entspricht: integer-literal: decimal-literal integer-suffix opt octal-literal integer-suffix opt hexadecimal-literal integer-suffix opt Es ist also eine Alternative pro Zeile angegeben, opt markiert optionale Teile.

5. Syntaxdiagramme und Grammatikregeln 5-23 Zahlkonstanten in C++ (3) Die Grammatik-Notation ist natürlich wesentlich kompakter. Die Diagramme sind am Anfang anschaulicher. Hier könnte man wenigstens den Suffix noch zusammenfassen (äquivalentes Diagramm): integer-literal: dec-literal oct-literal int-suffix hex-literal

5. Syntaxdiagramme und Grammatikregeln 5-24 Zahlkonstanten in C++ (4) Da in C++ die Oktalschreibweise (zur Basis 8) dadurch gekennzeichnet ist, dass die Zahl mit 0 beginnt, dürfen normale Dezimalzahlen nicht mit 0 beginnen: 010 bedeutet 8. Formal ist 0 auch Oktalschreibweise, aber in diesem Fall ist das Ergebnis das gleiche wie bei Dezimalschreibweise. dec-literal: nonzero-digit digit

5. Syntaxdiagramme und Grammatikregeln 5-25 Zahlkonstanten in C++ (5) digit: 0 1 2 3 4... 8 9 nonzero-digit: 1 2 3 4... 8 9

5. Syntaxdiagramme und Grammatikregeln 5-26 Zahlkonstanten in C++ (6) Grammatik-Regeln aus dem Buch von Stroustrup: digit: one of 0 1 2 3 4 5 6 7 8 9 nonzero-digit: one of 1 2 3 4 5 6 7 8 9 Normalerweise müßten die verschiedenen Alternativen untereinander geschrieben werden. Jede der eingerückten Zeilen definiert eine mögliche Ersetzung für die syntaktische Kategorie, die darüber genannt ist. Durch die Schlüsselworte one of wird markiert, dass hier jedes Zeichen einzeln eine Alternative ist.

5. Syntaxdiagramme und Grammatikregeln 5-27 Zahlkonstanten in C++ (7) Bemerkung/Exkurs: Auch in dieser Notation für Grammatik-Regeln wird unterschieden zwischen syntaktischen Kategorien (kursiv) und den letztendlich erzeugten Zeichen der definierten Sprache (normale Schrift bzw. teletype ) (entspricht Rechtecken und Kreisen/Ovalen). Beispiel (gekürzt): selection-statement: if ( condition ) statement if ( condition ) statement else statement

5. Syntaxdiagramme und Grammatikregeln 5-28 Zahlkonstanten in C++ (8) Bemerkung/Exkurs, Forts.: Die Symbole für die syntaktischen Kategorien werden auch Nichtterminalsymbole genannt, die Zeichen der erzeugten Sprache Terminalsymbole. Weil die Zeichen der Zielsprache nicht weiter durch Anwendung von Grammatikregeln ersetzt werden können (die Ersetzung endet). Es gibt viele Notationen für Grammatikregeln: Z.B. kann man syntaktischen Kategorien auch in spitze Klammern... schreiben. Manche Autoren unterstreichen auch die Zeichen der erzeugten Sprache, oder schreiben sie in....

5. Syntaxdiagramme und Grammatikregeln 5-29 Zahlkonstanten in C++ (9) Zahlkonstanten in Dezimalschreibweise sind durch folgende Grammatikregeln definiert: decimal-literal: nonzero-digit decimal-literal digit Dies entspricht folgendem Syntaxgraphen: decimal-literal: nonzero-digit decimal-literal digit

5. Syntaxdiagramme und Grammatikregeln 5-30 Zahlkonstanten in C++ (10) Wie oben gesagt, sind rekursive Definitionen (d.h. die Verwendung einer syntaktischen Kategorie in ihrer eigenen Definition) durchaus erlaubt, aber in Syntaxdiagrammen recht selten. Im Beispiel ist der Syntaxgraph mit einem Zyklus äquivalent (d.h. definiert die gleiche Sprache) und übersichtlicher: nonzero-digit digit

5. Syntaxdiagramme und Grammatikregeln 5-31 Zahlkonstanten in C++ (11) In Grammatik-Regeln kann man dagegen keine Zyklen schreiben, und setzt intensiv Rekursion ein. Rekursives Diagramm nach einmaliger Einsetzung: decimal-literal: nonzero-digit nonzero-digit digit decimal-literal digit

5. Syntaxdiagramme und Grammatikregeln 5-32 Zahlkonstanten in C++ (12) oct-literal: 0 octal-digit octal-digit: 0 1 2 3 4 5 6 7

5. Syntaxdiagramme und Grammatikregeln 5-33 Zahlkonstanten in C++ (13) Die entsprechenden Grammatik-Regeln sind: octal-literal: 0 octal-literal octal-digit: one of 0 1 2 3 4 5 6 7 octal-digit Aufgabe: Zeichnen Sie einen Syntaxgraphen, der die Grammatikregeln für octal-literal direkt abbildet. Expandieren Sie den rekursiven Aufruf von octal-literal anschließend einmal (d.h. setzen Sie eine Kopie des Graphens für den Kasten ein).

5. Syntaxdiagramme und Grammatikregeln 5-34 Zahlkonstanten in C++ (14) hex-literal: 0x hexadecimal-digit 0X hexadecimal-digit: 0... 9 a... f A... F

5. Syntaxdiagramme und Grammatikregeln 5-35 Zahlkonstanten in C++ (15) Aufgabe: Gibt es einen wesentlichen Unterschied zwischen den beiden folgenden Syntaxdiagrammen? hex-literal-1: 0x hexadecimal-digit 0X hex-literal-2: 0x 0X hexadecimal-digit

5. Syntaxdiagramme und Grammatikregeln 5-36 Zahlkonstanten in C++ (16) Die entsprechenden Grammatik-Regeln sind: hexadecimal-literal: 0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-literal hexadecimal-digit hexadecimal-digit: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

5. Syntaxdiagramme und Grammatikregeln 5-37 Zahlkonstanten in C++ (17) Die Grammatik-Regeln für integer-suffix sind: integer-suffix: unsigned-suffix long-suffix opt long-suffix unsigned-suffix opt unsigned-suffix: u U long-suffix: l L one of one of Aufgabe: Entwickeln Sie ein äquivalentes Syntax- Diagramm.