Herramientas de generación léxica
Moo.js
Section titled “Moo.js”Para la creación del analizador léxico de LibreScript, se ha utilizado la librería Moo.js. Moo es un lexer generador escrito en JavaScript, diseñado para ser rápido, ligero y fácil de usar, ideal para proyectos basados en Node.js y entornos de navegador.
- Naturaleza: Moo.js es una librería que permite definir un analizador léxico directamente en código, sin la necesidad de archivos de especificación externos complejos como los utilizados por herramientas más tradicionales.
- Características Principales:
- Definición de Reglas Clara: Las reglas léxicas se definen como un objeto simple, donde las claves son los nombres de los tokens y los valores son sus expresiones regulares correspondientes o configuraciones más avanzadas para el manejo de líneas y estados.
- Rendimiento: Está optimizado para la velocidad.
- Información de Posición: Los tokens generados incluyen automáticamente información detallada como el tipo, valor (lexema), línea, columna y desplazamiento (
offset
), lo que es crucial para el reporte de errores preciso. - Integración Sencilla: Dada su naturaleza, se integra sin problemas en proyectos Node.js, como es el caso del compilador de LibreScript.
Uso con Node.js
Section titled “Uso con Node.js”La integración de Moo.js en un proyecto Node.js es directa:
-
Instalación: Se instala vía npm:
npm install moo
-
Definición del Lexer: Se crea un archivo JavaScript (ej.,
lexer.js
) donde se importamoo
y se define el analizador léxico usandomoo.compile()
:lexer.js import moo from 'moo';const lexer = moo.compile({// Definición de todas las reglas de tokens aquí});export default lexer; // Para poder importarlo en otros módulos**Uso en el Compilador:** Otros módulos del compilador (ej., `parser.js` o `main.js`) importan este objeto `lexer` y lo utilizan para tokenizar el código fuente.```javascript// parser.js o main.jsimport lexer from './lexer.js';function analizarCodigo(codigoFuente) {lexer.reset(codigoFuente); // Carga el código fuente en el lexerconst tokens = [];let token;while ((token = lexer.next())) { // Itera sobre los tokenstokens.push(token);}return tokens;}