Slex (Simusol lex) es una biblioteca de análisis léxico escrita en C, reentrante y basada en PCRE2. Divide un texto en tokens —palabras, números, símbolos o instrucciones— mediante expresiones regulares. Cada contexto mantiene su propio estado; distintos contextos pueden ejecutarse concurrentemente, aunque un mismo contexto debe usarse desde un solo hilo a la vez. Se desarrolló para los lenguajes del proyecto Simusol, pero puede incorporarse a otros programas. Es software libre, con licencia GPL versión 3 o posterior.

Un lexer reconoce las piezas del texto; un parser interpreta cómo se combinan. Slex puede alimentar un parser de Bison o entregar directamente los tokens y sus capturas a un programa C. No es por sí solo un compilador, un resolvedor de ecuaciones ni un integrador.

Qué puede hacer

CaracterísticaUso
Expresiones regulares PCRE2Reglas con grupos de captura, macros y soporte UTF-8. Entre las reglas activas gana la coincidencia más larga; en caso de empate, la registrada primero.
Configuración sin recompilarLas reglas se cargan desde un archivo .slex o una cadena en memoria. Las acciones C se registran por nombre.
Capturas y accionesCada acción recibe el texto completo y las subcadenas capturadas. Puede asociar un valor al token, cambiar el estado o incluir otra fuente.
Estados léxicosActivar reglas diferentes según la sección o el contexto del lenguaje que se está leyendo.
Fuentes anidadasLeer cadenas, archivos y la salida tokenizada de otros flujos; apilar inclusiones y volver a la fuente anterior al terminarlas.
Lectura parcialUsar la coincidencia parcial de PCRE2 para decidir si hace falta leer más antes de cerrar un token. Admite fuentes de archivo que crecen; no debe confundirse con una API de entrada/salida asíncrona.
Contextos independientesCada slex_ctx contiene sus reglas, acciones, fuentes, tokens y errores. Permite intercalar varios analizadores o utilizar un contexto distinto por hilo del sistema.
Posición y diagnósticoEntrega fuente, línea, columna, código y texto del token. La API por contexto devuelve errores sin terminar el proceso.
BisonPuede conectarse con parsers puros y reentrantes, con parámetros de contexto y ubicaciones. El árbol incluye una prueba con dos gramáticas.

Descargas e instalación

Los paquetes están en las descargas de Simusol, dentro del directorio de Slex. Se ofrecen paquetes DEB, RPM y TGZ y, cuando esté publicado, el archivo de fuentes. Hay que elegir el formato, la distribución y la arquitectura que correspondan; un binario no es universal.

Con curl instalado, descargar y ejecutar el instalador de SummaPack:

curl -fsSLO https://www.simusol.org/downloads/installsumma.sh &&
sh installsumma.sh slex

El instalador permite elegir el formato disponible. Para pedir DEB explícitamente, por ejemplo en Debian o Ubuntu:

sh installsumma.sh --para deb slex

Esto instala SummaPack si hace falta y solicita los paquetes del proyecto Slex con sus dependencias. Puede requerir permisos de administrador. Revisar el script antes de ejecutarlo y usar únicamente fuentes de confianza: instalar paquetes ejecuta código.

Si SummaPack ya está instalado:

bajar-paquetes --para deb --instalar slex
PaquetePara qué sirveDependencias principales
libslex0Biblioteca compartida usada por los programas.Biblioteca C del sistema, PCRE2 de 8 bits y mem_util.
libslex-devEncabezados slex.h y slexfunc.h, biblioteca de desarrollo y archivo slex.pc para compilar programas C.libslex0 de la misma versión; en DEB, libpcre2-dev y libmem-util-dev.
d2datdincConversor de descripciones de circuitos .d/.ds/.ds2 a JSON y sistemas de Calcula; incluye sus reglas y bibliotecas de datos.Bibliotecas de ejecución declaradas por el paquete, entre ellas Slex y las utilizadas por el conversor. No instala por sí solo el motor Siru ni Calcula.

Para compilar el ejemplo se necesitan además un compilador C y pkg-config. Para construir el proyecto desde sus fuentes se usan Autoconf, Automake, Libtool, Bison, PCRE2, mem_util y unidades; el empaquetado DEB agrega debhelper. Los nombres concretos de las dependencias cambian según la distribución.

Primer ejemplo en C

Guardar lo siguiente como ejemplo.c. Las reglas reconocen palabras y enteros positivos; los blancos llevan código cero y se omiten mediante slex_ctx_set_skip. Es un ejemplo deliberadamente pequeño, no un lexer completo de C ni de expresiones numéricas.

Compilar y ejecutar:

cc -std=c11 -Wall -Wextra ejemplo.c -o ejemplo $(pkg-config --cflags --libs slex)
./ejemplo

Salida esperada:

1 temperatura
2 25

Para leer las reglas desde un archivo se reemplaza slex_ctx_ini_string(ctx, reglas) por slex_ctx_ini_file(ctx, "reglas.slex"). Los números finales de cada regla son códigos elegidos por la aplicación. Para usar acciones, se registran con slex_ctx_register antes de cargar las reglas.

La API actual

OperaciónInterfaz
Crear y liberarslex_ctx_new / slex_ctx_free.
Configurar reglas y accionesslex_ctx_ini_file, slex_ctx_ini_string, slex_ctx_register.
Abrir un flujo léxicoslex_ctx_create_thread. Aquí thread significa flujo del lexer: no crea un hilo del sistema operativo.
Leerslex_next devuelve SLEX_TOKEN, SLEX_EOF o SLEX_ERROR.
Consultar erroresslex_ctx_errcode y slex_ctx_errmsg: texto no reconocido, configuración, expresión regular, entrada/salida, memoria, límites o acción de usuario, entre otros.

La API histórica (ini_slex, get_token y otras funciones sin contexto explícito) se conserva por compatibilidad sobre un contexto predeterminado. Para código nuevo se recomienda la API por contexto. La compatibilidad no convierte automáticamente una aplicación antigua en reentrante: también debe separar su propio estado y sus acciones.

Uso en Simusol: d2datdinc

d2datdinc es una aplicación de Slex, no otro nombre de la biblioteca. Lee circuitos del formato SCEPTRE .d y de los formatos .ds/.ds2, interpreta sus secciones y construye un árbol de datos en memoria. Puede guardar ese árbol como JSON .dat o generar directamente ecuaciones .din para Calcula, sin escribir y volver a leer un JSON intermedio.

d2datdinc circuito.d
d2datdinc circuito.ds -o -
d2datdinc --din circuito.ds

Otros programas que usan Slex

ProgramaUso directo de Slex
Tabular2La lectura de tablas usa Slex con una gramática Bison en src/lectura.y, con contexto propio para cada lectura. Reconoce encabezados y celdas, incluyendo las modalidades CSV. La biblioteca libtabular2 enlaza con Slex.
Calcula 6.0El lenguaje de órdenes usa src/lexico.c (Slex) y psi_yacc.y (Bison). También usan Slex y Bison los lectores de configuración y archivos .sis (claves.y) y de la estructura de los sistemas .din (lectura_din.y).

En Calcula, las expresiones matemáticas de los sistemas dinámicos las compila ExprTk: reconocer la estructura del archivo con Slex no sustituye ese trabajo. Las peticiones del protocolo --machine se leen por líneas en machine.c, sin pasar por el lexer de órdenes; la carga del sistema .din sí utiliza su lector Slex/Bison.

Uso con Bison

El lexer entrega el código de token que espera la gramática; la aplicación conecta ese resultado con yylex, el valor semántico y la ubicación. Para parsers independientes se usa %define api.pure full, parámetros de contexto y %locations; si conviven varias gramáticas también se separan sus prefijos. La prueba tests/bison/ muestra esa conexión. Las reglas .slex no son intercambiables con archivos de Lex/Flex.

Alcance y cuidados

Documentación y ejemplos en las fuentes

La documentación detallada está en el árbol de fuentes del proyecto. Los paquetes de ejecución no necesariamente incluyen todos estos documentos; esta página no presupone que los PDF estén publicados en un directorio web de documentos.

Archivo o directorioContenido
doc/API-CONTEXTO.mdReferencia recomendada para programas nuevos: contextos, acciones, resultados, posiciones, errores y conexión con Bison.
doc/API.mdModelo de trabajo, formato de reglas y referencia de la API histórica.
doc/manual.tex / doc/manual.pdfManual general. Para la API moderna debe complementarse con API-CONTEXTO.
d2datdinc/README.md y din/README.mdConversión de circuitos y generación de ecuaciones; opciones, formatos y límites.
tests/ y tests/bison/Pruebas de API, errores, contextos, concurrencia y parsers puros.
examples/Ejemplos de acciones, cálculo, lectura de circuitos y SPICE. No todos se instalan como programas.
doc/web/Fuente de esta página, ejemplo C compilable, generador HTML y comprobación local.