SynLang - Scriptsprache


Projektkategorie(n): ,

Beschreibung

SynLang war und ist das absolute Experiment: Eine Skriptsprache um Automatisierungen im grafischen Bereich zu vereinfachen.

Automatisierungen wie der PhotoshopActionManager für Photoshop ab CS4 nutzen oft mehrere Sprachen (JavaScript, Python und für einige Prozesse auf Windows VBScript). Um dies zu vereinheitlichen und das erstellen von Automatisierungen für Adobe Programme (oder andere Systeme) zu vereinfachen, kam der Gedanke dieses Experimentes auf. Eine Skriptsprache die das alles unter einen Hut packt. So entstand SynLang.

Im aktuellen Stadium erstellt SynLang einzig einen abstrakten Syntaxbaum. Dieser soll in Zukunft in verschiedene Sprachen übersetzt werden, je nach Zielsprache der automatisierbaren Platform. SynLang ist eine typisierte Sprache, dies vereinfacht den Prozess der Überführung in andere Sprachen (z.B.: JavaScript und gleichzeitig Python).

Hier ein Auszug des AST („abstract syntax tree“) für einen String-Typ:

Ansicht der Konsolenausgabe von SynLang

Beispiel

Hier eine kurze Übersicht über Datentypen, Rechnen mit SynLang, Kontrollkonstrukte und Funktionen der Sprache. Die C-Sharp Syntax wurde nur gewählt für eine bessere Darstellung.

Datentypen

// Nullwert
int variable = null; // Das selbe wie: int variable;

// Integer
int zahl1 = 42;
int zahl2 = -13;

// Boolean
bool status = true; // Oder "false"

// Char
char buchstabe1 = 'A'
char buchstabe2 = 'a' + 'b' // => Ã (195)

// Float
float zahl1 = 1.5;
float zahl2 = -47.998;
float zahl3 = .6; // 0.6

// Array
int[] hash1 = [1, 5, 7]; // All cool!
int[] hash2 = [1, 'a', true]; // Fehler: Implizite Typumwandlung zu [1, 97, 1]

// String
string hi = "Hello"; // Array vom Typ Char ['H', 'e', 'l', 'l', 'o']

// Map
int{string} myMap = {
    "key": 45676.456
};

Rechnen

// Initialer Typ ist Zieltyp bei Rechnungen

// Typsicher
int math1 = 1 + 4.3; // => 5
math1 += 1; // 6

// Falsch deklarierter Typ
int math2 = 1.5 + 4;

int math3 = (-7 * 7 + 64) / (5 % 3); // => 7.5, da Typ int => 7

Kontrollkonstrukte

int test = 1;

// Verzweigungen

if (test == 0) {
    // ...
} else {
    // ...
}

// Schleifen

for (int i = 0; i < 10; i += 1) {
    // ...
}

bool status = true;

do (status) {
    // ...
    status = false;
}

Funktionen

/**
 * Plus one function
 */
int myFunction (int value = 0) {
    return value + 1;
}

int test1 = myFunction(); // test => 1
int test3 = myFunction(3); // test => 4

Umsetzung

Da vorerst nur eine Umsetzung für JavaScript geplant ist, wurde PEG.js für das erstellen des Syntax Tree genutzt. Der generierte Parser wird mit Mocha und Chai getestet. Für Node.js steht außerdem ein Modul zur Verfügung um SynLang Dateien (.syn) und Code zu parsen, sowie eine direkte Eingabekonsole für die Sprache (siehe Bild weiter oben).

Zusammenfassung

Ein Projekt das wahrscheinlich eher ein dauerhaftes Experiment sein wird. Aber schön um über den Tellerrand zu schauen …

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.