El autor repasa su experiencia con el análisis sintáctico: las herramientas generadoras como Lemon resolvían el problema a costa de producir código difícil de leer y mantener, mientras que los analizadores escritos a mano eran rápidos pero acababan repitiendo los mismos patrones (saltar espacios, contar líneas, comparar con strchr) con bugs recurrentes. Fruto de esa frustración presenta bx::Scanner, una utilidad de la librería bx pensada como punto intermedio entre ambas opciones. El diseño se apoya en cinco restricciones explícitas: zero-copy y no propietario, un único cursor que nunca avanza por sí solo, seguimiento automático de línea y columna, uso de clases de caracteres predefinidas en lugar de un mini-lenguaje de patrones, y una superficie mínima que cabe en una cabecera. Cada coincidencia se devuelve como StringView que apunta al input original, lo que elimina asignaciones y permite depurar con soltura. El artículo muestra tres usos reales dentro de bx: LineReader para iterar por líneas gestionando \n y \r\n, un lector de INI que crea sub-scanners acotados a cada línea para impedir lecturas fuera de límites, y un análisis de URL donde se discute por qué un token vacío puede ser válido. La conclusión es operativa: con unos pocos primitivos reutilizables se cubre la mayor parte del análisis cotidiano sin generadores, PEGs ni dependencias externas.
Una clase pequeña para construir analizadores léxicos sin generadores
Fuentes:
Parsers don't have to be complicated
