# Motor de Análisis Sintáctico

El motor de análisis sintáctico (Parsing Grammar Engine) (originalmente motor de gramática de Parrot) o PGE es un compilador y runtime para las reglas de Perl 6 para la máquina virtual Parrot. PGE usa estas reglas para convertir una gramática de análisis de expresiones en bytecode de Parrot.
El motor, por tanto, compila reglas en un programa, a diferencia de la mayoría de máquinas virtuales y runtimes, que almacenan expresiones regulares en un formato interno secundario que es más tarde interpretado en tiempo de ejecución por un motor de expresiones regulares. El formato de las reglas que usa PGE puede expresar cualquier expresión regular y la mayor parte de las gramáticas formales, y por tanto constituye el primer paso de la cadena del compilador para todos los lenguajes basados en Parrot.
Al ejecutarlo, el bytecode generado por PGE será usado para analizar el texto como se describe en las reglas de entrada, generando un árbol de análisis. Dicho árbol puede ser manipulado directamente, o servir como entrada a la siguiente etapa de la cadena de herramientas de compilador de Parrot para generar un árbol sintáctico abstracto a partir del cual se pueda generar código máquina (si la gramática describe un lenguaje de programación).

## Historia

Originalmente se llamó P6GE y estaba escrito en C; PGE se tradujo entonces a Parrot nativo y se renombró poco después de su liberación inicial en noviembre de 2004. Su autor es Patrick R. Michaud. PGE se escribió para reducir la cantidad de trabajo necesario para implementar un compilador sobre Parrot. Además, se escribió para permitir de manera fácil que Perl 6 sea definido en Perl 6, aunque el desarrollo actual de Pugs no usa PGE como su gestor de reglas primario, sino que usa un motor nativo llamado PCR.

## Interioridades

PGE combina tres estilos de análisis:
* Reglas de Perl 6
* un analizador de precedencia de operadores
* subrutinas específicas de análisis
La forma primaria es la de las reglas de Perl 6, de forma que una regla de PGE puede parecerse al siguiente ejemplo para una gramática que representa la suma únicamente:
    rule término { <número> | \( <expresión> \) }
    rule número { \d+ }
    rule expresión { <término> ( '+' <término> )* }
El analizador de precedencia de operadores permite la construcción de una tabla de operadores que puede ser usada directamente por un analizador de estilo de reglas de Perl 6 como sigue:
    rule expresión is optable { ... }
    rule término { <número> | \( <expresión> \) }
    rule número { \d+ }
    proto término: is precedence('=')
    is parsed(&término) {...}
    proto infix:+ is looser('término:') {...}
De este modo se consigue el objetivo de definir una gramática simple para la adición, pero lo hace usando una combinación de una regla/regex al estilo de Perl 6 para término y para número junto con una shift-reduce optable para todo lo demás.

### Generación de Código

Aunque PGE emite código máquina capaz de analizar una gramática descrita por una regla, y puede ser usado en tiempo de ejecución para manejar gramáticas simples y expresiones regulares incluidas en el código, su propósito primario es analizar lenguajes 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 a árboles de análisis sintáctico. El Motor de Árboles Sintácticos (Tree Grammar Engine - TGE) los convierte a continuación en Árboles Sintácticos Abstractos Parrot (Parrot Abstract Syntax Trees - PAST). Un segundo pase de TGE convierte a continuación un PAST en Árboles Sintácticos de Códigos de Operación Parrot (Parrot Opcode Syntax Trees - POST) que pueden ser transformados de forma directa en bytecodes ejecutables.