Parser Grammar Engine ( PGE , originalmente Parrot Grammar Engine ) es un compilador y sistema de ejecución de reglas Raku para la máquina virtual Parrot . [1] PGE utiliza estas reglas para convertir una gramática de expresión de análisis en bytecode de Parrot . Por lo tanto, compila reglas en un programa, a diferencia de la mayoría de las máquinas virtuales y entornos de ejecución, que almacenan expresiones regulares en un formato interno secundario que luego es interpretado en tiempo de ejecución por un motor de expresiones regulares. El formato de reglas utilizado por PGE puede expresar cualquier expresión regular y la mayoría de las gramáticas formales y, como tal, forma el primer eslabón en la cadena de compilación para todos los lenguajes front-end de Parrot.
Cuando se ejecuta, el código de bytes generado por PGE analizará el texto como se describe en las reglas de entrada, generando un árbol de análisis. El árbol de análisis se puede manipular directamente o introducir en la siguiente etapa de la cadena de herramientas del compilador Parrot para generar un árbol de sintaxis abstracta (AST) a partir del cual se puede generar código; si la gramática describe un lenguaje de programación.
Originalmente llamado P6GE y escrito en C, PGE fue traducido a Parrot nativo y renombrado poco después de su lanzamiento inicial en noviembre de 2004. Su autor es Patrick R. Michaud. [2] PGE fue escrito para reducir la cantidad de trabajo necesario para implementar un compilador en Parrot. También fue escrito para permitir que Perl 6 se autoaloje fácilmente, aunque el desarrollo actual de Pugs ya no usa PGE como su back-end de reglas principal a favor de un motor nativo llamado PCR. [3]
PGE combina tres estilos de análisis:
La forma principal son las reglas de Raku, por lo que una regla PGE podría verse así para una gramática de solo adición:
término de la regla { <número> | \( <expr> \) } número de regla { \d+ } expresión de la regla { <término> ( '+' <término> )* }
El analizador de precedencia de operadores permite crear una tabla de operadores y utilizarla directamente en un analizador de estilo de reglas de Perl 6 de la siguiente manera:
la expresión de la regla es optativa { ... } término de la regla { <número> | \( <expr> \) } número de regla { \d+ } término proto : es precedencia ( '=' ) se analiza ( &término ) {...} infijo proto : + es más flexible ( 'término:' ) {...}
Esto logra el mismo objetivo de definir una gramática simple, de solo suma, pero lo hace utilizando una combinación de reglas/expresiones regulares de estilo Raku para term
y number
y una opción shift-reduce para todo lo demás.
Aunque PGE genera código que analizará la gramática descrita por una regla y puede usarse en tiempo de ejecución para manejar gramáticas simples y expresiones regulares que se encuentran en el código, su propósito principal es analizar lenguajes de programación de alto nivel .
La cadena de herramientas del compilador Parrot se divide en varias partes, de las cuales PGE es la primera. PGE convierte el código fuente en árboles de análisis . El motor de gramática de árboles (TGE) los convierte luego en árboles de sintaxis abstracta (PAST) de Parrot. Una segunda pasada de TGE convierte un PAST en árboles de sintaxis de código de operación (POST) de Parrot que se pueden transformar directamente en código de bytes ejecutable.