Post on 25-Nov-2014
ANALIZADOR SINTÁCTICO
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol sintáctico que lo reconoce.
ANALIZADOR SINTÁCTICO
También hace: Acceder a la tabla de símbolos.Chequeo de tipos. Generar código intermedio. Generar errores cuando se
producen.
ANALIZADOR SINTÁCTICO
También hace: Convierte el texto de entrada en otras
estructuras (comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada.
Crea tókens de una secuencia de caracteres de entrada y son estos tókens los que son procesados por el analizador sintáctico para construir la estructura de datos.
ESQUEMA DEL ANALIZADOR SINTACTICO
AnalizadorSintáctico
AnalizadorSemántico
AnalizadorLéxico
Tabla de símbolos
Gestor deerrores
Gramática libre de contexto
Token
Pide siguienteToken
Árbol sintáctico
Representaciónintermedia
Programafuente
IR A ERRORES
ANALIZADORES SINTACTICOS DESCENDENTES (Top-down)
Se puede considerar como una técnica que intenta encontrar una derivación de la cadena de entrada.
También podemos considerarlo como una técnica que intenta construir un árbol sintáctico de la cadena de entrada, comenzando por la raíz y creando los nodos a partir de ella hasta llegar a las hojas.
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
PROBLEMA DEL RETROCESOEl primer problema que se presenta con el análisis sintáctico descendente, es que a partir del nodo raíz, el analizador sintáctico no elija las producciones adecuadas para alcanzar la sentencia a reconocer. Cuando el analizador se da cuenta de que se ha equivocado de producción, vuelve a tener que reconstruir parte del árbol sintáctico.
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
G = (VN, VT, S, P) donde:
VN={<PROGRAMA>, <DECLARACIONES>, <PROCEDIMIENTOS>}VT={module, d, p, ;, end}S=<PROGRAMA>
las reglas de producción P son las siguientes:<PROGRAMA> ::= module <DECLARACIONES>; <PROCEDIMIENTOS> end<DECLARACIONES> ::= d | d; <DECLARACIONES><PROCEDIMIENTOS> ::= p | p; <PROCEDIMIENTOS>
Analizar la cadena de entrada siguiente: module d ; d ; p ; p end
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
Se parte del símbolo inicial <PROGRAMA> Aplicando la primera regla de producción de la
gramática se obtiene:<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d p
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d p ; <PROCEDIMIENTOS>
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d ; <DECLARACIONES>
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d ; <DECLARACIONES>
d
p
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d ; <DECLARACIONES>
d
p ;
ANALIZADORES SINTACTICOS DESCENDENTES
(Top-down)
<PROGRAMA>
module <DECLARACIONES> ; <PROCEDIMIENTOS> end
d ; <DECLARACIONES>
d
p ; <PROCEDIMIENTOS>
p
Fin del proceso : module d ; d ; p ; p end
ANALIZADORES SINTACTICOS RECURSIVOS DESCENDENTES
Es una forma general de análisis sintáctico descendente que puede incluir retrocesos (es decir
varios exámenes de la entrada). Método descendente en el que se ejecuta un
conjunto de métodos recursivos para procesar la entrada.
La secuencia de métodos llamados durante el procesamiento de la entrada define implícitamente un árbol de análisis sintáctico.
ANALIZADORES SINTACTICOS RECURSIVOS DESCENDENTES
Si una regla es de la forma
<R> → 1 | 2 | 3 | ... | k
el código de la función que le corresponde será de la forma
if( SIMB Sel(1 ) )
{ }else if( SIMB Sel(2 ) )
{ }::else if( SIMB Sel(k ) )
{ } else { mensaje: “ERROR: se espera: ” Sel(1) Sel(2) ... Sel(k) }
Código para 1
Código para 2
Código para k
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
Se denominan analizadores sintácticos ascendentes (en inglés bottom-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.
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
Parte de las hojas del correspondiente árbol de derivación derecho
Análisis de tipo shift-reduce (desplazamiento-reducción)
Usaremos una pila, en la que iremos almacenando las posibles alternativas con las que trabajamos.
Un movimiento consistirá en comprobar si la cabeza de la pila se puede reducir por un no-terminal. Si es así, se realiza una reducción.
ANALIZADORES SINTACTICOS ASCENDENTES (Bottom-up)
Si coincide la cabeza de la pila con varias partes derechas de distintos símbolos no-terminales, éstas han de ordenarse en alguna forma, y aplicarlas según ese orden.
Si no hubiera reducción posible, hacemos un movimiento shift (apilar el siguiente símbolo a la entrada)
Siempre se ha de reducir antes de hacer un desplazamiento.Si se agotan los símbolos a la entrada y no es posible hacer
ninguna reducción más, aplicamos retroceso hasta el punto de la última reducción.
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Entrada= abcdefPila vacía
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
AvanzaPila = a
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce A aPila = A
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
AvanzaPila = Ab
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce B AbPila = B
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
AvanzaPila = Bc
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
AvanzaPila = Bcd
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
AvanzaPila = Bcdef
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce C efPila = BcdC
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce D CPila = BcdD
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce E DPila = BcE
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce F ɛPila = BcEF(Pila crece sin consumir entrada)
S
ANALIZADORES SINTACTICOS ASCENDENTES
(Bottom-up)
B E Fc
A b
a
d D
C
e f
Reduce S BcEFPila = BcEF(Fin del reconocimiento)
VENTAJAS Y DESVENTAJAS
Ventajas: • Son métodos potentes que permiten reconocer la mayoría
de las construcciones de los lenguajes de programación.• Es un método sin retroceso y por tanto determinista.
Desventajas:• Difícil de comprender, de implementar a mano y de realizar
una traza.