Kapitel 4: Syntaxdiagramme und Grammatikregeln

Ähnliche Dokumente
Kapitel 5: Syntaxdiagramme und Grammatikregeln

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Alphabet, formale Sprache

Kapitel 2. Methoden zur Beschreibung von Syntax

Syntax von Programmiersprachen

Syntax von Programmiersprachen

Teil 3: Syntax-Diagramme

Syntax von Programmiersprachen

Kapitel 2: Methoden zur Beschreibung von Syntax

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

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

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

Kapitel 2. Methoden zur Beschreibung von Syntax

Einführung in die Programmiertechnik

Sprachen sind durch folgenden Aufbau gekennzeichnet:

Programmierkurs II. C und Assembler

Inhalt Kapitel 11: Formale Syntax und Semantik

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

7. Syntax: Grammatiken, EBNF

5.2 Endliche Automaten

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

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

Kapitel IV Formale Sprachen und Grammatiken

Einführung in die Informatik. Programming Languages

Programmierkurs Java

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

2.2 Syntax, Semantik und Simulation

7. Formale Sprachen und Grammatiken

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

Ein Fragment von Pascal

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 Informatik. Programming Languages

Grundbegriffe der Informatik Tutorium 33

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

1 Formale Sprachen, reguläre und kontextfreie Grammatiken

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

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

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

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

Syntax von Programmiersprachen

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

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

Formale Sprachen und Grammatiken

Algorithmen und Formale Sprachen

Programmiersprachen und Übersetzer

Formale Sprachen, reguläre und kontextfreie Grammatiken

Grundlagen der Programmierung 3 A

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 48

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

3 Syntax von Programmiersprachen

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

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

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

Einführung in die Informatik I (autip)

Kontextfreie Grammatiken. Kontextfreie Grammatiken 1 / 45

Daten und Algorithmen

Literatur Reguläre Ausdrücke

3 Syntax von Programmiersprachen

Theoretische Informatik I

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

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

Abschnitt 4: Daten und Algorithmen

Grundbegriffe der Informatik

Syntaxanalyse Ausgangspunkt und Ziel

Reguläre Grammatiken/Sprachen und endliche Automaten

12 K O N T E X T F R E I E G R A M M AT I K E N rekursive definition syntaktischer strukturen

Grammatiken und ANTLR

Nachklausur zur Vorlesung Informatik 3 mit einigen Anmerkungen zu Lösungen

Aufgabe Gegeben sind die folgenden aussagenlogischen Formeln F, G, H über den Variablen u, w, y, z:

Aufgabe Gegeben sind die folgenden aussagenlogischen Formeln F, G, H über den Variablen s, u, w, y:

Aufgabe Gegeben sind die folgenden aussagenlogischen Formeln F, G, H über den Variablen s, p, w, y:

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

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

5. Die syntaktische Analyse

Schatzsuche - Endliche Automaten

Grundlagen der Programmierung 3 A

Empfehlenswerte Referenzen

Grundlagen der Programmiersprachen

Sprachbeschreibung und Erweiterung

Syntax von Programmiersprachen

Definition Compiler. Bekannte Compiler

3. Methodik der Programmerstellung

Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen -

Die Klasse MiniJava ist in der Datei MiniJava.java definiert:

Lexikalische Programmanalyse der Scanner

Selektion (bedingte Auswahl):

Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen -

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

Transkript:

4. Syntaxdiagramme und Grammatikregeln 4-1 Objektorientierte Programmierung (Winter 2006/2007) Kapitel 4: Syntaxdiagramme und Grammatikregeln Syntaxdiagramme Grammatikregeln (kontextfrei) Beispiele: Lexikalische Syntax

4. Syntaxdiagramme und Grammatikregeln 4-2 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).

4. Syntaxdiagramme und Grammatikregeln 4-3 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.

4. Syntaxdiagramme und Grammatikregeln 4-4 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, daß 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.

4. Syntaxdiagramme und Grammatikregeln 4-5 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 muß 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.

4. Syntaxdiagramme und Grammatikregeln 4-6 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.

4. Syntaxdiagramme und Grammatikregeln 4-7 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 Digramm definiert wird, muß man einen Weg durch das Diagramm finden, der der Eingabe entspricht: 0 1 2 3 4... 8 9

4. Syntaxdiagramme und Grammatikregeln 4-8 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, muß man einen Pfad durch das Diagramm finden, so daß beim Durchlaufen eines Kreises/Ovals das Zeichen darin das nächste Eingabezeichen ist.

4. Syntaxdiagramme und Grammatikregeln 4-9 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.

4. Syntaxdiagramme und Grammatikregeln 4-10 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, daß an jeder Verzweigung, die Kreise/Ovale, die man in verschiedenen Richtungen erreichen kann, disjunkt sind. Gibt es keinen passenden Pfad: Syntaxfehler.

4. Syntaxdiagramme und Grammatikregeln 4-11 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, daß 81 korrekt ist. Man darf die gleiche Kante mehrere Male durchlaufen.

4. Syntaxdiagramme und Grammatikregeln 4-12 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 ).

4. Syntaxdiagramme und Grammatikregeln 4-13 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

4. Syntaxdiagramme und Grammatikregeln 4-14 Syntaxdiagramme (9) Natürlich muß 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.

4. Syntaxdiagramme und Grammatikregeln 4-15 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.

4. Syntaxdiagramme und Grammatikregeln 4-16 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.

4. Syntaxdiagramme und Grammatikregeln 4-17 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, daß 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, muß 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.

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

4. Syntaxdiagramme und Grammatikregeln 4-19 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.

4. Syntaxdiagramme und Grammatikregeln 4-20 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

4. Syntaxdiagramme und Grammatikregeln 4-21 Zahlkonstanten in C++ (4) Da in C++ die Oktalschreibweise (zur Basis 8) dadurch gekennzeichnet ist, daß 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

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

4. Syntaxdiagramme und Grammatikregeln 4-23 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, daß hier jedes Zeichen einzeln eine Alternative ist.

4. Syntaxdiagramme und Grammatikregeln 4-24 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

4. Syntaxdiagramme und Grammatikregeln 4-25 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....

4. Syntaxdiagramme und Grammatikregeln 4-26 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

4. Syntaxdiagramme und Grammatikregeln 4-27 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

4. Syntaxdiagramme und Grammatikregeln 4-28 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

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

4. Syntaxdiagramme und Grammatikregeln 4-30 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).

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

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

4. Syntaxdiagramme und Grammatikregeln 4-33 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

4. Syntaxdiagramme und Grammatikregeln 4-34 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.