Programmieren I Primitive Datentypen Heusch 6 Ratz 4.3, 4.4 Institut für Angewandte Informatik KIT – Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu Java-Bezeichner Für Variablen, Methoden, Klassen und Schnittstellen werden Bezeichner – auch Identifizierer (von engl. identifier) oder Namen genannt – vergeben. Ein Bezeichner ist eine Folge von Zeichen, die fast beliebig lang sein kann. Jedes Zeichen ist für die Identifikation wichtig. Das heißt, ein Bezeichner, der 100 Zeichen lang ist, muss auch immer mit allen 100 Zeichen korrekt angegeben werden. Zulässige Zeichen sind Java-Buchstaben und Java-Ziffern Zu den Java-Buchstaben gehören die Buchstaben aus den Bereichen 'a' bis 'z' und 'A' bis 'Z', aber auch Zeichen wie '_', '$ und €'. Zu den Java-Ziffern gehören die Ziffern 0-9. Leerzeichen sind innerhalb von Bezeichnern verboten. Jeder Java-Bezeichner muss mit einem Java-Buchstaben beginnen. Es wird zwischen Groß- und Kleinschreibung unterschieden. 2 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiele Gültige Bezeichner: mami kuliReimtSichAufUli IchMussWilliAnrufen RAPHAEL_IST_LIEB Ungültige Bezeichner: 2und2macht4 hose gewaschen hurtig! class 3 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Reservierte Schlüsselwörter abstract assert boolean break byte byvalue case cast catch char class const continue default do double else enum extends final finally float for future generic goto if implements import instanceof int inner interface long native new null operator outer package private protected public rest return short static strictfp super switch synchronized this throw throws transient try var void volatile while Heusch 5.2 Ratz 4.1.4 4 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Konventionen für Bezeichner (Groß-/Kleinschreibung) 5 Bezeichner Konvention Beispiel Packages Kleinschreibung Trennung mit Punkt („.“) de.dhbwka.java.exer java.util Klassen, Interfaces UpperCamelCase (erster Buchstabe groß) Klassen: <Nomen> Interfaces: <Adjektiv> SomeExample Methoden lowerCamelCase (erster Buchstabe klein) <Verb><Nomen> getInstance performAction Variablen lowerCamelCase (erster Buchstabe klein) index targetValue Konstanten (final) UPPER_SNAKE_CASE (alle Buchstaben groß, Teilworte mit Unterstrich („_“) getrennt) MAX_VALUE PI CONF_FILE_NAME W. Geiger, W. Süß, T. Schlachter, C. Schmitt LegalNotice Consumable Institut für Angewandte Informatik Kommentare im Quelltext Mit Kommentaren Anmerkungen zum Programm hinzufügen Kommentare sollen es erleichtern, zu einem späteren Zeitpunkt die Funktionsweise einzelner Programmteile leichter nachzuvollziehen. Kommentare werden direkt in den Quelltext eingefügt. Kommentare werden vom Compiler überlesen. Hierzu müssen sie entsprechend gekennzeichnet werden. In Java gibt es zwei grundlegende Kommentartypen: Einzeilige Kommentare // Kommentar bis zum Ende der Zeile. Alle Zeichen hinter // werden vom Compiler überlesen. Mehrzeilige Kommentare /* */ Kommentar über mehrere Zeilen. Ab der Zeichenkombination /* werden alle Zeichen im Quelltext vom Compiler überlesen, bis die Zeichenkombination */ auftritt. 6 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel class Comment { public static void main( String args[] ) { System.out.println( "Hello World" ); // Def. der Klasse Comment // Mit diesem Befehl wird // ein Text ausgegeben /* // Ausgabe zu Testzwecken: System.out.println( "Hello Europa" ); // // // // Diese Ausgabe ist als Kommentar gekennzeichnet und wird daher nicht ausgefuehrt */ } } 7 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Anweisungen Anweisungen (statements) sind vom Programmierer erstellte Befehle zur Lösung einer Aufgabe. Ein Programm besteht aus eine Folge von Anweisungen, die in einer bestimmten Reihenfolge ausgeführt werden. Syntax von Anweisungen: Eine Anweisung ist eine einfache Anweisung oder ein Anweisungsblock (zusammengesetzte Anweisung). Eine einfache Anweisung wird mit einem Semikolon abgeschlossen. Auch leere Anweisungen (nur Semikolon) sind erlaubt. Ein Anweisungsblock fasst mehrere Anweisungen in geschweiften Klammern { } zusammen. Die Klammern { } müssen immer paarweise auftreten. Anweisungsblöcke können geschachtelt werden. 8 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel int i = 1; // Einfache Anweisung { // Beginn eines Anweisungsblocks } 9 int k = 1; System.out.println(k); ... // Weitere Anweisungen // Ende des Anweisungsblocks W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Datentypen In den Anweisungen eines Programms werden unterschiedliche Arten von Daten benötigt, z. B.: Numerische Daten (Zahlen) Zeichen (alphanumerische Daten) Boolesche Daten (logische Daten, Wahrheitswerte) Felder Java bietet hierfür verschiedene standardisierte Datentypen an. Diese Typen unterscheiden sich in ihrem zulässigen Wertebereich in der Größe des für sie benötigten Speicherplatzes Grundlegend unterscheidet Java zwei Arten von Datentypen: Primitive Datentypen (oder einfache Datentypen) Referenzdatentypen (Arrays, Klassen) 10 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Primitive Datentypen Numerische Datentypen Ganzzahl-Datentypen Heusch 6 Ratz 4.3 Für ganze, positive und negative Zahlen (ohne Nachkommastellen). Vier verschiedene Varianten: byte, short, int, long Gleitkommazahl-Datentypen Für gebrochene, positive und negative Zahlen. Es gibt zwei verschiedene Varianten: float und double Nicht jede gebrochene Zahl ist exakt darstellbar Rundungsfehler Zeichen-Datentyp Zur Darstellung alphanumerischer Zeichen wird der Datentyp char verwendet. Zulässige Zeichen: Unicode-Zeichensatz. Boolescher (logischer) Datentyp Zur Repräsentation von Wahrheitswerten wird der Datentyp boolean verwendet. Werte: true und false 11 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Datentyp char für Zeichen: Interne Darstellung (1) Es gibt zwei Gruppen von Zeichen: druckbare Zeichen (darstellbare Zeichen) und Steuerzeichen. In die erste Gruppe fallen Groß- und Kleinbuchstaben, Ziffern und Sonderzeichen (!, :, +, etc.). Zur zweiten Gruppe gehören z.B. der Zeilenvorschub und der horizontale Tabulator. Für die Speicherung und den Datenaustausch werden Zeichen als Bitkombinationen codiert. Java verwendet den Unicode, der den ASCII-Code als Teilmenge enthält. Die Bitkombination (der Code) eines Zeichen wird hier in zwei Bytes (16 Bit) gespeichert. Die Bitkombination eines Zeichens kann auch als Zahl aufgefasst werden. Z.B. entspricht die Bitkombination des Buchstabens A der Zahl 65, des Buchstabens a die Zahl 97, und des Zeichens 1 der Zahl 49. 12 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Datentyp char für Zeichen: Interne Darstellung (2) Erste Zeichen des Unicode-Zeichensatzes (entspr. ASCII-Code) 13 Dez. Hex. Zeichen Dez. Hex. Zeichen Dez. Hex. Zeichen Dez. Hex. Zeichen 0 1 2 3 4 5 6 7 ... 10 ... 12 13 ... 30 31 0000 0001 0002 0003 0004 0005 0006 0007 NUL SOH STX ETX EOT ENQ ACK BEL 000A LF 000C 000D FF CR 001E 001F RS US 32 33 34 35 ... 45 46 47 48 49 50 ... 57 58 ... 63 64 65 66 67 68 69 ... 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 ... 119 120 121 122 123 124 125 126 127 0020 0021 0022 0023 ! " # 002D 002E 002F 0030 0031 0032 . / 0 1 2 0039 003A 9 : 003F ? W. Geiger, W. Süß, T. Schlachter, C. Schmitt 0040 0041 0042 0043 0044 0045 @ A B C D E 0057 0058 0059 005A 005B 005C 005D 005E 005F W X Y Z [ \ ] ^ _ 0060 0061 0062 0063 0064 0065 ` a b c d e 0077 0078 0079 007A 007B 007C 007D 007E 007F w x y z { | } ~ DEL Institut für Angewandte Informatik Literale für primitive Datentypen (1) Im Quelltext verwendete konkrete Werte (z.B. Zahlen) werden als Literale (Literalkonstanten) bezeichnet Numerische Datentypen Für ganzzahlige Werte können die Vorzeichen + bzw. – und die Ziffern 0..9 verwendet werden. Das Vorzeichen + kann auch entfallen. Bei Gleitkommazahlen wird als Dezimaltrennzeichen der Punkt . verwendet. Die Exponentialschreibweise für Gleitkommazahlen sieht z.B. folgendermaßen aus: 4.56e3 4.56E3 -5.677e90 +6.777e-8 Standarddatentypen: int (falls in int darstellbar) und double Für den Datentyp long wird das Suffix L verwendet, z.B. 126L Für den Datentyp float wird das Suffix F (f) verwendet, z.B. 100.0F Für den Datentyp double kann D (d) verwendet werden. Boolescher Datentyp Boolesche Literale sind true und false 14 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Literale für primitive Datentypen (2) Zeichen-Datentyp (alphanumerische Werte) Literale für (einzelne) Zeichen sind in Apostrophe ' eingeschlossen. EscapeSequenz Bedeutung \uhhhh Bsp: \u0045 Ein bestimmtes Zeichen (im Beispiel das Zeichen E mit dem hexadezimalen Unicode 0045) \r carriage return \n line feed \t Tabulator \f form feed \b backspace \" Anführungszeichen \' Hochkomma \\ Backslash char letter = 'X'; Zeichen können direkt oder auch als Escape-Sequenzen angegeben werden. Die Escape-Sequenz ist ebenfalls in Apostrophe ' zu setzen. Mit einer Escape-Sequenz '\uhhhh' kann der Unicode für das gewünschte Zeichen angegeben werden (h: Hexadezimalziffer). 15 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Tabelle der primitiven Datentypen in Java Typ Größe Minimum Maximum Beispiel Defaultwert boolean 1 bit - - true false char 16 bit Unicode 0 Unicode 216-1 'a' '\u0000' (null) byte 8 bit -128 +127 (byte) 34 (byte) 0 short 16 bit -215 +215-1 (short) 21345 (short) 0 int 32 bit -231 +231-1 42322554 0 long 64 bit -263 +263-1 134567L 0L float 32 bit 2-149 (+) (2-2-32)*2127 3.1415f 0.0f double 64 bit 2-1074 (+) (2-2-52)*21023 325.3245d 0.0d void - - - (+) kleinster Wert größer 0 16 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Variablen (1) Was sind Variablen? Die Anweisungen eines Programms arbeiten mit Größen, die unterschiedliche Werte (variable Werte) annehmen können, z.B. Zwischenergebnisse einer Berechnung. Hierzu werden sogenannte Variablen verwendet. Für diese wird entsprechender Speicherplatz im Arbeitsspeicher des Computers reserviert. Der Zugriff auf den Speicherplatz erfolgt über den Variablennamen (Bezeichner). 17 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Variablen (2) Voraussetzung für die Nutzung von Variablen Eine Variable muss deklariert werden, bevor sie Daten aufnehmen kann. Zur Deklaration einer Variablen muss ihr Name und ihr Datentyp angegeben werden. Eine Variable muss erst einen Wert enthalten, bevor der Variablenwert verwendet werden kann. int a; // Variable mit Namen "a" wird deklariert a = 12; // Variable "a" bekommt einen Wert zugewiesen 18 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Lokale Variablen und deren Gültigkeitsbereich Java kennt unterschiedliche Arten von Variablen. Variablen, die innerhalb eines Anweisungsblocks (z.B. einer Methode) deklariert werden, heißen lokale Variablen. Lokale Variablen sind nur innerhalb des deklarierenden Blocks gültig (verwendbar) lokaler Gültigkeitsbereich. Eine lokale Variable verliert mit der schließenden Klammer } des Blocks ihre Gültigkeit. Ein Bezeichner in Java muss innerhalb seines Gültigkeitsbereichs eindeutig sein. Innerhalb des Blocks (auch in inneren Blöcken) darf keine weitere Variable mit dem gleichem Namen deklariert werden. Lokale Variablen primitiver Datentypen erhalten keinen Default-Wert! Hier meckert der Compiler. 19 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Heusch 5.2 Ratz 4.4 Institut für Angewandte Informatik Beispiel für den Gültigkeitsbereich von Variablen Zulässig { Unzulässig { int number; int number; } // Die Variable number // ist hier nicht mehr // gültig { int number; // unzulässig } { } int number; /* hier existiert * wieder eine lokale * Variable mit dem * Namen number */ } 20 W. Geiger, W. Süß, T. Schlachter, C. Schmitt /* * * * * Diese Variablendeklaration ist nicht zulässig, da die Variable number aus dem übergeordneten Block noch gültig ist. */ Institut für Angewandte Informatik Syntax der Variablendeklaration Syntax in der Erweiterten Backus-Naur-Form (EBNF) type identifier [= init_value] {, identifier [= init_value] }; Syntax: siehe Anhang Die Variablendeklaration besteht aus einem Datentyp (type) und dem Namen (Identifizierer, Bezeichner) der Variablen (identifier). Der Name der Variablen muss sich an die Vorgaben für Bezeichner halten. Der Namen der Variablen wird direkt nach dem Datentyp - getrennt durch ein oder mehrere Leerzeichen - angegeben. Mehrere Variablen desselben Typs können in einer Anweisung deklariert werden. Die Variablennamen werden dabei durch Kommata getrennt. Nach einem Zuweisungsoperator = kann der Variablen ein Anfangswert (init_value) zugewiesen werden (optionale Initialisierung). Eine Variablendeklaration ist eine Anweisung und wird mit einem Semikolon abgeschlossen. 21 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Namenskonventionen für Variablen und Beispiele Variablennamen beginnen üblicherweise mit einem Kleinbuchstaben (Konvention, keine zwingende Vorgabe), z.B. time Setzt sich ein Name aus mehreren Wörtern zusammen, werden die einzelnen Wörter direkt hintereinander geschrieben (ohne Trennzeichen). Zur Abgrenzung werden die (folgenden) Wörter mit Großbuchstaben begonnen, z.B. maxTextLength, timeToEnd Gültige Beispiele für Variablendeklarationen: float price; double extent, radius; int minCount = 2; char a = 'c'; Ungültige Beispiele: double &count; // Bezeichner von Variablen dürfen kein & // enthalten float a b c; // mehrere Variablennamen durch Kommata trennen 22 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Initialisierung und Wertzuweisung von Variablen Initialisierung von lokalen Variablen In der Deklaration einer lokalen Variablen ist die Zuweisung eines Anfangswerts (explizite Initialisierung ) möglich. Bei Deklaration einer lokalen Variablen ohne Initialisierung ist aber noch kein (Anfangs-)Wert festgelegt. Der Wert ist noch unbestimmt. Mit einer Wertzuweisung kann einer Variablen ein Wert bzw. neuer Wert zugewiesen werden. Syntax der Wertzuweisungen an Variablen: identifier = expression ; Nach dem Namen der Variablen folgt der Zuweisungsoperator = und ein Ausdruck. Der Ausdruck kann ein Literal oder ein komplexer Ausdruck sein. Die Wertzuweisung wird mit einem Semikolon abgeschlossen. 23 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiele // Deklarationen ohne und mit Initialisierung int i; int k; char c; double d = 1.7; // zusätzlich zur Deklaration Initialisierung // korrekte Wertzuweisungen i = 20; // Leerzeichen vor und nach = sind erlaubt k=i; // ohne Leerzeichen geht es auch c ='a'; // auch gemischt mit/ohne Leerzeichen ist möglich // fehlerhafte Wertzuweisungen i = 0.15; // 0.15 ist kein gültiger int-Wert v = 7; // keine Variable mit Namen v deklariert c="Test"; // "Test" ist kein char-Wert c='Test'; // 'Test' ist kein gültiges Zeichen-Literal 24 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Typkompatibilität und Typkonvertierung Typkompatibilität Einer Variablen kann nur ein Wert des gleichen Datentyps zugewiesen werden wie der, den sie selbst besitzt, oder ein Wert eines Datentyps, den ihr Datentyp hinsichtlich Wertebereich umfasst. Beispiel: Der Datentyp int ist kompatibel zum Datentyp double, aber double ist nicht kompatibel zu int. Implizite und expliziteTypkonvertierung Bei unterschiedlichen, aber kompatiblen Typen führt Java automatisch eine implizite Typkonvertierung durch. Sind die Typen nicht kompatibel, so kann eine explizite Typkonvertierung (typecast) durchgeführt werden. Logische Werte (boolean) können nicht umgewandelt werden. Syntax der expliziten Typkonvertierung (type) expression; 25 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiele: int position = 100; double size = 1.45; double weight = 80; // korrekt // korrekt // korrekt int number1 = 1.23; // falsch, Fehlermeldung int number2 = (int)1.23; // korrekt durch erzwungene // Typenumwandlung // number2 erhält den Wert 1 26 float length1 = 1.45; // falsch(!), Literal ist vom Typ double. // Compiler meldet: // "possible loss of precision" float length2 = 1.45F; float length3 = 1.45f; // korrekt // korrekt W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Symbol. Konstanten – unveränderliche Variablen In Java werden symbolische Konstanten durch unveränderliche Variablen dargestellt (Deklaration mit Modifizierer final). Sobald einer symbol. Konstanten während der Programmausführung ein Wert zugewiesen wurde (durch Initialisierung oder Wertzuweisung), ist dieser endgültig. Es kann keine weitere Wertzuweisung erfolgen. Syntax der Deklaration und Initialisierung symbolischer Konstanten final type identifier [= init_value] {, identifier [= init_value] }; identifier = expression; Beispiele: final double MWST = 0.19; final double PI; PI = 3.141592; Konvention: Üblicherweise werden symbolische Konstanten mit Großbuchstaben geschrieben. 27 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Zeichenketten Für Zeichenketten (Strings) gibt es keinen primitiven Datentyp. Für Zeichenketten gibt es in Java die Klasse String. Diese Klasse wird später ausführlich behandelt. Da in den folgenden Beispielen zuweilen aber Strings verwendet werden, vorab schon ein paar Informationen: String-Literale (Zeichenketten im Quellprogramm) werden in doppelte Anführungszeichen " gesetzt, z.B. "Test". Eine Zeichenkette kann mit + an eine andere Zeichenkette angehängt werden (Stringverkettung, -konkatenation). Beispiel: "Hal" + "lo" Zeichenketten besteht aus Unicode-Zeichen. 28 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Anhang: Beschreibung der Syntax von JAVA Bei Sprachen unterscheidet man Syntax und Semantik: Syntax: Legt fest, welche Ausdrücke erlaubt sind (sprachliche Form). Beispiel aus der deutschen Sprache: „Der Baum blüht.“ und „Der Baum spaziert.“ sind syntaktisch korrekte Sätze. Beispiel aus Java: Nach dem Bezeichner (Wort) class folgt ein weiterer Bezeichner und anschließend eine in geschweifte Klammern eingeschlossene Zeichenfolge. Semantik: Legt die Bedeutung der Ausdrücke der Sprache fest. Beispiel Deutsch: Die beiden Sätze oben haben unterschiedliche (mehr oder weniger sinnvolle) Bedeutungen. Beispiel Java: Das Schlüsselwort class leitet eine Klassendeklaration ein. Der Bezeichner direkt nach class ist der Name der Klasse. 29 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Formale Sprachen Programmiersprachen sind formale Sprachen. Für formale Sprachen ist die Syntax exakt definiert. Es ist festgelegt: Zulässige Zeichen der Sprache Zulässige Ausdrücke (Wörter, Zeichenketten aus den Zeichen der Sprache) Beispiel: Gegeben sei das Alphabet (die Menge von Zeichen) A = {a, b, c}. Die Sprache L1 sei die Menge aller Wörter über A, die mit a beginnen und mit a enden. Dann sind folgende Zeichenketten Wörter von L1: a, aa, aaa, aba, aca, aaaa, aaba, aaca, ... Keine Wörter von L1 sind dagegen: leere Zeichenkette, b, c, ab, ca, bcc, ... 30 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Grammatik (1) Die meisten Sprachen haben unendlich viele Wörter (potentielle Zeichenketten), so dass man durch Aufzählung der Wörter die Sprache nicht definieren kann. Eine Grammatik im Sinne der Informatik ist eine allgemeine, eindeutige Beschreibung einer formalen Sprache mit Hilfe von Regeln. Sinn und Zweck einer Grammatik: sie soll eine endliche Beschreibung einer Sprache ermöglichen (vgl. Vorlesung „Theoretische Informatik“). 31 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Grammatik (2) Eine Grammatik G = (T,N,P,S) besteht aus 4 Teilen: T Die Menge der Terminalsymbole. Aus diesen werden die Wörter der Sprache gebildet. Terminalsymbole sind Zeichen des zugrunde liegenden Alphabets. N Die Menge der Nichtterminalsymbole (Hilfssymbole/Variablen für syntaktische Einheiten). Sie treten in der Sprache nicht selbst auf, sondern müssen durch Terminalsymbole ersetzt werden. P Die Menge der Produktionen (auch Produktionsregeln oder Regeln genannt). Eine Regel X Y besagt, dass ein Teilwort X durch ein Teilwort Y ersetzt werden kann, wobei X und Y aus Terminal- und Nichtterminalsymbolen bestehen. S Das Startsymbol (ein spezielles Element aus N), von dem ausgehend die Produktionen angewandt werden. 32 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Kontextfreie Grammatiken Im Allgemeinen können linke und rechte Seite von Produktionen aus beliebigen Kombinationen von Terminalund Nichtterminalsymbolen bestehen. Die für die Informatik wichtigste Kategorie von Grammatiken sind diejenigen, deren Produktionen auf der linken Seite aus genau einem Nichtterminalsymbol bestehen. Diese Grammatiken heißen kontextfrei. 33 W. Geiger, W. Süß, T. Schlachter Institut für Angewandte Informatik Backus-Naur-Form (BNF) Eine häufig verwendete Beschreibungsform für kontextfreie Grammatiken ist die Backus-Naur-Form (BNF). Die BNF wird insbesondere zur Beschreibung der Syntax von Programmiersprachen verwendet. Die linke Seite jeder Regel besteht aus einem Nichtterminalsymbol. Die rechte Seite einer Regel besteht aus einer beliebig langen Kette, die Terminal- und Nichtterminalsymbole enthalten kann. Die „leere“ rechte Seite () ist erlaubt. Linke und rechte Seite einer Regel werden durch das Zeichen „::=“ voneinander getrennt. Schreibweise in dieser Vorlesung: Terminalsymbole sind fett gedruckt. Nichtterminalsymbole sind kursiv gedruckt. Symbole der Metasprache BNF sind in Standard-Schrift gedruckt. 34 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel – Grammatik für L1 in BNF T= N= P= S= 35 { a, b, c } { Wort, Buchstabe, Teilwort } { Wort a Teilwort a Wort a Teilwort Buchstabe Teilwort Teilwort Buchstabe a Buchstabe b Buchstabe c } Wort W. Geiger, W. Süß, T. Schlachter, C. Schmitt (1) (2) (3) (4) (5) (6) (7) Institut für Angewandte Informatik Erweiterte Backus-Naur-Form (EBNF) Weil BNF-Grammatiken unübersichtlich werden können, wurde die BNF um einige Abkürzungsmöglichkeiten erweitert. Dies führt zur Erweiterten Backus-Naur-Form (EBNF). Es gibt verschiedene Varianten der EBNF. Eine gebräuchliche sieht folgende Abkürzungsmöglichkeiten vor: | der senkrechte Strich trennt Alternativen [ ] eckige Klammern enthalten optionale Bestandteile { } geschweifte Klammern enthalten Bestandteile, die null, ein oder mehrfach wiederholt werden dürfen { }+ geschweifte Klammern mit + enthalten Elemente, die ein oder mehrfach wiederholt werden können ( ) runde Klammern gruppieren mehrere Bestandteile, z.B. mehrere Alternativen 36 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel: Grammatik für L1 in EBNF T= N= P= S= 37 { a, b, c } { Wort, Buchstabe, Teilwort } { Wort a Teilwort a | a Teilwort Buchstabe Teilwort | Buchstabe a | b | c } Wort W. Geiger, W. Süß, T. Schlachter, C. Schmitt (1+2) (3+4) (5-7) Institut für Angewandte Informatik Formale Sprachen – ein zweites Beispiel (1) Gegeben sei das Alphabet A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -, *, /, (, )} Die Menge LA der einfachen arithmetischen Ausdrücke ist eine Sprache über A. Z.B. gehören folgenden Wörter zu LA: 122+4 8*(4+177/3-(11*(18+7))) 13 Die folgenden Wörter gehören nicht zu LA: 28(18 ++/-5 38 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Formale Sprachen – ein zweites Beispiel (2) EBNF-Grammatik für die Sprache LA (einfache arithmetische Ausdrücke): T = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -, *, /, (, ) } N = { Ausdruck, Term, Faktor, Zahl, Ziffer } P = { Ausdruck ::= Term { ( + | – ) Term } Term ::= Faktor { ( * | / ) Faktor } Faktor ::= Zahl | ( Ausdruck ) Zahl ::= {Ziffer}+ Ziffer ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 } (1) (2) (3) (4) (5) S = Ausdruck 39 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Übungsaufgabe zur EBNF Beschreiben Sie in der erweiterten Backus-Naur-Form (EBNF) die Syntax von reellen Zahlen mit folgendem Aufbau: Die Zahlen haben - kein Vorzeichen oder das Vorzeichen + oder , - mindestens eine Vorpunktstelle (Vorkommastelle), - einen Punkt, - null, eine oder mehrere Nachpunktstellen, - optional einen Exponentialteil (beginnt mit "e" oder "E", danach vorzeichenlose oder vorzeichenbehaftete ganze Zahl). Beispiele: 1.234, -17.3, +7., 3.4E-10 40 W. Geiger, W. Süß, T. Schlachter Institut für Angewandte Informatik