cScript Grammatik
Im folgenden finden Sie eine EBFN-Beschreibung von cScript.
EBNF
Die Elemente einer EBFN (Extended Backus-Naur Form) werden wie folgt gelesen:
- Runde Rahmen sind Terminal-Symbole, also Textzeichen, die genau in dieser Schreibweise und ohne weitere Trennzeichen in der Eingabe erwartet werden.
- Rechteck-Rahmen sind Nicht-Terminale. Diese Symbole sind in weiteren Definitionen erklärt.
- Linien verbinden die Symbole und dürfen nur ein Pfeilrichtung durchlaufen werden.
- Die Definitionen werden von links nach rechts abgearbeitet.
- (...) : Sequenz
- ? : Option
- + : 1-n mal
- * : 0-n mal
- | : Alternative
- '...' : Terminal-Symbol
- [...] : Terminal-Symbol. Ein Zeichen des Bereiches. [a-c] heißt also vollständig ausgeschrieben ('a' | 'b' | 'c').
prog
Am Anfang eines cScript-Programmes stehen die (optionalen) Definitionen
von #pragma-Funktionsvariablen.
Danach dürfen beliebig viele Includes folgen.
Dann kommen die eigentlichen Definitionen des Programmes bestehend aus Deklarationen globaler Variablen und aus
Funktionen.
Einstiegspunkt für die Bearbeitung ist immer die Funktion int main (). Die Funktion main darf in keinem cScript fehlen..
Hier das kürzeste mögliche cScript-Programm:
int main () { return 0; }
pragma
Definition von Funktionsvariablen.
Funktionsvariablen werden ab v4.1 der priint:comet Plugíns unterstützt. In früheren Versionen der Plugins können sie zu Fehlern in der Skriptausführung führen.
functionVariable
possibleValue
include
Includes sind cScript-Textteile, die vor der Ausführung des cScript-Programmes in den Quelltext eingesetzt werden. Dabei werden der Reihe nach alle Includes durch den jeweils definierten Text ersetzt. Enthalten die Includes wieder Includes, werden auch die ersetzt. Mehrfachersetzungen werden dabei automatisch vermieden. Hier finden Sie weitere Informationen zu Includes.
pool_include
pool_type
path
dcl
Variablen-Deklarationen. Wenn Sie den Wert einer Zeiger-Variable (*) nicht als Ergebnis einer Funktion erhalten, müssen diese Variablen mit einer geeigneten Funktion allokiert werden, bevor auf deren Inhalt zugegriffen werden darf.
Obwohl allokierter Speicher bei Skriptende automatisch aufgeräumt wird, ist es gute Praxis, reservierten Speicher mit der passenden release-Funktion wieder freizugeben, sobald eine Variable nicht mehr benötigt wird. Denken Sie daran:

Array-Variablen ([]) sind zwar technisch gesehen ebenfalls Zeiger. Die Speicherverwaltung von Arrays wird aber von cScript selbst übernommen. Array-Variablen benötigen also kein alloc oder release!
Die Inhalte von Arrays werden nicht automatisch initialisiert!
Hier einige Deklarationen von Variablen.
float square (float f) { return f * f;} int i1 = 12, i2, nn [12]; // Die 12 Werte von nn sind nicht initialisiert! float p1 = mm2pt (1.0); // Berechneter Wert float p2 = square (4.0); // Mit eigener Funktion berechneter Wert char * s1 = "abc"; // Konstante! Darf nicht verändert werden! char s2[] = "def"; // Konstante! Darf nicht verändert werden! char s4 [4], *s5 = alloc (512); // s4 NICHT freigeben! s5 mit release (s5) wieder freigeben Table T = table::alloc (); // mit table::release (T) wieder freigeben
dtype
Die Datentypen float und int von cScript sind 64-Bit-Werte. Neben diesen Grundtypen gibt es eine Reihe weiterer Datentypen. Eine vollständige Liste der bekannten Datentypen finden Sie hier. Diese Datentypen dienen der besseren Lesbarkeit. Intern sind sie alle als int* definiert. Bei der Deklaration von Variablen mit diesen Datentypen werden die Variablen mit 0 initialisiert. Vor der Verwendung von Variablen mit Datentypen ungleich int oder float müssen diese Variablen allokiert worden sein!
var_decl
string_decl
func
func_def
params
param
stmt
Ausdrücke in Bedingungen (if, while, for) werden immer vollständig berechnet! Die
in C oder C++ gerne verwendeten Test für nicht-leere char*-Strings wie
if (str && *str)
führen in cScript zu Fehlern und müssen etwa durch
if (str)
{
if (*str)
{
}
}
ersetzt werden.
return
assg
expr
int_expr
float_expr
cScript führt keine automatischen Typumwandlungen durch! Achten Sie darauf, an Stellen, die ein float erwarten, auch tatsächlich ein float zu übergeben! Z.B. ist 1401 eine Ganzzahl, die entsprechende Kommazahl geben Sie mit 1401. oder 1401.0 an.
string_expr
binop
Ausdrücke werden von rechts nach links ausgewertet!
Weil sie von hinten nach vorne berechnet werden, ergeben die rot markierten Ausdrücke scheinbar falsche Resultate. Mit Klammerungen erhalten Sie die erwarteten Resultate.
x = 3 - 1 + 2; // ergibt 0 statt 4
= 3 - 1 + 2
= 3 - 3
= 0
x = (3 - 1) + 2; // ergibt 4
= 2 + 2
= 4
x = 20 / 10 * 2; // ergibt 1 statt 4
= 20 / 10 * 2
= 20 / 20
= 1
x = (20 / 10) * 2; // ergibt 4
= 2 * 2
= 4
relop
logical_op
Ident
UnsignedInt
Integer
Float
cScript führt keine automatischen Typumwandlungen durch! Achten Sie darauf, an Stellen, die ein float erwarten, auch tatsächlich ein float zu übergeben! Z.B. ist 1401 eine Ganzzahl, die entsprechende Kommazahl geben Sie mit 1401. oder 1401.0 an.