2. ¿Que es un análisis descendente?
Es una técnica que intenta comprobar si una cadena x
pertenece al lenguaje definido por una gramática aplicando
los siguientes criterios:
• Partir del axioma de la gramática
• Escoger reglas gramaticales estratégicamente
• Hacer derivaciones por la izquierda (Left Most
Derivation)
• Procesar la entrada de izquierda a derecha
• Obtener el árbol de análisis sintáctico o error
3. Analizadores predictivos
• Se determina qué regla aplicar a partir de un análisis de los
primeros tokens a la entrada
• Son capaces de decidir qué regla de producción aplicar a cada
paso en función de los elementos terminales que se
encuentran en la sentencia de entrada
• Como consecuencia se consigue un proceso de análisis con
complejidad lineal O (n) con respecto al tamaño del problema
• Estos analizadores son llamados analizadores LL (K)
4. Método Predictivo Recursivo
Analizadores predictivos LL (1)
• Determinan que regla de producción aplicar encada paso en
función del token que se encuentra en cada momento en la
cabeza de lectura.
Analizadores predictivos LL (k)
• Determinan que regla de producción aplicar en cada paso en
función de los k primeros tokens que se encuentra en cada
momento en la cabeza de lectura.
6. Analizadores LL (1)
• Para aplicar el análisis descendente predictivo LL(1) se asocia
a cada regla de producción un conjunto de predicción.
• El conjunto de predicción de una regla está formado por la
colección de todos los posibles símbolos terminales que es
necesario encontrar en la sentencia de entrada para poder
aplicar dicha regla
• De todas las reglas candidatas para el no terminal en curso se
escoge aquella que contiene en su conjunto de predicción el
terminal a la entrada.
7. Análisis predictivo LL (1)
• Para aplicar el análisis predictivo LL (1) es necesario que los
conjuntos de predicción de todas las reglas con un mismo
símbolo terminal sean disjuntas entre sí.
8. Condiciones LL (1)
• Para cumplir la condición LL (1) la gramática debe satisfacer
necesariamente 3 requisitos:
› No ambigua
› Factorizada por la izquierda
› No recursiva por la izquierda
10. Implementación Analizadores LL (1)
• En cada paso del proceso de derivación de la sentencia de
entrada se realiza una predicción de la posible producción a
aplicar
• Se comprueba si existe una concordancia entre el símbolo
actual en la entrada con el primer terminal que se puede
generar a partir de esa regla de producción
• Si existe esta concordancia se avanza en la entrada y en el
árbol de derivación, en caso contrario se vuelve hacia atrás y
se elige una nueva regla de derivación
11. Implementación Analizadores LL (1)
• Nos restringimos al caso de métodos deterministas (no hay
vuelta atrás) teniendo en cuenta un solo símbolo de pre
análisis (componente léxico que se está analizando en la
cadena de entrada en ese momento)
• Conocemos exactamente en todo momento que producción
aplicar. El símbolo de pre análisis se actualiza cada vez que se
produce una concordancia.
12. Implementación Analizadores LL (1)
Procedimiento Parea(terminal)
Inicio
si pre análisis == terminal entonces
pre análisis=siguiente token
sino
error sintáctico
fin
13. Implementación Analizadores LL (1)
Procedimiento A()
inicio
según pre análisis está en:
PRIMEROS(a1): {proceder según alternativa a1 }
PRIMEROS(a2): {proceder según alternativa a2 }
...
PRIMEROS(an): {proceder según alternativa an }
fin según
si pre análisis no pertenece a ningún PRIMEROS(ai) entonces error
sintáctico, excepto si existe la alternativa A -> € en cuyo caso no se hace nada
fin
14. Implementación Analizadores LL (1)
• Gramática que se va a implementar:
E --> T E’
E’--> + T E’ | - T E’ | €
T --> F T’
T’--> * F T’ | / F T’ | €
F --> (E) | num | id
15. Implementación Analizadores LL (1)
Procedimiento S() {
Expresion();
Parea(TKN #);
}
Procedimiento Expresion() {
Termino();
Expresion_Prima();
}
Procedimiento Expresion_Prima() {
según pre análisis está en:
{TKN MAS}: Parea(TKN MAS);
Termino();
Expresion_Prima();
{TKN MENOS}: Parea(TKN MENOS);
Termino();
Expresion_Prima();
si no está en ninguno de los anteriores entonces no hacer nada
fin según
}
16. Implementación Analizadores LL (1)
Procedimiento Termino() {
Factor();
Termino_Prima();
}
Procedimiento Termino_Prima(){
según pre análisis está en:
{TKN POR}: Parea(TKN POR);
Factor();
Termino_Prima();
{TKN DIV}: Parea(TKN DIV);
Factor();
Termino_Prima();
si no está en ninguno de los anteriores entonces no hacer nada
fin según
}
17. Implementación Analizadores LL (1)
Procedimiento Factor() {
según pre análisis está en:
{TKN ABREPAR}: Parea(TKN ABREPAR);
Expresion();
Parea(TKN CIERRAPAR);
{TKN NUM}: Parea(TKN NUM);
{TKN ID}: Parea(TKN ID);
si no está en ninguno de los anteriores entonces error();
fin según
}