viernes, 17 de junio de 2016

Tipos de analizadores sintácticos.



Ascendente:
·          
     En el Análisis Sintáctico Ascendente se parte de las hojas y se intenta construir el árbol hacia arriba hasta llegar al símbolo inicial de la gramática.
·        
        En un análisis top-down un parser hacer corresponder cadenas de entrada con sus correspondientes derivaciones izquierdas.
·         
       En un análisis bottom-up un parser hace corresponder cadenas de entrada con las inversas de las correspondientes derivaciones derechas.

Ejemplo:

 


 Análisis sintáctico ascendente


Parten de las hojas (conjunto de tokens) para llegar a la raíz (axioma de la gramática):
·                    Analizadores de procedencia de operador.
·                    Analizador LR(1)

Se denominan analizadores sintácticos ascendentes (botton-up) porque pretenden construir un árbol sintáctico para una determinada cadena de entrada, empezando por las hojas y constituyendo el árbol hasta llegar a la raíz.

Un analizador sintáctico ascendente utiliza una pila explicita para realizar un análisis sintáctico, de manera semejante como lo hace un analizador sintáctico descendente no recursivo. La pila de análisis sintáctico contiene los tokens como símbolos no terminales y también alguna información de estado adicional.

Los analizadores LR reconocen el lenguajes realizando dos operaciones cargar (shift) y reducir (reduce). Lo que hace es leer los tokens de la entrada e ir cargándolos en una pila, de forma que se puedan explorar lo n tokens que contiene esta y ver si se corresponden con la parte derecha de alguna de las reglas de la gramática.

Si es así se realiza un reducción, consistente en sacar de la pila esos n tokens y en su lugar colocar el símbolo que aparezca en la parte izquierda de esa regla. En caso contrario, se carga en la pila el siguiente token y una vez hecho esto se vuelve a intentar una reducción.



Descendente 


En el Análisis Sintáctico Descendente se va recorriendo el árbol sintáctico desde la raíz hasta las hojas, llegando a generar la sentencia que se está analizando. La raíz representa el símbolo inicial de la gramática.

 

Análisis sintáctico descendente LL(1) 


Parten del axioma y aplican las reglas de la gramática hasta llegar a la secuencia de símbolos terminales (tokens):
·                    -Analizadores LL(1).
·                    -Analizadores recursivos.

Es del tipo LL1 porque se empieza a derivar por la izquierda y los caracteres son leídos de izquierda a derecha, el 1 porque se lee 1 solo elemento de entrada.

Para poder trabajar el análisis sintáctico descendente se debe de realizar primeramente alguna de las operaciones para que la gramática sea LL1 las cuales son:
·                 -Eliminar ambigüedad.
·                 -Eliminar recursividad por la izquierda.
·                 -Factorizar.
·                 -Primeros y siguientes
     
Eliminar ambigüedad:

Una gramática es ambigua cuando genera más de un árbol de derivación. Para eliminar la ambigüedad se debe reescribir la gramática.

Ejemplo:
 
Recursividad por la Izquierda:

Una gramática es recursiva por la izquierda si tiene un no Terminal A tal que existe una derivación A->Aα para alguna cadena. Es decir por simple observación podemos identificar.

 
Para eliminar la recursividad por la izquierda se utiliza la siguiente formula.

 
Ejemplo:

Gramática Recursiva.

 

 
Eliminar ambigüedad: Para eliminar la ambigüedad se debe reescribir la gramática.

Eliminar recursividad por la izquierda: Una gramática es recursiva por la izquierda si tiene un nodo 
Terminal a tal que existe una derivación A->Aα para alguna cadena. Es decir por simple observación podemos identificar.

Para eliminar la recursividad por la izquierda se utiliza la siguiente formula. 
 
Factorizar: Se trata de rescribir las producciones de la gramática con igual comienzo para retrasar la decisión hasta haber visto lo suficiente de la entrada como para elegir la opción correcta.

 
Ejemplo:

 
Análisis sintáctico descendente:
·              -Partir del axioma de la gramática.
·              -Escoger reglas gramaticales.
·              -Hacer derivaciones por la izquierda.
·              -Procesar la entrada de izquierda a derecha.
·              -Obtener el árbol de análisis sintáctico o error.

 

Primero  y siguiente:


Las funciones primero y siguiente permiten rellenar, siempre que sea posible, las entradas de una tabla de análisis sintáctico predictivo para una gramática.

También se usan los componentes devueltos por la función siguiente para sincronizar la recuperación de errores en modo pánico.
 


Volver a Menu de Contenidos