ANALIZADOR SINTÁCTICO

Preview:

Citation preview

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.

Recommended