El 19 de marzo se lanzó la biblioteca de C++ Lug, que implementa un lenguaje orientado a objetos para expresar analizadores sintácticos en forma de gramáticas extensas de expresiones sintácticas, y distribuida bajo la licencia MIT.
Funciones de la biblioteca:
- Una sintaxis natural, similar a los lenguajes de generadores de analizadores externos, con soporte para atributos y acciones semánticas.
- Capacidad para trabajar con gramáticas contextuales dependientes que incluyen tablas de símbolos, condiciones y predicados sintácticos.
- Los analizadores generados se compilan en bytecode y se ejecutan en una máquina virtual de análisis sintáctico.
- Una clara separación entre reglas sintácticas y léxicas con la capacidad de configurar la omisión implícita de caracteres en blanco.
- Soporte para recursión izquierda directa e indirecta, con niveles de precedencia para distinguir subexpresiones con recursiones mixtas izquierda y derecha.
- Compatibilidad total para el análisis de texto en formato UTF-8, incluyendo el nivel 1 y coincidencias parciales con el nivel 2 del estándar técnico UTS #18 Expresiones Regulares Unicode.
- Manejo de errores y recuperación mediante fallos etiquetados, reglas de recuperación y controladores de errores.
- Seguimiento automático de números de línea y columna, ancho y alineación de tabulaciones personalizables.
- Biblioteca solo de encabezado que utiliza únicamente la biblioteca estándar y características del estándar C++17. Futuramente compatible con los estándares C++20 y C++23.
- Un tamaño relativamente pequeño para la biblioteca, con el objetivo de mantener el total de líneas en todos los archivos de encabezados por debajo de 6000 líneas de código conciso.
Lista de cambios:
- Se han implementado directivas de colecciones y atributos de objetos. La nueva directiva collect<C>[e] sintetiza una secuencia o un contenedor asociativo del tipo C, compuesto por elementos recogidos de atributos heredados o sintetizados en la expresión e. De manera similar, han surgido nuevas directivas synthesize<C,A…>[e], synthesize_shared<C,A…>[e] y synthesize_unique<C,A…>[e] para la síntesis de objetos, punteros compartidos y punteros únicos respectivamente, construidos a partir de atributos de componentes en la expresión e.
- Se ha implementado la directiva synthesize_collect, que combina las directivas collect y synthesize para mejorar la legibilidad del código y reducir el número de plantillas al construir estructuras de datos complejas a partir de elementos descompuestos. Esto es especialmente útil para crear colecciones anidadas, como matrices de objetos o contenedores asociativos con tipos de valores complejos.
- Se ha añadido la clase plantilla lug::recursive_wrapper para manejar dependencias circulares en árboles de sintaxis abstracta, en particular, aquellos que utilizan std::variant.
- Se ha implementado el soporte para el estándar Unicode 16.0.0 y se ha añadido soporte para herramientas de compilación en CMakeLists.txt.
- Se ha optimizado la coincidencia de rangos y conjuntos de caracteres ASCII, lo que ha resultado en un aumento significativo del rendimiento al realizar operaciones comunes de procesamiento de texto. Se han añadido métodos rápidos especializados para tratar solo caracteres ASCII, que son considerablemente más rápidos que el código de procesamiento Unicode.
- Se han implementado los códigos de operación test para optimizar errores y los códigos de operación repeat para optimizar la omisión de caracteres en blanco. Estas optimizaciones se incluirán por completo en la próxima versión después de las transformaciones planeadas del árbol de expresiones.
- Se ha mejorado el manejo de fuentes de entrada con mejor almacenamiento en búfer y generación de informes de errores para std::istream, así como una mejor compatibilidad con el modo interactivo que maneja correctamente la entrada línea por línea para sesiones de terminal o para gramáticas lineales.
- El soporte para std::istream se ha trasladado a un archivo de encabezado separado . Esto reduce el tiempo de compilación y minimiza las dependencias de encabezados para proyectos que no requieren funcionalidades de entrada/salida de flujo.
- Se ha reestructurado la lógica de fijación del analizador mediante la incorporación de instrucciones en lug::basic_parser para una mejor conformidad con los cambios en la arquitectura del marco de pila presentados en la versión 0.4.0, mejorando así la organización del código y el rendimiento.
- Se ha corregido un problema en el ejemplo del analizador. BASIC, cuando las funciones de usuario (por ejemplo, FNA(X)) se completaban durante la evaluación. Esto fue causado por cambios en la versión 0.4.0 que restablecían lug::environment durante operaciones anidadas de análisis sintáctico. Se agregó una nueva función lug::environment::should_reset_on_parse para proporcionar un control más detallado sobre este comportamiento, permitiendo que el entorno se mantenga durante las operaciones anidadas de análisis cuando sea necesario.
- Se ha agregado una infraestructura integral para probar ejemplos de programas.
- Se ha reestructurado la jerarquía de directorios include.
- Para garantizar una mayor compatibilidad en GitHub CI, se ha agregado soporte para compiladores adicionales (GCC 9/10/11/12, Clang 14/15/16/17).
- Se han añadido analizadores estáticos Clang y MSVC en GitHub CI.
- Se han añadido Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) y Memory Sanitizer (MSan) en GitHub CI.
- Se ha agregado integración de clang-tidy en GitHub CI.
- Se ha eliminado el uso de Ubuntu 20.04 en GitHub CI.
Fuente: linux.org.ru
