Diese Lektion enthält derzeit noch einige Beispiele, die nur für die Programmiersprache Java zutreffen; sie soll im Laufe der Zeit für andere Programmiersprachen angepaßt werden. (Stand 2019)
Syntaktische Rekursion in Java
- Bisherige Syntax (Syntaxdiagramm)
Vorzeichenausdruck
.----------.
--->.------------>| Literal |----.---->
| '----------' ^
| .-. .----------. |
'--->( - )--->| Literal |----'
| '-' '----------' |
| .-. .----------. |
'--->( + )--->| Literal |----'
'-' '----------'Ausdruck
.---------------------.
--->| Vorzeichenausdruck |--->
'---------------------'
Ein Operand eines Operators muß nicht unbedingt immer ein Literal sein, sondern kann auch seinerseits wiederum ein Operatorausdruck sein. Das folgende Syntaxdiagramm für einen Ausdruck bringt dies dadurch zum Ausdruck, daß es einen Verweis auf sich selbst enthält. Ein solcher Selbstbezug wird auch als Rekursion bezeichnet.
- Neue, erweiterte Syntax (Syntaxdiagramm)
Vorzeichenausdruck
.--------------------.
--->.------------>| Literal |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Ausdruck
.---------------------.
--->| Vorzeichenausdruck |--->
'---------------------'- Zum Vergleich: die Definitionen aus der JLS 13 (leicht gekürzt)
UnaryExpression:
UnaryExpressionNotPlusMinus
- UnaryExpression
+ UnaryExpression
Dies bedeutet, daß es erlaubt ist, ein Literal in einem Vorzeichenausdruck durch einen weiteren Vorzeichenausdruck zu ersetzen – dadurch entsteht dann im allgemeinen wieder ein erlaubter Ausdruck, der aber einen anderen Wert haben kann.
Das voranstehende Diagramm „Neue, erweiterte Syntax“ umfaßt das vorhergehende „Bisherige Syntax“, weil dort die speziellere syntaktische Kategorie ›Literal‹ durch die allgemeinere ›Vorzeichenausdruck‹ ersetzt wurde.
Die frühere Regel
Ein Vorzeichen akzeptiert ein Literal als Operanden, und bildet mit ihm zusammen einen neuen Vorzeichenausdruck.
lautet ab jetzt allgemeiner:
Ein Vorzeichen akzeptiert einen Vorzeichenausdruck als Operanden, und bildet mit ihm zusammen einen neuen Vorzeichenausdruck.
Herleitungen
»5«
»5« ist ein Vorzeichenausdruck, weil es ein Literal ist.
»-5«
»-5« ist ein Vorzeichenausdruck, weil es dem Aufbauschema „-Vorzeichenausdruck “ mit dem Vorzeichenausdruck »5« entspricht (wir hatten schon im vorigen Abschnitt begründet, warum »5« ein Vorzeichenausdruck ist).
»- -5«
»- -5« ist ein Vorzeichenausdruck, weil es dem Aufbauschema „-Vorzeichenausdruck “ mit dem Vorzeichenausdruck »-5« entspricht (wir hatten schon im vorigen Abschnitt begründet, warum »-5« ein Vorzeichenausdruck ist).
Im Falle von »- -5« muß ein Leerraum zwischen die beiden Vorzeichenoperatoren gesetzt werden, damit nicht der Doppelminusoperator »--« entsteht. – Diese Information kann nicht dem Syntaxdiagramm entnommen werden, sondern muß noch zusätzlich erlernt werden.
Nach diesem Herleitungsprinzip kann also man begründen, warum ein Folge von endlich vielen Vorzeichen, denen ein Literal folgt, ein Vorzeichenausdruck ist.
Programme müssen stets endlich lang sein. Stünden vor einer »5« unendlich viele negative Vorzeichen, wäre es nicht klar, welchen Wert dieser Ausdruck haben soll.
Zum Begriff „Vorzeichenausdruck“
Es ist merkwürdig, daß auch das Literal »4« als „Vorzeichenausdruck“ gilt, obwohl es gar kein Vorzeichen enthält.
Man kann sich dies nun auch so vorstellen: Ein Vorzeichenausdruck ist ein Ausdruck mit beliebig vielen Vorzeichen. Dazu zählen auch null Vorzeichen. Entsprechen sind »- - -4«, »- -4«, »-4« und »4« alles Vorzeichenausdrücke, da sie in diesem Sinne alle Vorzeichen enthalten (der letzte enthält „null Vorzeichen“ – was hier auch als eine Art des Enthaltens gilt!).
Die Einbeziehung der Null ist typisch für das Programmieren: So hatten wir schon bemerkt, daß auch eine Folge von null Zeichen als Zeichenfolge gilt (die leere Zeichenfolge »«, welche durch »""« ausgedrückt wird). Es ist ebenfalls gewöhnungsbedürftig, daß etwas als eine Folge von Zeichen gelten soll, das kein einziges Zeichen enthält !
Zur Unterscheidung von den Literalen nennen wir einen wirklich mit einem Vorzeichen beginnenden Ausdruck auch einen echten Vorzeichenausdruck.
Übungsfragen
? Übungsfrage
- Neue, erweiterte Syntax (Syntaxdiagramm)
Vorzeichenausdruck
.--------------------.
--->.------------>| Literal |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Ausdruck
.---------------------.
--->| Vorzeichenausdruck |--->
'---------------------'
Welcher der folgenden Texte ist ein Vorzeichenausdruck gemäß dem voranstehenden Syntaxdiagramm?
- »- 2« Anton
- »2-2« Berta
- »- - 2« Cäsar
- »-2« Dora
- »2« Emil
- »2 - 2« Friedrich
? Übungsfrage _
Eine lexikalische Einheit ist ein Literal oder ein Operator.
Wie viele lexikalische Einheiten hat der folgende Ausdruck?
- Ausdruck
- -2
? Übungsfrage _
Wie viele lexikalische Einheiten hat der folgende Ausdruck?
- Ausdruck
--2
Anwendungen ⃗
Wenn ein bestimmter Operator eines Ausdrucks nicht in einem Operanden steht, so nennen wir jenen Ausdruck auch eine Anwendung dieses Operators. Beispielsweise ist der Ausdruck »- -65« eine Anwendung des ersten Vorzeichenoperators (der zweite Vorzeichenoperator steht ja in einem Operanden des ersten). Betrachtet man den Operanden »-65« jedoch isoliert, so ist er eine Anwendung des in ihm ganz am Anfang vorkommenden Vorzeichenoperators »-«.
Äquivalenztransformationen ⃗
Die Bedeutung eines Operanden liegt nur in seinem Wert, nicht in seiner speziellen Schreibweise.
Daher bedeuten »- -2« und »2« als Operanden genau dasselbe, denn beide haben den gleichen Wert «2». Der Austausch von »- -2« durch »2« ist also eine Äquivalenztransformationen (eine Änderung an einem Programm, welche die Bedeutung des Programms nicht verändert).
Dies gilt allgemein immer, wenn Ausdrücke verwendet werden: Die Bedeutung eines Ausdrucks liegt in seinem Wert, so daß ein Austausch gegen einen anders geschriebenen aber wertgleichen Ausdruck die Bedeutung eines Programms nicht verändert.