Primitive Datentypen - KIT

Werbung
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
Herunterladen