# 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:
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:
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:
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
swpara if, condrcomo 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
Aún no hay comentarios.