Retour à l'accueil

SWX : votre propre langage sur Node.js avec AST et cryptographie

SWX — langage de script sur Node.js avec syntaxe personnalisée, cryptographie et générateur HTML. Architecture décrite : lexer, parser avec AST, interpréteur tree-walking. Exemples de code, complexités d'implémentation et plans futurs fournis.

SWX v7 : interpréteur de langage avec cryptographie sur Node.js
Advertisement 728x90

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 :

Google AdInline article slot
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 :

Google AdInline article slot
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 :

Google AdInline article slot
  • 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

  • sw pour if, avec dr comme 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

Advertisement 728x90

Lire ensuite