Conception du langage de script SWX sur Node.js : Architecture et implémentation
SWX est un langage de script construit sur Node.js qui gère l'ensemble du pipeline de traitement du code : de l'analyse lexicale à l'exécution. Le processus implique un analyseur lexical, un analyseur syntaxique et un interpréteur.
Code source → [Lexer] → Jetons → [Parser] → AST → [Interpréteur] → Résultat
L'analyseur lexical décompose le code en jetons, en supportant des opérateurs personnalisés comme >~ pour la comparaison et =? pour l'égalité. L'analyseur syntaxique construit l'AST, et l'interpréteur parcourt l'arbre pour exécuter les nœuds.
Analyseur lexical : Tokenisation du code
L'analyseur lexical (lexer.js) convertit les chaînes en une séquence de jetons. Exemple :
swx x = 42
Devient : KEYWORD(swx) IDENT(x) ASSIGN(=) NUMBER(42).
La gestion des opérateurs multi-caractères nécessite une priorité : >= est reconnu comme un tout. Les modes contextuels résolvent les conflits avec les identifiants dans le générateur HTML.
Analyseur syntaxique et AST
L'analyseur syntaxique (parser.js) utilise la descente récursive pour construire l'AST, en respectant la priorité des opérateurs. Exemple de condition :
swx x = 10
sw x >~ 5 {
wx "plus grand que cinq"
}
AST :
{
"type": "IfStatement",
"condition": {
"type": "BinaryExpression",
"operator": ">=",
"left": { "type": "Identifier", "name": "x" },
"right": { "type": "NumberLiteral", "value": 5 }
},
"body": [
{
"type": "PrintStatement",
"value": { "type": "StringLiteral", "value": "plus grand que cinq" }
}
]
}
La priorité garantit la correction : 2 + 3 4 s'évalue comme 2 + (3 4).
Interpréteur : Exécution de l'AST
L'interpréteur par parcours d'arbre (interpreter.js) implémente des gestionnaires pour les nœuds :
IfStatement: Évaluer la condition et sélectionner la branche.ForLoop: Itérer par compteur.FunctionDeclaration: Stocker dans la table des symboles.BinaryExpression: Gérer l'arithmétique et la logique.
Syntaxe et constructions
SWX propose une syntaxe unique :
Variables et sortie
swx nom = "SlywerX"
swx age = 20
wx "Salut, {nom} ! Tu as {age} ans."
Conditions et boucles
swpour if, avecdrcomme else-if/else.xs 5 { ... }— boucle N fois.xw item in arr { ... }— foreach.xl condition { ... }— while avec limite de 1 million d'itérations.
Fonctions et appariement de motifs
sx add(a, b = 0) => {
ws a + b
}
match status {
case 200 => { wx "OK" }
case 404 => { wx "Not Found" }
default => { wx "Inconnu" }
}
L'opérateur pipe |> chaîne les fonctions : "hello" |> upper.
Cryptographie
Le module #x intègre le crypto de Node.js :
swx hash = #x.sha256("hello")
wx hash // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
swx encrypted = #x.aes_enc("secret data", "mykey")
swx decrypted = #x.aes_dec(encrypted, "mykey")
swx keys = #x.rsa_keys(2048)
swx signature = #x.rsa_sign("data", keys.private)
wx #x.rsa_verify("data", signature, keys.public) // true
Génération HTML
Le DSL sx> génère du HTML avec 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 >> "Bonjour depuis SWX"
button.btn >> (onclick: "alert('works!')") { "Cliquez-moi" }
}
}
}
Supporte l'imbrication et les attributs.
Défis d'implémentation
- Priorité de l'analyseur : Descente récursive avec parsing Pratt.
- Conflits du lexer : Contexte pour
*~et CSS. - Boucles while : Limite d'itérations pour éviter les blocages.
- Bibliothèque standard : Tests sur interpréteur instable.
Points clés
- Pile complète : lexer, parser, interpréteur sur Node.js.
- Syntaxe personnalisée avec pipes, appariement de motifs et module crypto.
- DSL HTML pour la génération de balisage.
- Protections contre les boucles infinies et conflits du lexer.
- Version 7.0.0 avec RSA et AES.
— Editorial Team
Aucun commentaire pour le moment.