CParseC: combinadores de analizadores sintácticos en un único archivo de cabecera en C

Fuentes: CParseC: Single header Parser Combinators in C

CParseC (C Parser Combinators) es una biblioteca de análisis sintáctico para C99 que implementa el enfoque de combinadores de parsers inspirado en la biblioteca Parsec de Haskell. Se distribuye como un único archivo de cabecera (cparsec.h) sin dependencias externas, lo que evita la complejidad de generar código con herramientas como Flex o Bison y facilita su integración en cualquier proyecto.

El diseño se apoya en macros que generan funciones pequeñas e inlinables que se componen entre sí, lo que permite escribir gramáticas de forma declarativa y compacta. Los parsers devuelven valores CpcValue, que pueden ser slices (CpcSlice) con referencias de cero copia a la entrada, o listas (CpcList) almacenadas en un arena cuyo espacio gestiona el usuario, sin asignaciones ocultas. Algunas macros disponen de variantes optimizadas con memchr para aprovechar instrucciones SIMD, y existen versiones sin nombre (anónimas) que reducen la sobrecarga de declarar cada función intermedia, aunque requieren extensiones de GCC como funciones anidadas y expresiones de instrucción.

En las pruebas publicadas por el autor, un parser CSV construido con CParseC procesa un millón de filas aproximadamente 1,25 veces más rápido que rust-csv de BurntSushi y unas 20 veces más rápido que attoparsec-csv. Los resultados de benchmarking continuo están disponibles en los runs de GitHub Actions del repositorio.

La biblioteca es adecuada para desarrolladores C que necesiten analizar formatos estructurados —CSV, JSON, DSL propios o lenguajes de configuración— sin renunciar al control sobre las asignaciones de memoria. Sus limitaciones principales son la dependencia de extensiones no estándar de GCC para los combinadores anónimos y la necesidad de reservar espacio en el arena por adelantado.