Volver al inicio

SWX: tu propio lenguaje en Node.js con AST y criptografía

SWX — lenguaje de script en Node.js con sintaxis personalizada, criptografía y generador HTML. Arquitectura descrita: lexer, parser con AST, intérprete de recorrido en árbol. Ejemplos de código, complejidades de implementación y planes futuros proporcionados.

SWX v7: intérprete de lenguaje con criptografía en Node.js
Advertisement 728x90

# Construyendo el lenguaje de guiones SWX en Node.js: Arquitectura e implementación

SWX es un lenguaje de guiones construido sobre Node.js que gestiona todo el flujo de procesamiento de código: desde el análisis léxico hasta la ejecución. El proceso involucra un analizador léxico, un analizador sintáctico e intérprete.

Código fuente → [Analizador léxico] → Tokens → [Analizador sintáctico] → AST → [Intérprete] → Resultado

El analizador léxico divide el código en tokens, soporta operadores personalizados como >~ para comparación y =? para igualdad. El analizador sintáctico construye el AST, y el intérprete recorre el árbol para ejecutar los nodos.

Analizador léxico: Tokenización del código

El analizador léxico (lexer.js) convierte cadenas en una secuencia de tokens. Ejemplo:

Google AdInline article slot
swx x = 42

Se convierte en: KEYWORD(swx) IDENT(x) ASSIGN(=) NUMBER(42).

Para manejar operadores de varios caracteres se requiere precedencia: >= se reconoce como un todo. Los modos contextuales resuelven conflictos con identificadores en el generador de HTML.

Analizador sintáctico y AST

El analizador sintáctico (parser.js) usa descenso recursivo para construir el AST, respetando la precedencia de operadores. Ejemplo de condición:

Google AdInline article slot
swx x = 10
sw x >~ 5 {
    wx "mayor que cinco"
}

AST:

{
  "type": "IfStatement",
  "condition": {
    "type": "BinaryExpression",
    "operator": ">=",
    "left": { "type": "Identifier", "name": "x" },
    "right": { "type": "NumberLiteral", "value": 5 }
  },
  "body": [
    {
      "type": "PrintStatement",
      "value": { "type": "StringLiteral", "value": "mayor que cinco" }
    }
  ]
}

La precedencia asegura la corrección: 2 + 3 4 se evalúa como 2 + (3 4).

Intérprete: Ejecución del AST

El intérprete de recorrido de árbol (interpreter.js) implementa manejadores para nodos:

Google AdInline article slot
  • IfStatement: Evalúa la condición y selecciona la rama.
  • ForLoop: Itera por contador.
  • FunctionDeclaration: Almacena en la tabla de símbolos.
  • BinaryExpression: Maneja aritmética y lógica.

Sintaxis y construcciones

SWX tiene una sintaxis única:

Variables y salida

swx nombre = "SlywerX"
swx edad = 20
wx "¡Hola, {nombre}! Tienes {edad} años."

Condiciones y bucles

  • sw para if, con dr como else-if/else.
  • xs 5 { ... } — bucle N veces.
  • xw item in arr { ... } — foreach.
  • xl condition { ... } — while con límite de 1 millón de iteraciones.

Funciones y coincidencia de patrones

sx add(a, b = 0) => {
    ws a + b
}

match status {
    case 200 => { wx "OK" }
    case 404 => { wx "No encontrado" }
    default  => { wx "Desconocido" }
}

El operador de tubería |> encadena funciones: "hello" |> upper.

Criptografía

El módulo #x integra el crypto de Node.js:

swx hash = #x.sha256("hello")
wx hash  // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

swx encrypted = #x.aes_enc("datos secretos", "miclave")
swx decrypted = #x.aes_dec(encrypted, "miclave")

swx keys = #x.rsa_keys(2048)
swx signature = #x.rsa_sign("datos", keys.private)
wx #x.rsa_verify("datos", signature, keys.public)  // true

Generación de HTML

El DSL sx> genera HTML con 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 >> "Hola desde SWX"
            button.btn >> (onclick: "alert('¡funciona!')") { "Haz clic" }
        }
    }
}

Soporta anidamiento y atributos.

Desafíos de implementación

  • Precedencia del analizador: Descenso recursivo con parsing Pratt.
  • Conflictos del analizador léxico: Contexto para *~ y CSS.
  • Bucles while: Límite de iteraciones para evitar bloqueos.
  • Biblioteca estándar: Pruebas en intérprete inestable.

Lecciones clave

  • Pila completa: analizador léxico, sintáctico e intérprete en Node.js.
  • Sintaxis personalizada con tuberías, coincidencia de patrones y módulo crypto.
  • DSL de HTML para generación de marcado.
  • Salvaguardas contra bucles infinitos y conflictos léxicos.
  • Versión 7.0.0 con RSA y AES.

— Editorial Team

Advertisement 728x90

Leer después