Einführung in die Programmierung Prof. Dr. Bertrand Meyer

Slides:



Advertisements
Ähnliche Präsentationen
Vorlesung Compilertechnik Sommersemester 2008
Advertisements

Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2012.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Imperative Programmierung
Grammatiken, Definitionen
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Kapitel 4 Syntaktische Analyse: LR Parsing.
FH-Hof Extensible Markup Language Richard Göbel. FH-Hof Extensible Markup Language XML XML ist universeller Ansatz für die Strukturierung von Zeichenketten.
Java: Objektorientierte Programmierung
WS Algorithmentheorie 02 - Polynomprodukt und Fast Fourier Transformation Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Prof. Dr. rer.nat. Ralph Großmann Fakultät Informatik / Mathematik Sommersemester 2012 Internet-Technologien XML-basierte Techniken Teil Metasprache der.
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Christian Schindelhauer
Prof. Dr. Bernhard Wasmayr
Studienverlauf im Ausländerstudium
Schieferdeckarten Dach.ppt
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
Von der Sprache zum Programm
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
1. 2 Schreibprojekt Zeitung 3 Überblick 1. Vorstellung ComputerLernWerkstatt 2. Schreibprojekt: Zeitung 2.1 Konzeption des Kurses 2.2 Projektverlauf.
20:00.
Die Geschichte von Rudi
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
In der Schule.
Eine Einführung in die CD-ROM
für Weihnachten oder als Tischdekoration für das ganze Jahr
TWS/Graph HORIZONT Produktionsüberwachung für “TWS for z/OS”
Syntaxanalyse Bottom-Up und LR(0)
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Geometrische Aufgaben
Vorlesung Mai 2000 Konstruktion des Voronoi-Diagramms II
Symmetrische Blockchiffren DES – der Data Encryption Standard
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
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.
Dieser nicht Fehler finden Algorithmus enthält einfach einen gravierenden welcher zu ist.
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
PHP: Operatoren und Kontrollstrukturen
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Imperfekt Wie sagt man das mit Imperfekt
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
Es war einmal ein Haus
Numbers Greetings and Good-byes All about Me Verbs and Pronouns
Mensch – Maschine - Kommunikation
J-Team: Gymnasium Ulricianum Aurich und MTV Aurich Ein Projekt im Rahmen von UlricianumBewegt.de Euro haben wir schon…  8000 mal habt ihr bereits.
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
1 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt Wie.
7. Formale Sprachen und Grammatiken
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Monatsbericht Ausgleichsenergiemarkt Gas – Oktober
Inhalt Einordnung und Funktion der lexikalische Analyse Grundlagen
Lektion 16: Die Syntax beschreiben
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 3: Der Umgang mit Objekten II.
 Sortigkeit oder Arität
 Präsentation transkript:

Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 16: Die Syntax beschreiben

Ziele der heutigen Vorlesung Sprachen, die andere Sprachen beschreiben, kennenlernen Die Syntaxbeschreibung für Eiffel lesen und verstehen können Einfache Syntaxbeschreibungen selbst erstellen

Syntax: Konditional Eine Bedingungsinstruktion besteht aus (in dieser Reihenfolge): Einem „If“-Teil der Form if Bedingung. Einem „Then“-Teil der Form then Instruktion. Null oder mehr „Elseif“-Teile, jeder der Form elseif Bedingung then Instruktion. Kein oder ein „Else-Teile“ der Form else Instruktion Dem Schlüsselwort end. Hierbei ist jede Bedingung ein Boole‘scher Ausdruck, und jede Instruktion ist eine Verbunds-Instruktion.

Wieso Syntax formal beschreiben? Wir kennen Syntaxbeschreibungen aus natürlichen Sprachen: Z.B. Grammatik für Deutsch, Englisch, Französisch,… Gut genug für den menschlichen Gebrauch Uneindeutig, wie die natürliche Sprache selbst

Die Macht des menschlichen Gehirns I cdnoult blvelee taht I cluod aulacity uesdnatnrd waht I was rdgnieg. The Paomnnehal Pweor of the Hmuan Mnid Aoccdrnig to a rscheearch at Cmabrigde Uinervtisy, is deosn't mttaer in waht oredr the ltteers in a wrod are, the olny iprmoatnt tihng is taht the frist and lsat ltteer be in the rghit pclae. The rset can be a taotl mses and you can sitll raed it wouthit any porbelm. Tihs is bcuseae the huamn mnid deos not raed ervey lteter by istlef, but the wrod as a wlohe. Ptrety Amzanig Huh?

Wieso Syntax formal beschreiben? Compiler benutzen Algorithmen, um Die Gültigkeit des Programmtextes zu überprüfen Den Programmtext zu analysieren um Elemente für einen abstrakten Syntaxbaum zu extrahieren Den Programmtext in Maschineninstruktionen zu übersetzen Compiler brauchen eine strikte formale Definition einer Programmiersprache

Formale Beschreibung der Syntax Benutzen Sie eine formale Sprache, um Programmiersprachen zu beschreiben. Sprachen, die andere Sprachen beschreiben, heissen Meta-Sprachen Die Meta-Sprache, die Eiffel beschreibt: BNF-E (Variante der Backus-Naur-Form, BNF)

Geschichte 1954 FORTRAN: Erste weitgehend bekannte Programmiersprache (entwickelt von John Backus et Al.) 1958 ALGOL 58: Zusammenarbeit von europäischen und amerikanischen Gruppen 1960 ALGOL 60: Die Vorbereitung zeigte den Bedarf einer formalen Beschreibung auf  John Backus (ALGOL Team) schlug die Backus-Normal-Form (BNF) vor 1964: Donald Knuth schlug vor, Peter Naur für sein Mitwirken zu ehren  Backus-Naur-Form Viele weitere Varianten seither, z.B. die graphische Variante von Niklaus Wirth

Formale Beschreibung einer Sprache Mit BNF kann man syntaktische Eigenschaften einer Sprache beschreiben: Zulässige Struktur einer Sprache Ähnlich Grammatiken in normaler Sprache Erinnerung: Die Beschreibung einer Programmiersprache beinhaltet auch lexikalische und semantische Eigenschaften  Andere Werkzeuge

(Erinnerung: von Lektion 3) Semantische Regeln definieren den Effekt eines Programms, das den syntaktischen Regeln genügt Syntaktische Regeln definieren, wie man Exemplare aus Tokens, die den lexikalischen Regeln genügen, herstellt Lexikalische Regeln definieren, wie man aus Zeichen Tokens macht Statische Semantik (Gültigkeitsregel) Semantische Regeln Syntaktische Regeln basieren auf Lexikalische Regeln

Formale Beschreibung der Syntax Eine Sprache ist eine Menge von Phrasen Eine Phrase ist eine endliche Sequenz von Zeichen (Tokens) eines gewissen „Vokabulars“ Nicht jede mögliche Sequenz ist eine Phrase der Sprache Eine Grammatik spezifiziert, welche Sequenzen Teil der Sprache sind und welche nicht. BNF wird benutzt, um eine Grammatik für eine Programmiersprache zu definieren.

Beispiele von Phrasen class PERSON class feature age: INTEGER -- Alter end class age: INTEGER -- Alter end PERSON feature

Grammatik Definition Eine Grammatik für eine Sprache ist eine endliche Menge von Regeln zum Erstellen von (Token) Sequenzen, so dass gilt: Jede Sequenz, die man durch endlich häufiges Anwenden von Regeln der Grammatik erhält, ist eine Phrase der Sprache Jede Phrase der Sprache kann durch eine endliche Anzahl von Anwendungen der Grammatik-Regeln erzeugt werden

Elemente von Grammatiken: Terminale Zeichen der Sprache, die nicht durch eine Produktion der Grammatik definiert sind. Z.B. Schlüsselworte von Eiffel wie if, then, end oder Symbole wie das Semikolon “;” oder die Zuweisung “:=”

Elemente einer Grammatik: Nonterminale Namen von syntaktischen Strukturen oder Unterstrukturen, die benutzt werden, um Phrasen zu erstellen

Elemente einer Grammatik: Produktionen Produktionen Regeln, die durch eine Kombination von Terminalen und (anderen) Nonterminalen die Nonterminale einer Grammatik definieren

Eine Beispielsproduktion Konditional: else Instruktion if Bedingung then Instruktion end Terminal Nonterminal Produktion

BNF Elemente: Verkettung Graphische Repräsentation: BNF: A B Bedeutung: A gefolgt von B A B

BNF Elements: Optional Graphische Repräsentation: BNF: [ A ] Bedeutung: A oder nichts A

BNF Elements: Wahl A B Graphische Repräsentation: BNF: A | B Bedeutung: entweder A oder B A B

BNF Elements: Repetition Graphische Repräsentation: BNF: { A }* Bedeutung: Sequenz von null oder mehreren A A

BNF Elements: Repetition, einmal oder mehr Graphische Repräsentation: BNF: { A }+ Bedeutung: Sequenz von einem oder mehreren A A

BNF Elemente: Übersicht Verkettung: A B A B A Optional: [ A ] A B Wahl: A | B A Repetition (0 oder mehr): { A }* A Repetition (mind. einmal): { A }+

Ein einfaches Beispiel Ziffer: float_zahl: - Ziffer 1 . Ziffer 2 3 Beispielphrasen: .76 -.76 1.56 12.845 -1.34 13.0 Übersetzen Sie es in die schriftliche Form! 4 5 6 7 8 9

Ein einfaches Beispiel In BNF: | | | | | | | | | Ziffer = 1 2 3 4 5 6 7 8 9 [ ] { }* { }+ float_zahl = - Ziffer . Ziffer

BNF Elemente kombiniert Konditional: else Instruktion if Bedingung then Instruktion end In BNF geschrieben: [ Instruktion else end if then Bedingung ] Konditional =

BNF: Konditional mit elseif Else_teil Then_teil_liste if end [ ] Konditional = Then_teil elseif }* { Then_teil_liste = Then_teil = Boolescher_ausdruck then Verbund Else_teil = else Verbund

Andere Grammatik für Konditional = If_teil Then_teil Else_liste end If_teil = Boolescher_ausdruck if Then_teil = Verbund then Elseif_teil Verbund { ] else }* [ Else_liste = Elseif_teil = Boolescher_ausdruck Then_teil elseif

Einfaches BNF-Beispiel Satz I [ don’t ] Verb Namen Quant Namen Name {and Name}* Name tomatoes | shoes | books | football Verb like | hate Quant a lot | a little Welche der folgenden Phrasen sind korrekte Sätze? I like tomatoes and football I don’t like tomatoes a little I hate football a lot I like shoes and tomatoes a little I don’t hate tomatoes, football and books a lot Schreiben Sie die BNF um, damit sie auch die inkorrekten Phrasen beinhaltet = = = = =

Einfaches BNF-Beispiel (Lösung) Welche der folgenden Sätze sind korrekt? - I like tomatoes and football  I don’t like tomatoes a little  I hate football a lot  I like shoes and tomatoes a little - I don’t hate tomatoes, football and books a lot Schreiben Sie die BNF um, damit sie auch die inkorrekten Phrasen beinhaltet Satz I [ don’t ] Verb Namen [ Quant ] Namen Name [{, Name}* and Name] Name tomatoes | shoes | books | football Verb like | hate Quant a lot | a little = = = = =

BNF-E Wird in der offiziellen Beschreibung von Eiffel benutzt. Jede Produktion ist eine der folgenden Verkettung A B C [ D ] Wahl A B | C | D Repetition A { B delimiter ... }* A { B delimiter ... }+ = = Interpretiert als A [ B { delimiter B }* ] = = Interpretiert als A B { delimiter B }* = =

BNF-E Regeln Jedes Nonterminal muss auf der linken Seite von genau einer Produktion auftreten. Diese Produktion ist seine definierende Produktion. Jede Produktion ist von einer Art: Verkettung, Wahl oder Repetition

BNF: Konditional mit elseif Else_teil Then_teil_liste if end [ ] Konditional = Then_teil elseif }* { Then_teil_liste = Then_teil = Boolescher_ausdruck then Verbund Else_teil = else Verbund

[ ] { ... }+ BNF-E: Konditional = = = = Konditional if Then_teil_liste Else_teil end { ... }+ Then_teil_liste = Then_teil elseif Then_teil = Boolescher_ausdruck then Verbund Else_teil else Verbund =

Rekursive Grammatiken Konstrukte können verschachtelt sein In BNF wird dies mit rekursiven Grammatiken ausgedrückt. Rekursion: zirkuläre Abhängigkeiten von Produktionen

Rekursive Grammatiken Konditionale können in anderen Konditionalen verschachtelt sein: Else_teil = else Verbund { …}* Verbund = Instruktion ; | | Aufruf | ... Instruktion = Konditional Schleife

Rekursive Grammatiken Der Produktionsname kann in der eigenen Definition vorkommen Definition von Then_teil_liste mit Repetition: Rekursive Definition von Then_teil_liste: { …}* Then_teil_liste = Then_teil elseif [ ] Then_teil_liste = Then_teil elseif Then_teil_liste

Konditional if a = b then a := a - 1 b := b + 1 elseif a > b then end Konditional Then_teil_liste [ Else_teil ] = if end Then_teil_liste { ... }+ = Then_teil elseif Then_teil = Boolescher_ausdruck then Verbund Else_teil = else Verbund

BNF für einfache arithmetische Ausdrücke Nehmen Sie an, Number ist als positiver Integer definiert, und Variable besteht aus einem Buchstaben Keine eingeklammerte Ausdrücke Beispiele von Ausdrücken: a a + b a - b a * 7 + b Brauchen wir eine rekursive Grammatik? Nein: Expr Factor {Operator Factor}* Factor Number | Variable Operator + | – | * | / = = =

BNF für einfache arithmetische Ausdrücke Jetzt erlauben wir Klammern; Beispiele von Ausdrücken: a a + b a - b a * 7 + b 7 / ((a * (b + 12)) – c) 7 / ((a * b + 12) – c) Brauchen wir eine rekursive Grammatik? Expr Term {Operator Term}* Term Number | Variable | Nested Nested ( Expr ) Operator + | – | * | / = Ja, z.B.: = = = Ist das eine “gute” Grammatik? Nein: sie entspricht nicht der Semantik; siehe z.B. den Unterschied zwischen a * b + 12 a + b * 12

BNF für einfache arithmetische Ausdrücke Eine bessere rekursive Grammatik: Expr Term { Add_op Term }* Term Factor { Mult_op Factor}* Factor Number | Variable | Nested Nested ( Expr ) Add_op + | – Mult_op * | / = = = = = = Welche der folgenden Phrasen sind korrekt? a a + b -a + b a * 7 + b 7 / (3 * 12) – 7 (3 * 7) (5 + a ( 7 * b))   -    -

BNF für einfache arithmetische Ausdrücke Welche der folgenden Phrasen sind korrekt? a  a + b  -a + b - a * 7 + b  7 / (3 * 12) – 7  (3 * 7)  (5 + a ( 7 * b)) - Expr {Term Add_op …}+ Term { Factor Mult_op …}+ Factor Number | Variable | Nested Nested ( Expr ) Add_op + | – Mult_op * | / = = = = = =

Richtlinien für Grammatiken Halten Sie Produktionen kurz. Einfacher zu lesen Bessere Bewertung der Sprachengrösse Konditional if Boolescher_ausdruck then Verbund { elseif Boolescher_ausdruck then Verbund }* [ else Verbund ] end =

Richtlinien für Grammatiken Behandeln Sie lexikale Konstrukte wie Terminale Bezeichner Konstante Werte Identifier Letter {Letter | Digit | "_ ”}* Integer_constant [-]{Digit}+ Floating_point [-] {Digit}* “." {Digit}+ Letter "A" | "B" | ... | "Z" | "a" | ... | "z" Digit "0" | "1" | ... | "9“ = = = = =

Richtlinien für Grammatiken Benutzen Sie eindeutige Produktionen Eine anwendbare Produktion kann so durch Anschauen von einem lexikalen Element pro Mal gefunden werden Konditional if Then_teil_liste [ Else_teil ] end Verbund { Instruktion }* Instruktion Konditional | Schleife | Aufruf | ... = = =

Syntaxbeschreibung von Eiffel Die Syntax von Eiffel ist in BNF-E geschrieben Eine Produktion pro Nonterminal Jede Produktion ist entweder eine Verkettung, eine Wahl oder eine Repetition Spezielle Semantik der Repetition Rekursion ist erlaubt Terminale (lexikale) Konstrukte benutzen nicht BNF-E für ihre Beschreibung Reservierte Wörter(z.B. if, end, class) manifeste Konstanten (237, -12.93) Symbole (+, ;) Bezeichner (LINKED_LIST, put)

Syntaxbeschreibung von Eiffel (lexikale Ebene) Lexikale Konstrukte werden mit einer BNF-ähnlichen regulären Grammatik beschrieben Mischen von Produktionstypen erlaubt Benutzen Sie Klammern für Eindeutigkeit, z.B. Letter (Letter | Digit | Underscore)* Keine Rekursion Benutzt Symbole und Zeichenintervalle, z.B. ‘a’..’z’ Einfache Repetitionsregeln (siehe BNF) Bei der Verkettungen müssen die Elemente nicht (lexikalisch) getrennt sein

Noch eine Übung Definieren Sie eine rekursive Grammatik in BNF-E für Boole‘sche Ausdrücke mit der folgenden Beschreibung: Einfache Ausdrücke, beschränkt auf die Variablenbezeichner x, y, oder z, die, neben Klammerung, als Operationen das unäre not und die binären and, or, und implies beinhalten können Gültige Phrasen wären z.B. not x and not y (x or y implies z) y or (z) (x)

Lösung B_expr With_par | Expr With_par “(” Expr “)” Expr Not_term | Bin_term | Variable Bin_term B_expr Bin_op B_expr Bin_op “implies”| “or” | “and” Not_term “not” B_expr Variable “x” | “y” | “z” Bemerkung: hier brauchen wir “x” um Terminale zu bezeichnen = = = = = = =

Einen Parser schreiben Ein Feature pro Produktion Verkettung: Sequenz von Feature-Aufrufen für Nonterminale, überprüft auf Terminale Wahl: Konditional mit Verbund pro Alternative Repetition: Schleife

Einen Parser schreiben: EiffelParse Automatische Generierung von abstrakten Syntaxbäumen für Phrasen Basiert auf BNF-E Eine Klasse pro Produktion Die Klassen erben von vordefinierten Klassen: AGGREGATE, CHOICE, REPETITION, TERMINAL Das Feature production definiert eine Produktion

Einen Parser schreiben: Werkzeuge Yooc: Übersetzt BNF-E zu EiffelParse-Klassen Yacc / Bison: Übersetzt BNF zu C-Parser

BNF ähnliche Syntaxbeschreibungen DTD: Beschreibung von XML-Dokumenten <!ELEMENT collection (recipe*)> <!ELEMENT recipe (title, ingredient*,preparation)> <!ELEMENT title (#PCDATA)> <!ELEMENT ingredient (ingredient*,preparation)?> <!ATTLIST ingredient name CDATA #REQUIRED amount CDATA #IMPLIED unit CDATA #IMPLIED> <!ELEMENT preparation (step*)> <!ELEMENT step (#PCDATA)>

BNF ähnliche Syntaxbeschreibungen Unix/Linux: Übersicht der Kommandos SYNOPSIS man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file] [-M pathlist] [-P pager] [-S section_list] [section] name ...

Eiffel-Syntax http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-367.pdf http://www.gobosoft.com/eiffel/syntax/

Was wir gesehen haben Eine Art Syntax zu beschreiben: BNF 3 Varianten: BNF, BNF-E, graphisch Einen weiteres Beispiel für die Rekursion

Übung Beschreiben Sie BNF-E mithilfe von BNF-E. Nehmen Sie an, dass die lexikalen Konstrukte Keyword und Symbol (für Terminale) und Identifier (für Nonterminale) gegeben sind: Terminal Keyword | Symbol Nonterminal Identifier = =