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