El viernes 2 de agosto se lanzó la versión de re2c, un generador libre de analizadores léxicos para los lenguajes C y C++. Cabe recordar que re2c fue creado en 1993 por Peter Bambulys como un generador experimental de analizadores léxicos muy rápidos, destacándose de otros generadores por la velocidad del código generado y una interfaz de usuario inusualmente flexible, que permite integrar analistas de manera fácil y eficiente en una base de código existente. Desde entonces, el proyecto ha sido desarrollado por la comunidad y sigue siendo un lugar para experimentos e investigaciones en gramáticas formales y autómatas finitos.
Las principales novedades de la versión 1.2:
Se agregó una nueva forma (simplificada) de verificar el final de los datos de entrada
(en inglés, 'EOF rule').
Para ello, se añadió la configuración re2c:eof,
que permite elegir el símbolo terminal,
y una regla especial $, que se activa si el analizador
ha alcanzado con éxito el final de los datos de entrada.
Históricamente, re2c ofrece varias maneras de comprobar el
final de los datos de entrada, variando en limitación, eficiencia y simplicidad
de aplicación. La nueva forma busca simplificar la redacción de código, manteniéndose
efectiva y ampliamente aplicable. Los métodos antiguos
siguen funcionando y pueden ser preferibles en ciertos casos.Se agregó la posibilidad de incluir archivos externos mediante la directiva
/*!include:re2c "file.re" */, где file.re
es el nombre del archivo incluido. Re2c busca archivos en el directorio del archivo que incluye,
así como en la lista de rutas definidas mediante la opción -I.
Los archivos incluidos pueden incluir otros archivos.
Re2c proporciona archivos 'estándar' en el directorio include/
del proyecto, se supone que ahí se acumularán definiciones útiles
de expresiones regulares, algo en la línea de una biblioteca estándar.
Hasta ahora, a petición del público, se ha añadido un archivo con definiciones de categorías Unicode.Se agregó la posibilidad de generar archivos de encabezado con contenido arbitrario
usando las opciones -t —type-header (o configuraciones correspondientes) y nuevas directivas /*!header:re2c:on*/ y
cuando re2c debe generar definiciones de variables, estructuras y macros,
/*!header:re2c:off*/. Это может быть полезно в случаях,
que se utilizan en otras unidades de traducción.
Re2c ahora entiende literales UTF8 y clases de símbolos en expresiones regulares.Re2c ahora comprende literales UTF8 y clases de símbolos en expresiones regulares.
Por defecto, re2c analiza expresiones como "∀x ∃y" como.
una secuencia de caracteres ASCII de 1 bit e2 88 80 78 20 e2 88 83 79
(códigos hexadecimales), y los usuarios deben escapar manualmente los caracteres Unicode:
"u2200x u2203y". Esto es muy incómodo y inesperado para muchos
usuarios (como lo demuestran los constantes informes de errores). Por eso ahora
re2c proporciona la opción —input-encoding <ascii | utf8>,
que permite modificar el comportamiento y analizar "∀x ∃y" como
2200 78 20 2203 79.Re2c ahora permite usar bloques re2c normales en modo -r —reuse.
Esto es conveniente si el archivo de entrada contiene muchos bloques, y solo parte de ellos
necesita ser reutilizada.Se ha añadido la posibilidad de configurar el formato de advertencias y mensajes de error
con una nueva opción —location-format <gnu | msvc>. El formato GNU se muestra
como filename:line:column:, y el formato MSVC — como filename(line,column).
Esta opción puede ser útil para los aficionados a las IDE.
También se ha añadido la opción —verbose, que muestra un breve mensaje de éxito en caso de éxito.Se ha mejorado el modo de "compatibilidad" con flex — se han corregido algunos errores de análisis y
la prioridad incorrecta de operadores en casos raros.
Históricamente, la opción -F —flex-support permite escribir código
mezclando el estilo de flex y el estilo de re2c, lo que dificulta un poco el análisis sintáctico.
El modo de compatibilidad con flex se usa raramente en nuevo código,
pero re2c sigue apoyándolo por compatibilidad hacia atrás.El operador de resta de clases de caracteres / ahora se aplica
antes de la expansión de la codificación, lo que permite su uso en más casos,
si se utiliza una codificación con longitud variable de caracteres (por ejemplo, UTF8).El archivo de salida ahora se crea de forma atómica: re2c primero crea un archivo temporal
y escribe el resultado en él, y luego renombra el archivo temporal como el archivo de salida
en una sola operación.La documentación ha sido completada y reescrita; en particular, se han agregado nuevos
y sobre las formas de comprobar el final de los datos de entrada.
La nueva documentación se ha recopilado en un
manual exhaustivo de una sola página
con ejemplos (los mismos fuentes se dibujan en manpage y en la documentación en línea).
Se han hecho intentos débiles para mejorar la legibilidad del sitio en teléfonos.Desde el punto de vista de los desarrolladores, re2c ha adquirido un sistema de subsistemas más completo.
depuración. El código de depuración ahora está desactivado en las compilaciones de lanzamiento y
puede ser activado con la opción de configuración —enable-debug.
Esta versión tomó mucho tiempo — casi un año.
La mayor parte del tiempo, como siempre, se dedicó al desarrollo de la base teórica y la redacción
artículo «Extracción Eficiente de Subcoincidencias POSIX en NFA».
Los algoritmos descritos en el artículo están implementados en la biblioteca experimental libre2c
(la construcción de la biblioteca y los benchmarks está desactivada por defecto y se activa con la opción de configuración
—enable-libs). La biblioteca no está concebida como competidora de proyectos ya existentes
como RE2, sino como una plataforma de investigación para el desarrollo de nuevos
algoritmos (que luego pueden ser utilizados en re2c o en otros proyectos).
También es conveniente desde el punto de vista de las pruebas, los benchmarks y la creación de bindings a otros lenguajes.
Gracias de parte de los desarrolladores de re2c a todos los que ayudaron a que esta versión fuera posible,
y en general a la comunidad por las ideas, informes de errores, parches, el espíritu combativo, etc. ;]
Fuente: linux.org.ru
