Generalized LR (GLR) es un algoritmo de parsing que generaliza el parsing LR tradicional para manejar gramáticas ambiguas, es decir, gramáticas donde una misma secuencia de tokens puede tener múltiples derivaciones válidas. A diferencia de los parsers LR canónicos que requieren gramáticas no ambiguas y deterministas (LR(k)), GLR opera mediante la exploración de todas las posibles derivaciones de parseo en paralelo. Cuando se encuentra una ambigüedad, el parser "divide" su estado, creando múltiples estados de parseo que continúan procesando la entrada de forma independiente. Estos estados pueden fusionarse posteriormente si convergen en un punto común, gestionando la complejidad a través de un grafo de parseo compartido (Graph-Structured Stack).
GLR se implementa en herramientas de construcción de parsers como GNU Bison (cuando se usa la opción GLR) y Elkhound, que son ampliamente utilizados en la creación de compiladores, intérpretes y herramientas de análisis de código. Por ejemplo, el parser de C++ en GCC o Clang puede utilizar técnicas GLR para manejar la complejidad y las ambigüedades inherentes al lenguaje C++. También es fundamental en el desarrollo de DSLs (Domain-Specific Languages) complejos y en el análisis de lenguajes naturales, donde la ambigüedad es una característica común.
Para un Arquitecto de Sistemas, GLR es crucial cuando se diseña un sistema que debe procesar lenguajes con gramáticas inherentemente ambiguas o muy complejas, donde un parser LR/LL tradicional sería insuficiente o requeriría una reescritura gramatical prohibitiva. Permite la robustez y flexibilidad en el diseño de DSLs o en la integración con lenguajes existentes. Sin embargo, el trade-off principal es el rendimiento: GLR puede ser significativamente más lento que un parser LR determinista en el peor de los casos (debido a la exploración de múltiples caminos), aunque en la práctica, para muchas gramáticas, su rendimiento es lineal. La decisión de usar GLR implica sopesar la necesidad de manejar ambigüedad y complejidad gramatical contra los requisitos de rendimiento y la complejidad de la implementación del parser.