Sprachbeschreibung von JoJoScript
JoJoScript-Module
Modul Funktionen
Funktionen Funktionen Funktion
Funktion Function Funktionsname ( Funktionsparameter ) { Funktionskörper }
Funktionsname Bezeichner
Funktionsparameter Variablenliste
Funktionskörper  Global-Anweisung Anweisungsfolge
Variablenliste
Variable
Variablenliste , Variable
Global-Anweisung GLOBAL Variablenliste ;
Kommentar //beliebige-Zeichen-bis-Zeilenende
 
Beispiel:
function f1 (p1, p2)
{
  y = p1 + p2;
}
function stamp ()
{
  global stamp_text;

  // Brennweite in Bild einfügen
  stamp_text = exifnice ("focallength");
}

JoJoScript-Anweisungen
Anweisungsfolge ;
Codeblock
IF-Block
SWITCH-Block
WHILE-Block
FOR-Block
RETURN-Anweisung
Anweisung ;
Codeblock { Anweisungsfolge }
IF-Block IF ( Anweisung ) Anweisungsfolge Elsecodeblock
Beispiel:
if (x == 3)
{
  y1 = 2;
  y2 = 3;
}
else
{
  y1 = 0;
  y2 = 0;
}
Elsecodeblock
ELSE
Anweisungsfolge
SWITCH-Block SWITCH ( Anweisung ) { CASE-Block }
Beispiel:
switch (x)
{
  case 1:  y = sin(a);
  case 2:  y = cos(a);
  case 3:  y = tan(a);
  default: y = 0;
}
CASE-Block
CASE Konstante : C-Anweisung
DEFAULT : C-Anweisung
C-Anweisung Anweisungsfolge
BREAK-Anweisung
WHILE-Block WHILE ( Anweisung ) S-Codeblock
Eine WHILE-Schleife wird solange wiederholt, wie das Ergebnis der Vergleichsanweisung wahr ist. Diese Auswertung wird vor der ersten Anweisung des Codeblocks durchgeführt.
Beispiel:
i=1;
while (i<=10)
{
  i; i=i+1;
}
FOR-Block FOR ( S-Anweisung ; A-Anweisung ; N-Anweisung ) S-Codeblock

Eine FOR-Schleife wird solange wiederholt, wie das Ergebnis der Vergleichsanweisung (A-Anweisung) wahr ist.
Vor dem ersten Vergleich wird die S-Anweisung ausgeführt (Initialisierung). Diese Anweisung ist aber von der Vergleichsanweisung völlig unabhängig zu sehen.
Nach der letzten Anweisung des Codeblocks wird die N-Anweisung (Reinitialisierung) ausgeführt. Auch sie ist von der Vergleichsanweisung unabhängig zu sehen.


Beispiel:
for (i=1; i<=90; i=i+10)
{
  "Sinus von "; i; "="; sin(i*6.283185/360);
}
S-Codeblock Anweisungsfolge
CONTINUE-Anweisung
BREAK-Anweisung
S-Anweisung Anweisung
A-Anweisung Anweisung
N-Anweisung Anweisung
RETURN-Anweisung RETURN Anweisung ;

über RETURN wird der aufrufenden Funktionen ein Funktionsergebnis zurückgegeben.
Fehlt bei RETURN eine Rückgabeangabe, wird 0 als Funktionsergebnis zurückgegeben.
Fehlt in einer Funktion RETURN als letzte Anweisung, wird 0 als Funktionsergebnis zurückgegeben.


Beispiele:
return;
return 2;
return "Länge="+len(x);
CONTINUE-Anweisung CONTINUE ;

CONTINUE ist nur in einer FOR-Schleife und einer WHILE-Schleife zulässig.
Es bewirkt einen direkten "Sprung" zum Schleifenende, was bei einer WHILE-Schleife zur erneuten Auswertung der Schleifenbedinung führt.
Bei einer FOR-Schleife wird dadurch die Reinitialisierung der Schleifenformulierung (N-Anweisung) und eine anschließende Auswertung der Schleifenbedingung (A-Anweisung) durchgeführt.
CONTINUE wirkt sich immer auf den innersten Schleifenkörper aus.

BREAK-Anweisung BREAK ;

BREAK ist nur in einer FOR-Schleife, einer WHILE-Schleife und im SWITCH-Block zulässig.
Es bewirkt ein direktes Verlassen der Schleife bei einer FOR-Schleife und einer WHILE-Schleife sowie das Verlassen des CASE-Blocks in einem SWITCH-Block.
BREAK wirkt sich immer auf den innersten Schleifenkörper sowie SWITCH-Block aus.

Anweisung
Zuweisung
Funktionsaufruf
Operation
Zuweisung Variable = Anweisung
Beispiele:
y=1;
y="Hallo";
y="Heute ist der " + date();
Funktionsaufruf Funktionsname ( Argumentliste )
Argumentliste Argument
Argumentliste , Argument
Argument  
Variable
Konstante
Operation Objekt Operator Objekt
Operator aufsteigend in der Priorität der Operatoren
? : Bedingungsoperator
|| logisches Oder
&& logisches Und
| binäres Oder
^ binäres exklusives Oder
& binäres Und
==   != Gleichheit, Ungleichheit
<  >   >=   <= kleiner, größer, größergleich, kleinergleich
+   - Addition, Subtraktion
*   /   % Multiplikation, Division, Modulus
~ binäres Komplement
! Negation
Objekt Variable
Konstante
Funktionsaufruf
( Anweisung )
Variable Bezeichner
Bezeichner [Key]
Bezeichner [Index]
Bezeichner [#Index]
Bezeichner []
Key String
Index Integer
Funktionsname Bezeichner
Konstante Integer
Double
String
Symbol
Symbol @Bezeichner
Ein Symbol wird intern als enumerativer Wert abgebildet
Integer [0-9]+
Hexadezimalinteger 0[Xx][0-9A-Fa-f]+
Double [0-9]+.[0-9]+
String "Any"
Any [beliebigesZeichen]*
Bezeichner [_A-Za-zÄäÖöÜüß][_A-Za-z0-9ÄäÖöÜüß]*
zwischen Groß/Kleinschreibung wird nicht unterschieden

Datentypen
Double Reelle Zahlen
-1.79769313486232E308 bis -4.94065645841247E-324 für negative Werte
4.94065645841247E-324 bis 1.79769313486232E308 für positive Werte
Integer Ganze Zahlen
-2147483648 bis 2147483647
String Zeichenketten
Date Datum/Zeit
Datum im Bereich vom 01. Januar 100 bis zum 31. Dezember 9999
Uhrzeit im Bereich von 0:00:00 bis 23:59:59
Array Arrayelemente werden über ihren Schlüssel (Key vom Typ String) oder ihren Index (vom Typ Integer) angesprochen. Der Inhalt eines Arrayelements kann einem beliebigen Datentyp entsprechen.
Beispiele:
abc ["e1"] = 100;
abc ["a1"] = 200;
xyz ["1"] = 300;

Neue Arrayelemente können nur über die Angabe eines Key erzeugt werden. Sie werden alphabetisch sortiert geführt. Dies hat zur Folge, dass sich während der Lebensdauer eines Arrayelements dessen Index ändern kann.

Wird einem Index ein # vorangestellt, bedeutet dies einen Zugriff auf den Key und nicht den Inhalt.
Beispiele:
abc [1] ergibt 200
abc [#1] ergibt "a1"

Über ein leeres Klammernpaar steht die Anzahl der Arrayelemente zur Verfügung.
Beispiel:
abc [] ergibt 2
Symbol Wird intern als enumerativer Datentyp gesehen.
Wird irgendwo ein Symbol angesprochen, so ist es Programmweit bekannt.
Vor den Bezeichner des Symbols ist ein @ zu setzen.
Vordefinierte Symbole sind:
@TRUE Ist auch das positive Ergebnis bei logischen Operationen
@FALSE Ist auch das negative Ergebnis bei logischen Operationen
@ERROR Fehlerindikator
@UNDEFINED Datentyp undefiniert
@INTEGER Datentyp Integer
@DOUBLE Datentyp Double
@STRING Datentyp String
@SYMBOL Datentyp Symbol
@DATE Datentyp Date
@ARRAY Datentyp Array
@UNKNOWN Unbekannt

Konvertierungsregeln:

Operand 1 Operand 2 Ergebnis
INTEGER INTEGER INTEGER
INTEGER DOUBLE DOUBLE
INTEGER STRING STRING
INTEGER SYMBOL SYMBOL
INTEGER DATE DATE
DOUBLE INTEGER DOUBLE
DOUBLE DOUBLE DOUBLE
DOUBLE STRING STRING
DOUBLE SYMBOL SYMBOL
DOUBLE DATE DATE
STRING INTEGER STRING
STRING DOUBLE STRING
STRING STRING STRING
STRING SYMBOL STRING
STRING DATE STRING
SYMBOL INTEGER SYMBOL
SYMBOL DOUBLE SYMBOL
SYMBOL STRING STRING
SYMBOL SYMBOL SYMBOL
SYMBOL DATE SYMBOL
DATE INTEGER DATE
DATE DOUBLE DATE
DATE STRING STRING
DATE SYMBOL SYMBOL
DATE DATE DATE