SWX-Skriptsprache auf Node.js: Architektur und Umsetzung
SWX ist eine Skriptsprache auf Basis von Node.js, die den gesamten Codeverarbeitungsprozess abdeckt: von der lexikalischen Analyse bis zur Ausführung. Der Prozess umfasst einen Lexer, Parser und Interpreter.
Quellcode → [Lexer] → Tokens → [Parser] → AST → [Interpreter] → Ergebnis
Der Lexer zerlegt den Code in Tokens und unterstützt benutzerdefinierte Operatoren wie >~ für Vergleiche und =? für Gleichheit. Der Parser erstellt den AST, und der Interpreter durchläuft den Baum, um die Knoten auszuführen.
Lexer: Code in Tokens zerlegen
Der Lexer (lexer.js) wandelt Strings in eine Token-Sequenz um. Beispiel:
swx x = 42
Wird zu: KEYWORD(swx) IDENT(x) ASSIGN(=) NUMBER(42).
Beim Umgang mit mehrzeichenigen Operatoren ist Priorität entscheidend: >= wird als Ganzes erkannt. Kontextuelle Modi lösen Konflikte mit Identifikatoren im HTML-Generator.
Parser und AST
Der Parser (parser.js) verwendet rekursiven Abstieg, um den AST unter Berücksichtigung der Operatorpriorität zu erstellen. Beispielbedingung:
swx x = 10
sw x >~ 5 {
wx "größer als fünf"
}
AST:
{
"type": "IfStatement",
"condition": {
"type": "BinaryExpression",
"operator": ">=",
"left": { "type": "Identifier", "name": "x" },
"right": { "type": "NumberLiteral", "value": 5 }
},
"body": [
{
"type": "PrintStatement",
"value": { "type": "StringLiteral", "value": "größer als fünf" }
}
]
}
Die Priorität sorgt für Korrektheit: 2 + 3 4 wird als 2 + (3 4) ausgewertet.
Interpreter: AST ausführen
Der baumdurchlaufende Interpreter (interpreter.js) implementiert Handler für Knoten:
IfStatement: Bedingung auswerten und Zweig wählen.ForLoop: Über Zähler iterieren.FunctionDeclaration: In Symboltabelle speichern.BinaryExpression: Arithmetik und Logik handhaben.
Syntax und Konstrukte
SWX hat eine einzigartige Syntax:
Variablen und Ausgabe
swx name = "SlywerX"
swx age = 20
wx "Hallo, {name}! Du bist {age} Jahre alt."
Bedingungen und Schleifen
swfür if, mitdrals else-if/else.xs 5 { ... }— N-mal Schleife.xw item in arr { ... }— foreach.xl condition { ... }— while mit 1-Millionen-Iterationslimit.
Funktionen und Pattern Matching
sx add(a, b = 0) => {
ws a + b
}
match status {
case 200 => { wx "OK" }
case 404 => { wx "Not Found" }
default => { wx "Unbekannt" }
}
Pipe-Operator |> verkettet Funktionen: "hallo" |> upper.
Kryptografie
Das #x-Modul integriert Node.js crypto:
swx hash = #x.sha256("hallo")
wx hash // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
swx encrypted = #x.aes_enc("geheime Daten", "meinschlüssel")
swx decrypted = #x.aes_dec(encrypted, "meinschlüssel")
swx keys = #x.rsa_keys(2048)
swx signature = #x.rsa_sign("daten", keys.private)
wx #x.rsa_verify("daten", signature, keys.public) // true
HTML-Rendering
Die sx> DSL erzeugt HTML mit CSS:
sx> "output/index.html" {
@style {
body >> bg(#030810) color(#fff) font(Courier New, monospace)
h1 >> color(#00e5ff) size(24px) bold uppercase
.btn >> bg(#00e5ff) color(#000) pad(10px 20px) pointer
}
@body {
div.card >> {
h1 >> "Hallo von SWX"
button.btn >> (onclick: "alert('funktioniert!')") { "Klick mich" }
}
}
}
Unterstützt Verschachtelung und Attribute.
Umsetzungsherausforderungen
- Parserpriorität: Rekursiver Abstieg mit Pratt-Parsing.
- Lexer-Konflikte: Kontext für
*~und CSS. - While-Schleifen: Iterationslimit gegen Hänger.
- Standardbibliothek: Tests auf instabilem Interpreter.
Wichtige Erkenntnisse
- Vollständiger Stack: Lexer, Parser, Interpreter auf Node.js.
- Eigene Syntax mit Pipes, Pattern Matching und Crypto-Modul.
- HTML-DSL für Markup-Generierung.
- Schutz vor Endlosschleifen und Lexer-Konflikten.
- Version 7.0.0 mit RSA und AES.
— Editorial Team
Noch keine Kommentare.