2.2 Syntax, Semantik und Simulation

Werbung
2.2 Syntax, Semantik und Simulation
• Ein Java Programm ist eine Folge von Buchstaben.
• Nicht jede Folge von Buchstaben ist ein korrektes Java Programm!
Wie kann man alle korrekten Java Programme beschreiben ?
Problem: Es gibt unendlich viele korrekte Java Programme, daher können wir nicht alle Programme einfach auflisten.
Also:
²
¯
Wir beschreiben die Regeln, nach denen ein korrektes Java Programm erstellt sein muss.
±
°
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
35
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Rainer Feldmann
Universität Paderborn
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
Ableitung für “19”:
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<pZahl>
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
<pZahl>
Rainer Feldmann
Universität Paderborn
7→
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<Ziffer außer Null> <Ziffernliste>
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
<pZahl>
Rainer Feldmann
Universität Paderborn
7→
7→
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<Ziffer außer Null> <Ziffernliste>
<Ziffer außer Null> <Ziffer>
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
<pZahl>
Rainer Feldmann
Universität Paderborn
7→
7→
7→
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<Ziffer außer Null> <Ziffernliste>
<Ziffer außer Null> <Ziffer>
1 <Ziffer>
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
<pZahl>
Rainer Feldmann
Universität Paderborn
7→
7→
7→
7→
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<Ziffer außer Null> <Ziffernliste>
<Ziffer außer Null> <Ziffer>
1 <Ziffer>
1 <Ziffer außer Null>
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
<pZahl>
Rainer Feldmann
Universität Paderborn
7→
7→
7→
7→
7→
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<Ziffer außer Null> <Ziffernliste>
<Ziffer außer Null> <Ziffer>
1 <Ziffer>
1 <Ziffer außer Null>
19
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Syntaxgrammatiken in Backus-Naur-Form (BNF) (John Backus, 1959)
• Die Backus-Naur-Form (BNF) ist eine kompakte formale Metasprache zur Darstellung der
Syntax höherer Programmiersprachen (und anderer Sprachen“).
”
• BNF verwendet Ableitungsregeln (Produktionen), in denen Nichtterminalsymbole definiert
werden.
• Die Produktionen erlauben, Nichtterminalsymbole letzendlich zu Terminalsymbolen abzuleiten.
• Nichtterminalsymbole werden mit spitzen Klammern <...> umschlossen.
Beispiel: “::=” wird zur Definition verwendet, “|” trennt Alternativen
<Ziffer außer Null>
<Ziffer>
<pZahl>
<Ziffernliste>
Ableitung für “19”:
<pZahl>
Rainer Feldmann
Universität Paderborn
7→
7→
7→
7→
7→
::=
::=
::=
::=
1|2|3|4|5|6|7|8|9
0| <Ziffer außer Null>
<Ziffer> | <Ziffer außer Null> <Ziffernliste>
<Ziffer> | <Ziffer> <Ziffernliste>
<Ziffer außer Null> <Ziffernliste>
<Ziffer außer Null> <Ziffer>
1 <Ziffer>
1 <Ziffer außer Null>
19
Technische Informatik für Ingenieure (TIFI)
WS 09/10
36
Beispiel: {} bezeichnet beliebig viele (auch gar keine) Wiederholungen
<Buchstabe>
<Variable>
::=
::=
A | ...| Z | a | ...| z |
<Buchstabe> { <Buchstabe> | <Ziffer> }
Bemerkung: “. . .” gibt es in BNF nicht. Hier müssen alle Buchstaben ausgeschrieben und mit |
getrennt werden.
¾
»
Ein Variablenname besteht aus einer Folge von Buchstaben oder Ziffern,
die mit einem Buchstaben beginnt, und mindestens ein Zeichen enthält.
½
Ableitung für a 0 :
Rainer Feldmann
Universität Paderborn
¼
<Variable>
7→
7
→
7
→
7
→
<Buchstabe> <Buchstabe> <Ziffer>
a <Buchstabe> <Ziffer>
a <Ziffer>
a 0
Technische Informatik für Ingenieure (TIFI)
WS 09/10
37
Beispiel: [ ] bezeichnet optionale Strukturen
<Zahl>
Ableitung für -9:
<Zahl>
7
→
7→
7
→
7
→
::=
[+ | -] <pZahl>
- <pZahl>
- <Ziffer>
- <Ziffer außer Null>
-9
¾
»
Eine Zahl ist eine positive Zahl, die entweder das Vorzeichen +, oder das
Vorzeichen −, oder gar kein Vorzeichen enthält.
½
Rainer Feldmann
Universität Paderborn
¼
Technische Informatik für Ingenieure (TIFI)
WS 09/10
38
Beispiel: Arithmetische Ausdrücke über den ganzen Zahlen mit Operationen +,−,∗,/
<Ausdruck>
::=
<unärOp>
<binärOp>
::=
::=
<Variable> | <Zahl> |
<unärOp> <Ausdruck> | <Ausdruck> <binärOp> <Ausdruck> |
( <Ausdruck> )
+|+|-|*|/
'
$
Ein arithmetischer Ausdruck ist entweder eine Variable, oder eine Zahlenkonstante, oder
ein mit Vorzeichen + bzw. − versehener Ausdruck, oder ein durch + bzw. − bzw. ∗ bzw.
/ verknüpftes Paar von Ausdrücken, oder ein durch ( und ) geklammerter Ausdruck.
&
%
¾
»
Die Syntaxgrammatik einer Programmiersprache enthält die Menge aller Ableitungsregeln,
die die Syntax einer Programmiersprache beschreiben.
½
Rainer Feldmann
Universität Paderborn
¼
Technische Informatik für Ingenieure (TIFI)
WS 09/10
39
Ein Ableitungsbaum für den Ausdruck - a 0 * ( 4 + b )
<Ausdruck>
<Ausdruck>
<binärOp>
*
<unärOp> <Ausdruck>
−
_
(
<Ausdruck>
<Ausdruck> <binärOp>
<Variable>
<Buchstabe> <Buchstabe> <Ziffer>
a
<Ausdruck>
0
<Zahl>
+
)
<Ausdruck>
<Variable>
<pZahl>
<Buchstabe>
<Ziffer>
b
4
Nichterminalsymbole sind grau, Terminalsymbole rot dargestellt.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
40
Ein Ableitungsbaum für den Ausdruck - a 0 * ( 4 + b )
<Ausdruck>
<Ausdruck>
<binärOp>
<unärOp> <Ausdruck>
-
*
<Variable>
_
(
<Ausdruck>
<Ausdruck> <binärOp>
<Buchstabe> <Buchstabe> <Ziffer>
a
<Ausdruck>
0
<Zahl>
+
)
<Ausdruck>
<Variable>
<pZahl>
<Buchstabe>
<Ziffer>
b
4
Struktur des Ausdrucks: blau: Konstanten und Variablen, orange: Operatoren, gelb: Vorrang.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
41
Ableitungsbaum und Syntaxbaum - a 0 * ( 4 + b )
*
<Ausdruck>
<Ausdruck>
<binärOp>
<unärOp> <Ausdruck>
-
*
<Variable>
_
(
<Ausdruck>
<Ausdruck> <binärOp>
<Buchstabe> <Buchstabe> <Ziffer>
a
<Ausdruck>
0
<Zahl>
+
+
−
)
<Ausdruck>
<Variable>
<pZahl>
<Buchstabe>
<Ziffer>
b
a_0
4
b
4
Der Ableitungsbaum erzeugt auch die Klammern, die
zur korrekten Interpretation von - a 0 * ( 4 + b )
notwendig sind.
Rainer Feldmann
Universität Paderborn
Der Syntaxbaum gibt die Auswertungsreihenfolge (tiefer im Baum
vor höher im Baum) auch ohne
Klammerung vor.
Technische Informatik für Ingenieure (TIFI)
WS 09/10
42
Ableitungsbäume
• Ein Ableitungsbaum entsteht aus einem Nichtterminalsymbol (der Wurzel) durch schrittweises
Ableiten, bis nur noch terminale Symbole übrig sind. Die Kinder eines Nichtterminals bilden
die rechte Seite der angewandten Ableitung.
• Sind alle Nichtterminalsymbole zu Terminalsymbolen abgeleitet worden, so können wir den
Baum von links nach rechts lesen und erhalten eine syntaktisch korrekte Zeichenreihe für die
Wurzel.
• Alle Worte, die auf diese Weise erzeugt werden können sind syntaktisch korrekt.
• Ein Ableitungsbaum definiert nicht nur die korrekte Syntax, sondern auch eine Struktur. Diese
ist erstmal nicht immer eindeutig, wird aber durch Zusatzregeln eindeutig gemacht:
Z1 Punkt- vor Strichrechnung
Z2 Unäre Operatoren vor binären Operatoren
Z3 Von links nach rechts
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
43
Syntaxbäume: Punkt- vor Strichrechnung
/
+
*
n
2
n
+
n
*
/
n
4
2
4
n * n + 4 / 2
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
44
Syntaxbäume: Punkt- vor Strichrechnung
/
+
*
n
2
n
+
n
*
/
n
4
2
4
n * n + 4 / 2
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
44
Syntaxbäume: Unär vor Binär
+
−
−
b
a
+
a
b
-a + b
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
45
Syntaxbäume: Unär vor Binär
+
−
−
b
a
+
a
b
-a + b
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
45
Syntaxbäume: Operatoren von links nach rechts
−
+
+
a
b
−
1
a
1
b
a - b + 1
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
46
Syntaxbäume: Von links nach rechts
−
+
+
a
b
−
1
a
1
b
a - b + 1
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
46
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
?
−2
+
a
∗
(b
+
c)
|
{z
}
Ausdruck
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
?
?
−2 + a
∗
(b
+
c)
|{z}
| {z }
links
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
rechts
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
?
?
−2+ a
∗
(b
+
c)
| {z }
später
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
?
Rainer Feldmann
Universität Paderborn
?
− |{z}
2 +a
∗
(b
+
c)
| {z }
rechts
Technische Informatik für Ingenieure (TIFI)
später
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
?
Rainer Feldmann
Universität Paderborn
?
− |{z}
2 +a
∗
(b
+
c)
| {z }
rechts
Technische Informatik für Ingenieure (TIFI)
später
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
Rainer Feldmann
Universität Paderborn
?
−2+ a
∗
(b
+
c)
| {z }
später
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
Rainer Feldmann
Universität Paderborn
?
−2+
| {z } a ∗ (b + c)
fertig
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
Rainer Feldmann
Universität Paderborn
*
?
?
−2+
a ∗ (b
+
c)
| {z } |{z}
| {z }
links
fertig
Technische Informatik für Ingenieure (TIFI)
rechts
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
Rainer Feldmann
Universität Paderborn
*
?
?
−2+
a ∗ (b
+
c)
| {z } |{z}
| {z }
links
fertig
Technische Informatik für Ingenieure (TIFI)
später
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
Rainer Feldmann
Universität Paderborn
*
a
?
−2+
+
c)
| {z } a∗ (b
| {z }
fertig
Technische Informatik für Ingenieure (TIFI)
rechts
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
Rainer Feldmann
Universität Paderborn
*
a
?
−2
+ a∗} (b
+
c)
| {z
| {z }
fertig
Technische Informatik für Ingenieure (TIFI)
rechts
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
*
+
a
?
Rainer Feldmann
Universität Paderborn
−2
+ a∗} |{z}
(b + |{z}
c)
| {z
fertig
links
rechts
?
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig,
Beispiel:
+
−
2
*
+
a
?
Rainer Feldmann
Universität Paderborn
−2
+ a∗} |{z}
(b + |{z}
c)
| {z
fertig
links
später
?
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
*
+
a
b
Rainer Feldmann
Universität Paderborn
−2
+ a∗} |{z}
(b + |{z}
c)
| {z
fertig
links
später
?
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
*
+
a
b
Rainer Feldmann
Universität Paderborn
−2
+
a
∗
(b+
c)
|
{z
} |{z}
fertig
rechts
?
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Syntaxbäume
• Ein Syntaxbaum entsteht aus einem Ausdruck, indem die zuletzt durchgeführte Operation zur
Wurzel gemacht wird und dann der rechte Restausdruck zum rechten Teilbaum und der linke
Restausdruck (falls vorhanden) zum linken Teilbaum gemacht wird.
• Ein Syntaxbaum definiert die Struktur eines Ausdrucks. Diese ist eindeutig, Klammern sind
nicht notwendig.
Beispiel:
+
−
2
*
+
a
b
Rainer Feldmann
Universität Paderborn
−2
+
a
∗
(b
+
c)
|
{z
}
fertig
c
Technische Informatik für Ingenieure (TIFI)
WS 09/10
47
Semantik
Frage: Was bewirkt eine Zuweisung der Form <Variable> “=” <Ausdruck> ?
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
48
Semantik
Frage: Was bewirkt eine Zuweisung der Form <Variable> “=” <Ausdruck> ?
x = 1; a = 1;
x = x * (a + 1) * (a + 2) * x;
Was ist der Wert von x nach den beiden
Zuweisungen ?
»
¾
Die Semantik einer Programmiersprache legt die Bedeutung der einzelnen Programmkonstrukte fest. Wir geben die Semantik eines Programmkonstruktes immer informal an.
½
¼
Die Semantik einer Zuweisung ist die folgende: Werte den Ausdruck mit den aktuellen Werten der
vorkommenden Variablen aus und weise ihn dann der Variablen auf der linken Seite zu.
Im obigen Beispiel erhält x also den Wert 6.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
48
Seiteneffekte
Anweisungen wie n = n+1; i = i-1; können abgekürzt geschrieben werden als
¶
³
n++; i--; (bzw. ++n; --i;)
µ
´
• ++ erhöht den Wert der Variablen um 1, -- erniedrigt ihn um 1.
• <Variable>++, <Variable>-- verändern den Variablenwert nach Auswertung der Variablen, ++<Variable>, --<Variable> vor Auswertung der Variablen.
• Achtung Seiteneffekte: Auswertung von Ausdrücken kann jetzt Variablenwerte ändern:
if (n-- >= 0) { ... }
• Unschön: Mehr als eine Anweisung ++ oder -- in einem Ausdruck: erg = n++ * n-- / 2;
Beispiel (vgl. Programm Fakultaet):
while (n > 0) {
erg = erg * n;
n = n - 1;
}
Rainer Feldmann
Universität Paderborn
ist
äquivalent
zu
Technische Informatik für Ingenieure (TIFI)
while (n > 0)
erg = erg * n--;
WS 09/10
49
Anweisungsblöcke
• Nacheinander aufgeführte Anweisungen werden auch nacheinander ausgeführt.
• Anweisungen können mit { ... } zu einem Anweisungsblock zusammengefasst werden.
Beispiele:
while (n > 0) {
erg = erg * n;
n = n - 1;
}
/* Blockstart */
/* Blockende */
if (n % 2 == 0) {
erg = erg + n; n = n / 2;
} else {
erg = erg - n; n = n / 2;
}
#
i = 10; n = 0;
while (i > n) {} /* ACHTUNG! Endlosschleife! */
Out.println("Der Wert von i ist "+ i-- +".");
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
Anweisungsblöcke
Ã
können
auch leer sein. Hier führt das
zu einer Endlosschleife!
"
WS 09/10
!
50
Anweisungsblöcke
• Nacheinander aufgeführte Anweisungen werden auch nacheinander ausgeführt.
• Anweisungen können mit { ... } zu einem Anweisungsblock zusammengefasst werden.
Beispiele:
while (n > 0) {
erg = erg * n;
n = n - 1;
}
/* Blockstart */
/* Blockende */
if (n % 2 == 0) {
erg = erg + n; n = n / 2;
} else {
erg = erg - n; n = n / 2;
}
#
i = 10; n = 0;
while (i > n); /* ACHTUNG! Endlosschleife! */
Out.println("Der Wert von i ist "+ i-- +".");
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
Anweisungsblöcke
Ã
können
auch leer sein. Hier führt das
zu einer Endlosschleife!
"
WS 09/10
!
50
Anweisungsblöcke
• Anweisungsblöcke können auch Variablendeklarationen enthalten.
• Die in einem Block definierten Variablen sind auch nur in diesem Block und seinen Unterblöcken
gültig.
• Mehrfache Deklarationen einer Variablen in einem Block oder einem seiner Unterblöcke sind
verboten.
• Variablen sollten so lokal wie möglich definiert werden.
Beispiele:
if (n >= 0) {
int betrag = n;
...
} else { /* n < 0 */
int betrag = -n;
...
}
Rainer Feldmann
Universität Paderborn
{ int i;
...
}
{ int i;
...
}
Technische Informatik für Ingenieure (TIFI)
{ int i;
{
int i; /* FEHLER! */
}
}
WS 09/10
51
Simulation eines Computerprogrammes per Hand“
”
Ziel:
• Bestimmung der durch einen Algorithmus berechneten Funktion
{Eingaben} → {Ausgaben} bzw. der Arbeitsweise des Algorithmus.
• Korrektheit des Algorithmus für einzelne Eingaben prüfen
Vorgehensweise:
• Schreibe für jede Variable ein leeres Feld ( den Behälter“) auf ein Blatt Papier.
”
• Simuliere das Programm Schritt für Schritt und trage dabei die Werte der Variablen in die
entsprechenden Felder ein.
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
52
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
x
y
z
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
Aufforderung zur Eingabe
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
x
28
y
z
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
x
28
y
20
z
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
x
28
y
20
z
8
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
x
28
y
20
z
8
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
y
20
z
8
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
y
20
8
z
8
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
y
20
8
z
8
4
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
y
20
8
z
8
4
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
8
y
20
8
z
8
4
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
8
y
20
8
4
z
8
4
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
8
y
20
8
4
z
8
4
0
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
x
28
20
8
y
20
8
4
z
8
4
0
while (z != 0) {
x = y; y = z;
z = x % y;
}
Out.println("Das Ergebnis ist "+ y +".");
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Simulation eines Computerprogrammes per Hand“
”
public class Mystery {
public static void main (String[] args) {
Out.print("Geben Sie 2 nat. Zahlen ein: ");
int x = In.readInt(); int y = In.readInt();
int z = x % y; /* z = Rest von x/y */
while (z != 0) {
x = y; y = z;
z = x % y;
}
x
28
20
8
y
20
8
4
z
8
4
0
Ausgabe: Das Ergebnis ist 4.
Out.println("Das Ergebnis ist "+ y +".");
Was berechnet das
Programm Mystery ?
}
}
Rainer Feldmann
Universität Paderborn
Technische Informatik für Ingenieure (TIFI)
WS 09/10
53
Herunterladen