Parsing Expression Grammar (PEG) es un formalismo para especificar lenguajes formales, similar en propósito a las gramáticas libres de contexto (Context-Free Grammars - CFG) pero con una semántica de reconocimiento fundamentalmente diferente. A diferencia de las CFG, que pueden ser ambiguas, las PEG son inherentemente deterministas y no permiten ambigüedad. Se basan en un conjunto ordenado de reglas de "parsing expressions" que intentan hacer coincidir la entrada de forma secuencial y prioritaria. Si múltiples reglas pueden coincidir en un punto, solo la primera en el orden especificado se aplica (principio de "first match wins"), lo que elimina la necesidad de backtracking o resolución de ambigüedades complejos.
Las PEG se han implementado en una variedad de herramientas y sistemas para el análisis sintáctico de lenguajes. Ejemplos notables incluyen el analizador de expresiones regulares de Ruby 1.9+, el lenguaje de programación Lua (para su propio parser), y herramientas de generación de parsers como PEG.js y OMeta. También son la base de herramientas de DSL (Domain-Specific Language) y de configuración, donde la claridad y el determinismo en el análisis son cruciales. Su naturaleza determinista las hace atractivas para la implementación de parsers eficientes y predecibles, especialmente en escenarios donde la ambigüedad es indeseable o difícil de manejar.
Para un Arquitecto de Sistemas, comprender las PEG es valioso al diseñar o seleccionar herramientas para el procesamiento de lenguajes, la validación de entradas o la implementación de DSLs. Ofrecen una alternativa robusta y predecible a las CFG tradicionales, eliminando la complejidad asociada a la ambigüedad. El trade-off principal es que, si bien son más fáciles de implementar y depurar debido a su determinismo, pueden ser menos expresivas que las CFG para ciertos tipos de lenguajes inherentemente ambiguos. La elección de PEG es estratégica cuando la prioridad es la eficiencia, la claridad del parser y la eliminación de ambigüedades, lo que se traduce en sistemas más fiables y fáciles de mantener, especialmente en la infraestructura de compiladores, intérpretes o herramientas de configuración complejas.