34
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

ANALIZADOR SINTÁCTICO

Embed Size (px)

Citation preview

Page 1: ANALIZADOR SINTÁCTICO

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.

Page 2: ANALIZADOR SINTÁCTICO

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.

Page 3: ANALIZADOR SINTÁCTICO

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.

Page 4: ANALIZADOR SINTÁCTICO

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

Page 5: ANALIZADOR SINTÁCTICO

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.

Page 6: ANALIZADOR SINTÁCTICO

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.

Page 7: ANALIZADOR 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

Page 8: ANALIZADOR SINTÁCTICO

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

Page 9: ANALIZADOR SINTÁCTICO

ANALIZADORES SINTACTICOS DESCENDENTES

(Top-down)

<PROGRAMA>

module <DECLARACIONES> ; <PROCEDIMIENTOS> end

d

Page 10: ANALIZADOR SINTÁCTICO

ANALIZADORES SINTACTICOS DESCENDENTES

(Top-down)

<PROGRAMA>

module <DECLARACIONES> ; <PROCEDIMIENTOS> end

d p

Page 11: ANALIZADOR SINTÁCTICO

ANALIZADORES SINTACTICOS DESCENDENTES

(Top-down)

<PROGRAMA>

module <DECLARACIONES> ; <PROCEDIMIENTOS> end

d p ; <PROCEDIMIENTOS>

Page 12: ANALIZADOR SINTÁCTICO

ANALIZADORES SINTACTICOS DESCENDENTES

(Top-down)

<PROGRAMA>

module <DECLARACIONES> ; <PROCEDIMIENTOS> end

d ; <DECLARACIONES>

Page 13: ANALIZADOR SINTÁCTICO

ANALIZADORES SINTACTICOS DESCENDENTES

(Top-down)

<PROGRAMA>

module <DECLARACIONES> ; <PROCEDIMIENTOS> end

d ; <DECLARACIONES>

d

p

Page 14: ANALIZADOR SINTÁCTICO

ANALIZADORES SINTACTICOS DESCENDENTES

(Top-down)

<PROGRAMA>

module <DECLARACIONES> ; <PROCEDIMIENTOS> end

d ; <DECLARACIONES>

d

p ;

Page 15: ANALIZADOR SINTÁCTICO

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

Page 16: ANALIZADOR SINTÁCTICO

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.

Page 17: ANALIZADOR 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

Page 18: ANALIZADOR SINTÁCTICO

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.

Page 19: ANALIZADOR SINTÁCTICO

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.

Page 20: ANALIZADOR SINTÁCTICO

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.

Page 21: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Entrada= abcdefPila vacía

Page 22: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

AvanzaPila = a

Page 23: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Reduce A aPila = A

Page 24: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

AvanzaPila = Ab

Page 25: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Reduce B AbPila = B

Page 26: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

AvanzaPila = Bc

Page 27: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

AvanzaPila = Bcd

Page 28: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

AvanzaPila = Bcdef

Page 29: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Reduce C efPila = BcdC

Page 30: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Reduce D CPila = BcdD

Page 31: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Reduce E DPila = BcE

Page 32: ANALIZADOR SINTÁCTICO

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)

Page 33: ANALIZADOR SINTÁCTICO

S

ANALIZADORES SINTACTICOS ASCENDENTES

(Bottom-up)

B E Fc

A b

a

d D

C

e f

Reduce S BcEFPila = BcEF(Fin del reconocimiento)

Page 34: ANALIZADOR SINTÁCTICO

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.