Sei sulla pagina 1di 58

ANALIZADOR

SINTCTICO
DESCENDENTE
INTEGRANTES:
-

Alvarado Moreno Vctor


Cabrera Carrasco Moises
Gonzales Alayo Karla
Rodriguez Sandoval Rosalba
Velasquez Diaz Ftima
Zamora Gonzlez Stefani

I.INTRODUCCIN

Un lenguaje de programacin es un conjunto de


expresiones que describen un conjunto de acciones
que un computador debe ejecutar a fin de realizar
una tarea determinada. Estas expresiones estn
formadas producciones gramaticales, que a su vez
estn formadas por palabras, generalmente en
ingls, que deben ser interpretadas en rdenes que
un computador pueda ejecutar. Al conjunto de
producciones gramaticales de un lenguaje se le
denomina, gramtica del lenguaje.

Para interpretar estos lenguajes, se construyen


programas llamados compiladores, los cuales,
mediante tcnicas ya establecidas, determinan que el
conjunto de instrucciones que conforman un
programa, estn escritas de manera correcta. Luego
de determinar si el programa est escrito
correctamente, transforma cada una de esas
instrucciones en cdigo ejecutable (binario), que ser
ejecutado por el computador.

Cada una de las producciones gramaticales que


conforman un lenguaje, deben ser capaces de simbolizar
una y slo una operacin, de modo que el compilador no
tenga problemas de ambigedad al momento de
transformar el programa en lenguaje de mquina.Es en
esta parte del proceso, donde la construccin de tablas
de anlisis sintctico entra en juego, para determinar que
no exista ambigedad en el lenguaje, y a la vez
proporcionando una herramienta para determinar que
cada una de las instrucciones de un programa est bien
construida.

Qu es un ANALIZADOR SINTCTICO
DESCENDENTE?
Se llama descendente porque parte del smbolo inicial (la raz del rbol
de derivacin) y trata de llegar a la cadena de terminales (las hojas del
rbol).
Se estudia los siguientes tokens a analizar para decidir la regla a
expandir.
Lookahead: N de tokens necesario para realizar la eleccin de la regla
a expandir.
Gramticas LL(1): con Lookahead = 1
CARACTERSTICAS
Parte del axioma de la gramtica.
Procesa la entrada de izquierda a derecha.
Escoge reglas gramaticales.

EJEMPLO:
Analizar la cadena de entrada cad dada la
gramtica siguiente:
Gramtica
S cAd
A ab|a
cad, se toma la primera produccin.
Gramtica
S cAd
A ab
Aa

o cad, se toma la segunda produccin.


o siguiente hoja del rbol A, cabd

o cad se compara con la siguiente hoja del rbol etiquetada con


b. Como no concuerda, se indica el error y se vuelve a A para
ver si hay otra alternativa no intentada.

Gramtica
S cAd
A ab
Aa

o cad, se toma la siguiente alternativa que comienza


por a.
o siguiente hoja del rbol A, cad

Gramtica
S cAd
A ab
A a

o cad, coincide d con d anlisis exitoso

Gramtica
S cAd
A ab
Aa

II.A.S.D. CON
RETROCESO

CONCEPTO:
Consiste en que parte del axioma inicial y
aplica todas las posibles reglas al no
terminal ms a la izquierda. Intenta
sustituir cada smbolo no terminal por
cada una de sus producciones hasta
encontrar la produccin adecuada.

Podramos
considerar
el
anlisis
sintctico
descendente con retroceso como un caso particular de
bsqueda ciega en profundidad (se desempata de
izquierda a derecha)
El criterio para decidir si una regla es aplicable en una
posicin es la coincidencia de esa posicin con el no
terminal que est en la parte izquierda de la regla.
No podemos continuar por un camino cuando
tengamos terminales que discrepan con el programa
(podemos suponer el orden de recorrido natural del
programa (de izquierda a derecha)

Habremos terminado el proceso en dos situaciones:


Si el rbol de derivacin se cierra porque se ha
llegado a eliminar todos los no terminales y se
obtiene la misma secuencia de terminales del
programa. En este caso se ha construido un rbol
sintctico para el programa que resulta ser
correcto.
Si no se ha podido cerrar el rbol de derivacin
pero se han probado todas las reglas en cada
posicin y no se puede aplicar ninguna otra
opcin. En ese caso se ha demostrado que el
programa es sintcticamente incorrecto.

PASOS:
1.
2.
3.
4.
5.
6.

Smbolo actual = axioma


Encontrar las reglas que expanden el smbolo actual.
Si slo hay una regla, aplicarla.
Si hay varias reglas, aplicar la primera y mantener las otras en reserva.
Por cada smbolo de la parte derecha de la regla, repetir desde el paso 2.
Cuando el anlisis falle porque la regla requiere que el siguiente smbolo de la
entrada sea un cierto terminal pero no lo es, o la expansin del axioma es
correcta pero no cubre toda la cadena de entrada:
a. Deshacer la aplicacin de esta regla.
b. Volver al punto de eleccin de la regla.
c. Elegir la siguiente alternativa.

7. El anlisis termina con xito si:


a. Se pueden generar todos los smbolos terminales de la cadena de entrada a
partir de la expansin de los no terminales.
b. No se puede analizar la cadena/programa de entrada puesto que es invlida y
aunque se han intentado probar todas las reglas en cada paso, no hay
ninguna derivacin posible.

Ejemplo:
Gramtica:

Cadena a analizar:

III.A.S.D
RECURSIVO

Es una forma general de anlisis sintctico


descendente que puede incluir retrocesos (es decir
varios exmenes de la entrada).
Su funcionamiento se basa en un conjunto de
funciones recursivas.
Cada smbolo no terminal genera una funcin.
En esta funcin se selecciona la regla de
produccin a ejecutar en funcin del valor del
siguiente token.
La pila se sustituye implcitamente por la pila de
llamadas.

El mtodo bsico descendente recursivo


La idea del anlisis sintctico descendente recursivo es muy simple.
Observamos
la regla Gramatical para un no terminal A como una definicin para un
procedimiento que reconocer una A.
EJEMPLO:
exp
opsuma
term
opmult
factor

exp opsuma term / term

+| term opmult factor /factor

( exp ) / nmero

PSEUDOCDIGO:
procedure factor ;
begin
case token of
(:
match( ( ) ;
exp ;
match( ) ) ;
number :
match(number) ;
else error ;
end case ;
end factor ;

Repeticin y seleccin: el uso de EBNF


La notacin EBNF est diseada para reflejar muy de cerca el cdigo
real de un analizador sintctico descendente recursivo, de modo que
una gramtica debera siempre traducirse en EBNF si se est
utilizando el modo descendente recursivo. Advierta tambin que, aun
cuando esta gramtica es ambigua, es natural escribir un analizador
sintctico que haga concordar cada token else tan pronto como se
encuentre en la entrada. Esto corresponde precisamente a la regla de
eliminacin de ambigedad ms cercanamente anidada.
La flexibilidad del anlisis sintctico descendente recursivo, al
permitir al programador ajustar La programacin de las acciones, lo
hace el mtodo de eleccin para analizadores sintcticos generados a
mano.

IV.ANLISIS
PREDICTIVO
LL(1)

El analizador debe realizar la previsin de la regla a


aplicar slo con ver el primer smbolo que produce
para que el algoritmo tenga una complejidad lineal.
Las gramticas que son susceptibles de ser
analizadas sintcticamente de forma descendente
mediante un anlisis predictivo y consultando un
nicamente un smbolo de entrada pertenecen al
grupo LL(1).
A partir de gramticas LL(1) se pueden construir
analizadores sintcticos descendentes predictivos
(ASDP), que son ASD sin retroceso.

Conjuntos de Prediccin
Son conjuntos de smbolos terminales
Ayudan a predecir qu regla se debe aplicar para el no
Terminal que hay que derivar.
Se construyen a partir de los smbolos de las partes derechas
de las producciones de la gramtica.
El analizador consulta el siguiente smbolo en la entrada.
Si pertenece al conjunto de prediccin de una regla aplica esa
regla, si no da error.

La gramtica

No cumple los requisitos para LL(1) porque si aparece una


a en la entrada hay dos posibles opciones.
Luego el anlisis:

no puede ser predictivo y,

la gramtica no es LL(1).

Clculo de los conjuntos de prediccin


Los conjuntos de prediccin se calculan:
En funcin de los primeros smbolos que puede
generar la parte derecha de la regla, y
Cuando la parte derecha puede generar la cadena
vaca, en funcin de los smbolos que pueden
aparecer a continuacin de la parte izquierda de la
regla en una forma sentencial derivable del smbolo
inicial.
.

Clculo de los primeros


Si es una forma sentencial compuesta por una concatenacin
de smbolos, PRIM() es el conjunto de terminales (o ) que
pueden aparecer iniciando las cadenas que pueden derivar de
.

Clculo de los Siguientes


Se aplica a no terminales de la gramtica (A)
Devuelve el conjunto de terminales que pueden
aparecer a continuacin de A en alguna forma
sentencial derivada del smbolo inicial y
Un smbolo ($) que representa el final de la cadena de
entrada.
Si A es un smbolo inicial no terminal de la gramtica,
SIG(A) es el conjunto de terminales (y $) que pueden
aparecer a continuacin de A en alguna forma sentencial
derivada del smbolo inicial.

Reglas

Gramtica

Para SIG(E)

Para SIG(E)

Para SIG(T)

Para SIG(T)

Para SIG(F)

V.USO DE
TABLAS DE
ANLISIS

CONCEPTO
Matriz bidimensional M con A filas y B columnas.
A es la cantidad de no terminales de la gramtica
y B es la cantidad de terminales.
La tabla es utilizada por un analizador sintctico
predictivo guiado por tablas para analizar
sintcticamente una hilera de caracteres.

CREACIN DE UNA TABLA DE ANLISIS


Lo primero que se necesita es una gramtica G
Luego necesitamos, a partir de dicha gramtica,
conocer todos los elementos posibles que una
con los que una produccin gramatical podra
iniciar
Seguidamente necesitamos conocer el conjunto
de todos los posibles elementos que podran
seguir tras finalizar cada produccin gramatical
Con ello finalmente tenemos lo necesario para
construir la tabla de anlisis sintctico.

CARACTERSTICAS
Su funcionamiento se basa en una pila y una tabla de
anlisis
La pila almacena las hojas del rbol de anlisis sintctico
Siempre se estudia el contenido de la cima de la pila
La tabla de anlisis tiene: Una fila por cada smbolo no
terminal, Una columna por cada smbolo terminal y el fin
de entrada
Las celdas de la tabla contienen enlaces a las reglas de
produccin
El contenido de la tabla indica que regla expandir en
funcin del smbolo terminal recibido

CONSTRUCCIN DE LA TABLA

FUNCIONAMIENTO DE LA TABLA

LO
P
M
EJE

Construccin de la tabla de anlisis sintctico despus de procesar la produccin E->TE.

Construccin de la tabla de anlisis sintctico despus de procesar la produccin


E- >+TE

Construccin de la tabla de anlisis sintctico despus de procesar la produccin E-> .

Tabla de anlisis sintctico LL (1) finalizada

FUNCIONAMIENTO DE
LA PILA

Construir tablas de anlisis sintctico parecera un


trabajo tedioso para nosotros
Si bien es cierto, las tablas de anlisis sintctico LL (1) no
brinda toda la informacin para determinar la eficiencia de
un lenguaje de programacin.
Por otra parte son lo suficientemente expresivas como
para detectar la ambigedad de un lenguaje y brindar al
programador un punto de partida en la toma de
decisiones mientras construye un lenguaje de
programacin.

V.MANEJO DE
ERRORES

Si un compilador tuviera que procesar slo


programas correctos su diseo se simplificar
mucho.
Se sabe que los programas pueden tener
errores de muy diversos tipos:
Lxicos
Sintcticos
Semnticos
Lgicos

La mayor parte de los errores se detecta en el anlisis


sintctico:
Es el que se da cuenta de errores arrastrados del anlisis
lxico.
La deteccin de errores semnticos y lgicos en el
momento de la compilacin es muy difcil.
El manejador de errores en un analizador sintctico debe:
Informar de la presencia de errores con claridad y exactitud.
Recuperarse de cada error con la suficiente rapidez como
para detectar errores posteriores
No debe aumentar el tiempo de procesamiento de los
programas correctos

Para el tratamiento de los errores sintcticos, un gestor de errores


debe proporcionar las siguientes funciones :
Determinar si el programa es sintcticamente correcto.
Proporcionar un mensaje de error significativo.
Reanudar el anlisis tan pronto como sea posible. Si No
podemos perder demasiada parte de la entrada.
Evitar errores en cascada, un error genera una secuencia de
sucesivos errores. Para evitarlo se debe consumir (ignorar)
parte de la entrada.

Realizar una correccin (reparacin) del error. El analizador


intenta inferir un programa correcto de uno incorrecto. El
nmero de tokens que deben ser insertados, borrados o
cambiados debe ser mnimo. Esto es extremadamente
complicado ya que adivinar la intencin del programador
no siempre es posible. Solamente sera til para situaciones
sencillas como: falta.
Los mtodos de recuperacin de errores suelen ser mtodos adhoc, en el sentido de que se aplican a lenguajes especficos y a
mtodos concretos de anlisis sintctico (descendente, ascendente.
etc), con muchas situaciones particulares.
Existen varias estrategias para corregir errores, una vez detectados:

1. Recuperacin en modo de alarma (Panic mode )

2. Recuperacin a nivel de frase

3. Correccin Global :Dada una secuencia completa de tokens a ser


reconocida, si hay algn error por el que no se puede reconocer, se
encontrara la secuencia completa ms parecida que s pueda ser
reconocida. Es decir, el analizador sintctico le pide toda la secuencia
de tokens al lxico, y lo que hace es devolver lo ms parecido a la
cadena de entrada pero sin errores, as como el rbol que lo reconoce.

GRACIAS!

Potrebbero piacerti anche