ToDo: Kontrolle

Hamsterskript: Ausdrücke und Operatoren

Ausdrücke

Der Interpreter des Hamsters erlaubt die Berechnung arithmetischer sowie Boolescher Ausdrücke. Ein Ausdruck liefert nach seiner Berechnung einen Wert, der sich zuweisen, beim Aufruf einer Prozedur oder Funktion als Argument übergeben oder in anderen Ausdrücken weiterverwenden lässt. Ausdrücke bestehen aus Operatoren und Operanden, deren Werte durch die Operatoren zu einem Gesamtergebnis verknüpft werden. Als Operand kann jeder Wert, also auch jeder Ausdruck eingesetzt werden.

Operatoren

Binäre Operatoren sind Operatoren mit zwei Operanden. Der Interpreter implementiert die für arithmetische Ausdrücke übliche Syntax, bei der die beiden Operanden jeweils vor und nach dem Operator anzugeben sind (Infix-Notation). Die Anweisung

$Summe = $Operand1 + $Operand2

addiert die Werte der Variablen $Operand1 und $Operand2 und weist das Ergebnis der Variable $Summe zu. Sofern beide Summanden Strings sind oder sich wenigstens einer nicht in eine Zahl konvertieren lässt, besteht $Summe aus $Operand1, verlängert um den Inhalt von $Operand2 (Concatenation, „String-Addition“).

Unäre Operatoren gehen ihrem einzigen Operanden voran (Präfix-Notation). Die Anweisung

$Neg = - $Operand

weist beispielsweise der Variablen $Neg den negativen Wert der Variablen $Operand zu.

Die Operatoren „iif()“ und „icase()“, die wenigstens drei Operanden bei funktionaler Syntax verarbeiten, werden im Abschnitt über Verzweigungen behandelt. Folgende Operatoren kennt der Interpreter:
Operator Anz. Operanden Bedeutung
() 1 Klammerung
! 1 logische Verneinung
~ 1 binäre bitweise Verneinung (Zusatz)
+ 1 positives Vorzeichen
- 1 negatives Vorzeichen
* 2 Multiplikation
/ 2 Division
% 2 Modulo („Rest“ der Division)
+ 2 Addition, Zeichenverkettung
- 2 Subtraktion
<< 2 binäres bitweises Schieben nach links
>> 2 binäres bitweises Schieben nach rechts
< 2 kleiner als
> 2 größer als
<= 2 kleiner gleich
>= 2 größer gleich
== oder = 2 gleich
!= oder <> 2 ungleich
& 2 binäres Und
^ 2 binäres Xor
| 2 binäres Oder
&& 2 logisches Und
|| 2 logisches Oder

Operatorpriorität und -Assoziativität

Die Operatorattribute Priorität und Assoziativität bestimmen die Reihenfolge der Berechnung, wenn sie nicht durch Klammern vorgegeben wird. Im Ausdruck

$Summe = func1 + $Operand2 * func3

würde zuerst das Produkt aus dem Wert in $Operand2 und dem Resultat der Funktion func3 berechnet und dann das Resultat der Funktion func1 hinzuaddiert; func3 würde also vor func1 aufgerufen. Der Operator der Multiplikation hat eine größere Priorität (Rang) als derjenige der Addition, der Interpreter kann in arithmetischen Ausdrücken die Regel „Punktrechnung geht vor Strichrechnung“ berücksichtigen. Im Ausdruck

$Summe = func1 + $Operand2 + func3

würde zuerst die Summe aus dem Resultat der Funktion func1 und $Operand2 berechnet und erst dann das Resultat der Funktion func3 hinzuaddiert; func1 würde also vor func3 aufgerufen. Der zwischen den zwei Additionsoperatoren stehende $Operand2 wandert sozusagen zuerst nach links, der Additionsoperator ist linkssassoziativ. Bei einem rechtsassoziativen Operator würde $Operand2 demgegenüber in die Berechnung des rechten Operators einbezogen.

Der Interpreter des Hamsters berücksichtigt ohne Klammerung folgende Prioritäten und Assoziativitäten, gleichrangige Operatoren stehen in einer Zeile:
Operator Priorität Assoziativität zulässige Datentypen der Operanden
() (höchste) ← links Zahl oder String
! ~ + - (unär) . → rechts (präfix) Zahl
* / % . ← links Zahl
+ - (binär) . ← links Zahl (oder String bei +)
<< >> . ← links Zahl
<> >= <= . ← links Zahl oder String
== = != <> . ← links Zahl oder String
& . ← links Zahl
^ . ← links Zahl
| . ← links Zahl
&& . ← links Zahl
|| (niedrigste) ← links Zahl

Durch Klammerung mit runden Klammern „()“ lässt sich die Reihenfolge der Berechnung vorgeben. Im Verlaufe der Berechnung von

$Summe = func1 * ( $Operand2 + func3 )

würde die Funktion func3 vor der Funktion func1 aufgerufen.