Syntax
AbgelaufenDie Syntax von Mastersign.Expressions erlaubt die folgenden Elemente: Literale, Symbole (Variablen, Konstanten, Parameter), Operatoren, Gruppen und Funktionsaufrufe.
Literale
Es werden logische, numerische und Zeichenfolgenliterale unterstützt. Zusätzlich gibt es das Nullliteral für leere CLR-Referenzen.
Logische Literale
Als logische Literale existieren 'true' und 'false'. Sie müssen klein geschrieben werden. Diese beiden Literale sind Werte des primitiven CLR-Datentyps System.Boolean.
Numerische Literale
Es werden ganzzahlige, Fließkomma- und Dezimalwerte unterstützt. Alle numerischen Literale sind vorzeichenbehaftet. Ganzzahlige werte werden durch die primitiven CLR-Datentypen System.Int32 oder System.Int64 repräsentiert. Fließkommawerte werden durch die primitiven CLR-Datentypen System.Single oder System.Double repräsentiert. Dezimalwerte werden durch den primitiven CLR-Datentyp System.Decimal repräsentiert. Die Literale werden nur in internationaler Schreibweise erkannt, d.h. das Dezimaltrennzeichen ist ein Punkt. Es werden keine Tausendertrennzeichen unterstützt und auch keine wissenschaftliche Exponentialschreibweise für Fließkommawerte.
Typ | Beispiele | Erklärung |
Automatische Ganzzahl | 1, 98765443, -400, +200, 0020 |
Der Wert entscheidet, ob 32Bit oder 64Bit benötigt werden. |
32Bit Ganzzahl | 24i, 42I, -300i, +400i | Das Postfix 'i' kann klein oder groß geschrieben werden. Der Wert wird durch System.Int32 mit 32Bit repräsentiert. |
64Bit Ganzzahl | 6000L, -1234L, +2l | Das Postfix 'l' kann klein oder groß geschrieben werden. Der Wert wird durch System.Int64 mit 64Bit repräsentiert. |
Automatische Fließkommazahl | 0.0, 123.567, -1.0, +0.02, 001.001 | Der Wert entscheidet, ob 32Bit oder 64Bit benötigt werden. |
32Bit Fließkommazahl | 0.0f, 42F, -30.0f, +002.1F | Das Postfix 'f' kann klein oder groß geschrieben werden. Der Wert wird durch System.Single mit 32Bit repräsentiert. |
64Bit Fließkommazahl | 0.0d, 42D, -30.0D, +002.1D | Das Postfix 'd' kann klein oder groß geschrieben werden. Der Wert wird durch System.Double mit 64Bit repräsentiert. |
Dezimalzahl | 24.99m, -90.95M, +00.001m | Das Postfix 'm' kann klein oder groß geschrieben werden. Der Wert wird durch System.Decimal mit 128Bit repräsentiert. |
Zeichenfolgenliterale
Zeichenfolgen werden durch doppelte Anführungszeichen eingeschlossen und können Escapezeichen, maskiert durch den Backslash '\', enthalten. Zeichenfolgen werden durch den CLR-Datentyp System.String repräsentiert.
Beispiele: "abc", "Hallo Welt!", "Anton sagte \"Was für ein Wetter!\"", "C:\\User\\"
Die folgenden Escapezeichen werden unterstützt:
Escapezeichen | Bedeutung |
\\ | Der einfache Backslash '\'. |
\" | Das doppelte Anführungszeichen '"'. |
\a | Klingelzeichen oder Warnsignal (Unicode 0x0007). |
\b | Backspace - ein Schritt zurück (Unicode 0x0008). |
\f | Seitenvorschub (Unicode 0x000C). |
\n | Newline - neue Zeile (Unicode 0x000A). |
\r | Return - Wagenrücklauf (Unicode 0x000D). |
\t | Tabstoppzeichen (Unicode 0x0009). |
\v | Vertikales Tabstoppzeichen (Unicode 0x000B). |
Nullliteral
Das Nullliteral ist 'null'. Es muss klein geschrieben werden und repräsentiert die leere Referenz. Null ist mit jedem Referenztyp kompatibel.
Operatoren
Operatoren dienen zum Verknüpfen von zwei Werten. Wie z.B. '1 + 2'. Es gibt numerische, logische, Zeichenfolgen- und Vergleichsoperatoren.
Numerische Operatoren
Die folgenden Operatoren verknüpfen numerische Werte. Werden ganzzahlige Werte mit weniger als 32Bit Genauigkeit verknüpft, z.B. System.Byte oder System.UInt16, werden sie vor der Operation nach System.Int32 konvertiert. Werden zwei numerische Werte mit unterschiedlicher Genauigkeit verknüpft, wird der ungenauere Wert zunächst in den genaueren konvertiert.
Operator | Beispiele | Erläuterung |
+ | 1+2, -4 + -9.99m, 3F+4F | Die Addition bildet die Summe zweier Werte. |
- | 3-4, 18 - -2.0, 4L-30m | Die Subtraktion bildet die Differenz zweier Werte. |
* | 10 * 2, 42*-100.001 | Die Multiplikation bildet das Produkt zweier Werte. |
/ | 1/3, 2/3.0, -8.0m/2 | Die Division bildet den Quotient zweier Werte. |
^ | 2^10, 10^3.151492D | Die Hochrechnung bildet die Potenz eines Wertes zu einer Basis. |
Logische Operatoren
Die logischen Operatoren verknüpfen ausschließlich Wahrheitswerte (System.Boolean).
Operator | Beispiele | Erläuterung |
and | true and false | Das logische Und ergibt nur dann true, wenn beide Operanden true sind. |
or | true or false | Das logische Oder ergibt immer dann true, wenn mindestens ein Operand true ist. |
xor | true xor false | Das logische Exklusiv-Oder ergbit nur dann true, wenn genau ein Operand true ist. |
Zeichenkettenoperatoren
Es gibt nur einen Zeichenkettenoperator und das ist die Verkettung oder Konkatenation. Ist ein Operand keine Zeichenkette (System.String) wird versucht den Wert in eine Zeichenkette umzuwandeln. Dafür wird System.Objekt.ToString() verwendet. Ist ein Operand eine Null-Referenz, wird sie in die leere Zeichenfolge umgewandelt.
Operator | Beispiele | Erläuterung |
& | "Hallo " & "Welt!", 1&"x", true & false | Die Konkatenation verbindet zwei Zeichenfolgen durch Aneinanderreihen. Operanden die keine Zeichenfolgen sind, werden in Zeichenfolgen umgewandelt. |
Vergleichsoperatoren
Vergleichsoperatoren dienen dazu das Verhältnis zwischen zwei Werten zu ermitteln. In der Regel können nur Werte gleichen Typs verglichen werden. Bei numerischen Werten wird ein ungenauerer Operand vor dem Vergleich in den Typ des genaueren Operands konvertiert. Logische Werte und Refenzen können nur auf Gleichheit oder Ungleichheit überprüft werden.
Operator | Beispiel | Erläuterung |
< | 1 < 2, "a" < "b" | Der Kleiner-Operator ergibt nur dann true, wenn der linke Operand kleiner als der rechte ist. |
<= | 3 <= 1.0, "Abc" <= "abc" | Der Kleinergleich-Operator ergibt dann true, wenn der linke Operand kleiner oder gleich dem rechten ist. |
= | 4.0 = 4, "b" = "c", true = false | Der Gleich-Operator ergibt nur dann true, wenn beide Operanden gleich sind. |
<> | 4.0 <> 4, "a" <> null, true <> false | Der Ungleich-Operator ergibt nur dann true, wenn sich die beiden Operanden unterscheiden. |
>= | 8.0 >= 8F, "400" >= "200" | Der Größergleich-Operator ergibt nur dann true, wenn der linke Operand größer oder gleich dem rechten ist. |
> | 100 > 0, "B" > "b" | Der Größer-Operator ergibt nur dann true, wenn der linke Operand größer als der rechte ist. |
Prioritäten und Bindung
Werden mehrere Operatoren ohne Gruppierung durch Klammern in einem Ausdruck verwendet, entscheidet die Priorität eines Operators über die Bindung. Besitzen zwei Operatoren die gleiche Priorität, wird zunächst der linke Operator ausgewertet und anschließend der rechts folgende.
Beispiel: Hätten die Operatoren * und + die gleiche Bindungsstärke, würde der Ausdruck '1 + 2 * 3' interpretiert wie '(1 + 2) * 3' und den Wert 9 ergeben. Da * aber eine stärkere Bindung als + besitzt, wird der Ausdruck wie '1 + (2 * 3)' ausgewertet, und ergibt den Wert 7.
Je niedriger die Prioritätsebene, so stärker die Bindung.
Prioritätsebene | Operatoren |
0 | ^ |
1 | *, / |
2 | +, - |
3 | & |
4 | <, <=, =, <>, >=, > |
5 | and |
6 |
or, xor |
Gruppierung
Um die Bindung zwischen verschiedenen Operatoren zu beeinflussen, können Operationen mit der Hilfe von Klammern gruppiert werden.
Beispiel: '1 + 2 * 3' ergibt durch die stärkere Bindung des Multiplikationsoperators den Wert 7, mit der Hilfe von Klammern kann dem Additionsoperator eine stärkere Bindung eingeräumt werden '(1 + 2) * 3' und das Ergbnis ist 9.
Variablen, Konstanten, Parameter
Unterstützt seit Version: 0.2
Variablen sind Werte, die im Auswertungskontext hinterlegt sind und auf die mit einem Namen verwiesen werden kann. Ist z.B. für den Namen 'x' der Wert 100 im Auswertungskontext festgelegt, ergibt der Ausdruck '2 * x' den Wert 200. In Variablen können Werte beliebigen Typs, auch z.B. Zeichenketten oder logische Werte, festgelegt werden. Variablen repräsentieren auch nach dem Kompilieren des Lambda-Delegaten immer den aktuellen Wert im Auswertungskontext. Variablen können auch als Konstanten markiert sein. Der Wert einer Konstante wird beim Kompilieren des Delegaten direkt verwendet wird, Aktualisierungen des Wertes im Auswertungskontext wirken sich nicht mehr auf den Delegat aus. Ob eine Variable als konstant markiert wird, bestimmt der Entwickler beim Setzen der Variable im Auswertungskontext.
Parameter sind syntaktisch nicht von Variablen zu unterscheiden. Ihr Wert wird jedoch nicht im Auswertungskontext hinterlegt, sondern beim Aufruf des Delegaten als echter Parameter übergeben. Existiert ein Parameter mit dem gleichen Namen wie eine Variable, wird dem Parameter der Vorzug gegeben. Parameter können demzufolge Variablen verdecken.
Funktionen
Funktionen werden im Anwendungskontext festgelegt und können mit Hilfe ihres Namens und einer Parameterliste aufgerufen werden. Die Parameterliste folgt auf den Funktionsnamen, ist von runden Klammern umgeben und verwendet das Komma als Trennung zwischen den Parametern. Der Aufruf einer Funktion mit dem Namen 'f' und ohne Parameterliste sieht so aus: 'f()'.
Wird im Auswertungskontext eine Funktion mit dem Namen 'sin' und einem Parameter vom Typ System.Double festgelegt, welche den Sinus der übergebenen Zahl berechnet, ergibt der Ausdruck 'sin(3.1514926535)' annähernd den Wert 0.0. Der Aufruf einer Funktion zur mehrfachen Wiederholung einer Zeichenkette könnte so aussehen: 'repeat("abc", 3)' und würde "abcabcabc" zurück geben.
Unter einem Funktionsnamen können mehrere Varianten einer Funktion mit sich unterschiedender Parameterliste festgelegt werden. Eine solche Funktion nennt man 'überladen'. Bei einem Aufruf einer überladenen Funktion wird die am besten passende Variante verwendet.
Member Lesen
Optionale Spracheigenschaft
Unterstützt seit Version: 0.4.0
Für den lesenden Zugriff auf öffentliche Objekteigenschaften oder -felder wird die Punktnotation verwendet. Um das Feld 'b' von dem Wert 'a' zu lesen, sieht die Syntax wie folgt aus: 'a.b'. Der Ausdruck 'a' kann alles sein, was einen Wert oder ein Objekt liefert, das ein öffentliches Feld oder eine öffentliche Eigenschaft 'b' besitzt. Der Ausdruck '"abc" & "def").Length' ergibt zum Beispiel das Ergebnis '6'.