Está en la página 1de 129

M

ªL
ui
sa
D
Procesadores de lenguajes I

íe
Análisis sintáctico ascendente
z
Pl
at
as
Mª Luisa Díez Platas

Procesadores de Lenguajes I. Análisis sintáctico ascendente M. Luisa Díez


Platas
Resumen del tema (I)

1. Características generales

M
ªL
2. Funcionamiento de los analizadores ascendentes

ui
3. Analizadores LR

sa
• Elementos de un analizador LR
• Tipos de analizadores LR. Analizador LR óptimo

D
íe
• Algoritmo general de los analizadores LR

z
4. Analizador SLR

Pl
• Construcción del autómata LR(0)

at
• Algoritmo de construcción de la tabla SLR

as
• Conflictos en la tabla de análisis. Detección de estados con conflicto
5. Compactación de la tabla LR
• Algoritmo general de un analizador LR con eliminación de estados

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Resumen del tema (II)

7. Analizador LR

M
• Construcción del autómata LR(1)

ªL
• Algoritmo de construcción de la tabla LR(1)
Conflictos en la tabla de análisis. Detección de estados con conflicto

ui

Resolución de conflictos

sa

8. Analizador LALR

D
• Construcción del autómata LALR

íe
9. Recuperación de errores en un analizador LR

z
Pl
• Recuperación de errores en modo de pánico

at
• Producciones de error

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Características generales
• Comprueban si una cadena de símbolos pertenece a un lenguaje aplicando
reducciones sobre la cadena de entrada hasta alcanzar el símbolo inicial de la

M
gramática.

ªL
• En general son más potentes que los métodos descendentes.
• Pueden manejar gramáticas recursivas a izquierdas.

ui
• Los algoritmos de implementación son más complejos que los de los métodos

sa
ascendentes.

D
• La implementación “a mano” de estos algoritmos es demasiado compleja y generalmente
se utilizan generadores automáticos.

íe
z
Pl
at
as
Gramáticas G. Libres
LR(1) LL(1)
de
Contexto

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Funcionamiento de los analizadores
ascendentes (I)
• Parten de las hojas del árbol de análisis (frase a analizar) y realizan
reducciones hasta llegar al axioma.

M
• El proceso es el inverso de una derivación en la que se aplicarían las

ªL
producciones por la derecha.

ui
• Fundamentalmente existen dos tipos de algoritmos para analizadores

sa
ascendentes:

D
• Ascendente con retroceso.

íe
• Fácil de implementar con backtracking, pero pueden llegar a ser muy lentos.

z
Pl
• No siempre detectan los errores.

at
• Se pueden dar retrocesos en el análisis

as
• Ascendente predictivo (LR).
• Predicen la acción a realizar con exactitud y detectan los errores cuando se producen.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Funcionamiento de los analizadores
ascendentes (II)
G=( {a,b,c,d,e}, {S, A, B}, S, P ) Frase: abbcde

M
1. S -> aAcBe

ªL
2. A -> Ab

ui
sa
3. A -> b

D
4. B -> d

íe
z
Pl
Este sería el proceso en ascendente:

at
as
abbcde -> aAbcde -> aAcde -> aAcBe ->S
El descendente lo haría así:
S -> aAcBe -> aAcdc -> aAbcde -> abbcde

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Funcionamiento de los analizadores
ascendentes (III)
• Se basa en el método del pivote o mango. Consiste en
encontrar en las formas de frase por las que se pasa
M
ªL
un mango o pivote.

ui
• Un mango es un par formado por una producción y la posición en la que

sa
puede ser aplicada en un prefijo viable

D
• Se decide que mango aplicar en cada caso

íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Funcionamiento de los analizadores
ascendentes(IV)
• En el proceso anterior:

M
abbcde -> aAbcde -> aAcde -> aAcBe ->S.

ªL
ui
• En cada forma de frase por la que pasamos se podrían

sa
detectar varios mangos en las distintas formas de frase.

D
íe
• La posición indica a partir de que punto es aplicable el

z
mango en la producción.

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Características y funciones de un analizador
sintáctico (V)
1.S -> aAcBe

M
2. A -> Ab

ªL
3. A -> b

ui
sa
4. B -> d
• Los mangos detectados y aplicados(*) en cada forma de

D
íe
frase son:

z
• abbcde [3,(2)]* [(3),3] [(4),5]
Pl
at
• aAbcde [(2), 2]* [(3), 3] [(4),5]

as
• aAcde [(4),4]*
• aAcBe [(1),1]*

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Características y funciones de un analizador
sintáctico (VI)

• Los analizadores ascendentes usarán una pila en la

M
simulan la construcción del árbol de análisis.
ªL
ui
• Apilan los componentes léxicos que van leyendo e

sa
intentan detectar un prefijo viable (equivale a el

D
mango).

íe
z
• Un prefijo viable es un prefijo de una forma de frase por la derecha,

Pl
cuyo símbolo final coincide con el final de la parte derecha de una

at
producción de la gramática y además contiene todos los símbolos de

as
la parte derecha de la producción.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Características y funciones de un analizador
sintáctico (VII)
• El proceso sería el siguiente:

M
Pila de análisis Frase Mango

ªL
a bbcde No es prefijo viable

ui
sa
ab bcde Es prefijo viable [(3),2]

D
aAb cde Es prefijo viable [(2),2]

íe
z
aAc de No es prefijo viable

Pl
at
aAcd e Es prefijo viable [(4),4]

as
aAcBe Es prefijo viable [(1),1]

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Analizadores LR (predictivos)

• LR(k)

M
• Leen la entrada de izquierda a derecha (Left to rigth)

ªL
• Aplican derivaciones por la derecha para cada entrada (Right)

ui
• Utilizan k componentes léxicos de búsqueda hacia adelante.

sa
• SLR(1)
• LR(1) Sencillo.

D
íe
• Tiene menos potencia que el LR pero muy bueno para gramáticas sencillas

z
• LALR(1)

Pl
• Look Ahead LR(1): Análisis sintáctico de búsqueda hacia adelante

at
• Más potente que SLR(1) y más sencillo que LR(1).

as
• Es un compromiso entre SLR(1) y LR(1)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Elementos de un analizador LR (I)

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Elementos de un analizador LR (II)

La tabla de análisis LR será de la siguiente forma:

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Elementos de un analizador LR (III)
• En las entradas de la tabla de Acción aparecen las acciones a
realizar durante el análisis:
• Desplazar (dn): apila un terminal de la entrada en la cima de la pila y el

M
analizador se queda en el estado n

ªL
• Reducir (rn): aplica una reducción mediante la producción n, eliminando los
elementos del prefijo viable que coinciden con la derecha de la producción y

ui
los sustituye por la parte izquierda de la producción

sa
• Aceptar: Termina el análisis y la frase ha sido aceptada

D
• Error: Se detecta un error en la frase

íe
• En las entradas de la tabla de Ir_a aparecen transiciones de

z
estados que se producirán después de una reducción

Pl
• Se indica el estado n hacia el que transitar

at
as
• También aquí se detectan errores en la frase

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Elementos de un analizador LR (IV). Pila de análisis

• La pila de análisis contiene los símbolos (terminales y no


terminales que aparecen en las formas de frase de las

M
derivaciones.

ªL
• Cada símbolo va acompañado de un estado (los elementos son pares

ui
simbolo-estado)

sa
• Los estados del analizador representan los estados de la pila

D
íe
• El estado esta representado por los símbolos que se encuentran dentro de la

z
pila

Pl
• En la cima siempre aparece el estado actual

at
• Cada vez que se apila o desapila cambia el estado de la pila.

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Analizador sintáctico SLR

Analizador Sintáctico SLR(1)

M
1. Construir el autómata LR(0).

ªL
2. Construir la tabla LR (algoritmo LR)

ui
sa
3. Compactar la tabla, cuando se pueda (algoritmo LR con
eliminación de estados)

D
íe
Analizador sintáctico LR óptimo: SLR con tabla compactada

z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Construcción del autómata LR(0) (I)

• Elemento LR(0)

M
• Un elemento LR(0) es una producción con un 'punto'
en su parte derecha.
ªL
ui
sa
• A -> .aBc

D
• A -> a.Bc

íe
• A -> aB.c 4 elementos LR(0)

z
Pl
• A -> aBc.

at
• La posición del punto representa el estado de la pila de análisis.

as
•Símbolos a la izquierda- símbolos en la pila
•Símbolos a la derecha- símbolos que podrían entrar

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Construcción del autómata LR(0) (II)

• Elemento LR(0)

M
• Iniciales. Punto en el extremo izquierdo

ªL
• Aà.BC

ui
• Finales. Punto al final de la parte derecha

sa
• AàBC.
• Intermedios. Punto en cualquier lugar, excepto en el extremo izquierdo o el

D
final.

íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Construcción del autómata LR(0) (III)

• Estado del autómata LR(0)

M
ªL
Elementos finales o intermedios

ui
sa
Núcleo

D
íe
z
Resto del estado Elementos iniciales

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Construcción del autómata LR(0) (IV)

• Aristas.

M
• Unen los estados

ªL
• Representan la transición de estados

ui
• Etiquetadas con terminales o no terminales

sa
D
íe
z
Pl
at
c AàBc.d

as
AàB.cd

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo de construcción del autómata
LR(0) (I)
1. Se amplia la gramática añadiendo el símbolo S' y la producción S' -> S.

M
2. Se construye el núcleo del estado 0

ªL
S' -> .S

ui
sa
3. Para cada núcleo nuevo 'n‘. se realiza la cerradura del núcleo.
a) Se fijan los símbolos de cerradura 'c‘ (los no terminales a la derecha del punto)

D
b) Por cada símbolo de cerradura se introduce en 'n', los elementos LR(0) iniciales

íe
correspondientes a sus producciones hasta que no se pueden introducir nuevos

z
elementos en el estado

Pl
c) Para cada elemento nuevo se repite a) y b) hasta que no se pueden introducir

at
nuevos elementos.

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo de construcción del autómata
LR(0) (II)
4. Por cada estado cerrado nuevo (n) se construyen los núcleos de nuevos
estados mediante transiciones.
a) Se realiza una partición del estado:

M
ªL
i. una parte para cada símbolo de transición t (símbolo a la derecha del
punto)

ui
ii. Una, a parte, con los elementos LR(0) finales

sa
b) Para cada parte de la partición correspondiente a t se crea un núcleo nuevo

D
'm' con los elementos LR(0) de esa parte desplazando el punto a la derecha.

íe
i. Si 'm' es núcleo nuevo, se traza una arista de 'n‘ a 'm' etiquetada con ' t ' y

z
se pasa a 3.

Pl
ii. Si m ya existe, la arista se traza del estado n al ya existente etiquetada con

at
t.

as
Se repite 3 y 4 hasta que no se puedan añadir mas estados al autómata.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Ejemplo autómata LR(0)

G=( {a, b} , {S, B}, S, P )

M
ªL
P= {

ui
0. S' -> S

sa
1. S ->BB
2. B -> aB

D
íe
3. B -> b
}

z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo de construcción de la tabla LR(0) (I)

1. Se construye el autómata LR(0) para la gramática


ampliada.

M
2. Para cada estado 'n' se construye ACCION:
ªL
a) Si en n existe un elemento LR(0) A -> α.aβ con a terminal:

ui
sa
Accion[n, a] =dm
m es el estado al que llega la arista desde n etiquetada con a.

D
b) Si en n existe un elemento LR(0) A -> α. :

íe
Accion[n, b] = rm para todo b SIG(A)

z
m es la producción correspondiente al elemento.

Pl
c) Si en n existe S' -> S :

at
Accion[n, $]=Aceptar

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo de construcción de la tabla LR(0) (I)

3. Para cada estado ‘n’ se construye IR_A:


Si en n existe un elemento LR(0) A -> α.Bβ con B no terminal:

M
IR_A[n, B] = m,

ªL
siendo m el estado al que llega la arista desde n etiquetada con B.

ui
4. El resto de entradas se rellenan con 'Error‘.

sa
5. Si en la tabla hubiera conflictos la gramática no es SLR y se

D
íe
construye el analizador LR(1) (desplazamiento/reducción o

z
reducción/reducción)

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Ejemplo tabla SLR

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo General de Análisis Sintáctico LR (I)

• Representación de la información:
• accion[estado, terminal]

M
• ir_a [estado, no terminal]

ªL
• entrada (símbolo actual de la entrada)

ui
• cima (símbolo en la cima de la pila de análisis)

sa
• pan (pila de análisis)
• Funciones

D
íe
• apilar(pila, simbolos ) (introduce un o más símbolos en la pila)

z
• desapilar( pila, num) (elimina un número de elementos)

Pl
• avanzar( ) (avanza en la entrada)

at
• emitir( ) (envia a la salida la producción aplicada)

as
• error( ) (invoca a la rutina de recuperación si hay, y emite mensaje de error
• izda(prod) (símbolo de la izda. de prod.)
• dcha(prod) (símbolos de la dcha. de prod.)
• num_elem(simolos) (numero de símbolos)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo General de Análisis Sintáctico LR (I)

apilar(pan, $); apilar (pan, 0); si ir_a( [cima, izda(x)]=n)

M
mientras (accion[cima, entrada] != aceptar)

ªL
hacer entonces

ui
si (accion[cima, entrada]=dx) apilar[pan, izqda(x)];

sa
entonces apilar[pan, n];

D
apilar(pan, entrada); sino

íe
apilar(pan, x); error( );

z
avanzar( ); fin si

Pl
sino _si (accion[cima, entrada] = rx) sino

at
as
entonces error( );
desapilar(pan, fin_si
2*num_elem(dcha(x))); fin_mientras
emitir (x); aceptar();

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Ejemplo de reconocimiento
Frase: abb$ Pila Entrada Acción

$0 abb$ d3

M
$0a3 bb$ d4

ªL
a b $ S B $0a3b4 b$ r3

ui
0 d3 d4 1 2 $0a3 b$ Ir_a(3,B)=6

sa
Aceptar $0a3B6 b$ r2
1

D
$0 b$ Ir_a(0,B)=2

íe
2 d3 d4 5
$0B2 b$ d4

z
3 d3 d4 6

Pl
$0B2b4 $ r3

at
4 r3 r3 r3 $0B2 $ Ir_a(2,B)=5

as
5 r1 $0B2B5 $ r1

6 r2 r2 r2 $0 $ Ir_a(0,S)=1
$0S1 $ Aceptar

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Conflictos en una analizador SLR.

• Existen dos tipos de conflictos posibles:

M
• Desplazamiento/reducción (d/r). En un mismo estado se puede desplazar un

ªL
terminal por el que también se puede realizar una reducción.

ui
• Reducción/reducción (r/r). En un mismo estado se pueden realizar

sa
reducciones por producciones distintas para el mismo terminal.

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Detección de conflictos en el autómata LR(0)
(I)
• Conflictos desplazamiento/reducción
• En un estado ‘n’ se tienen:

M
ªL
Aàα. α (VT ∪ VN )*

ui
Bàβ.aδ β, δ (VT ∪ VN )*, a VT

sa
D
Hay conflicto si: a sig(A)
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Detección de conflictos en el autómata LR(0)
(II)
• Conflictos reducción/reducción

M
• En un estado ‘n’ se tienen:
ªL
ui
sa
Aàα. α (VT ∪ VN )*
Bàβ. β (VT ∪ VN )*

D
íe
z
Hay conflicto si: sig(A) ∩ sig(B)≠ Ø

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Ejemplos:
G=( { = , * , id } , { S, L R } , S , P )
1. S -> L=R

M
2. S -> R

ªL
3. L -> *R

ui
4. L -> id

sa
5. R -> L

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Compactación de la tabla LR

• Método independiente del analizador

M
• No incrementa la potencia de análisis

ªL
• Mejora la eficiencia del análisis al disminuir el número
ui
sa
de estados y de acciones a realizar
• Elimina estados de reducción única (estados en los que
D
íe
sólo se realizan reducciones por una misma producción)

z
• Transforma un desplazamiento seguido de una

Pl
reducción en una reducción modificada
at
as
• Reducción modificada es una reducción que elimina de
la pila un elemento menos de los que parecen en la
parte derecha de la producción (en realidad dos menos)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo de compactación de la tabla LR

1. Se seleccionan en la tabla LR los estados de reducción única

M
2. Para cada estado n seleccionado:

ªL
a. Se sustituyen los desplazamientos a n (en Acción y en Ir_a) por una

ui
reducción modificada Rm, siendo m la producción aplicada en la

sa
reducción que se realiza en el estado.
b. Se elimina el estado

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Ejemplo compactación tabla LR
a b $ S B G=( {a, b} , {S, B}, S, P )

0 d3 d4 1 2

M
P= {

ªL
1 Aceptar 0. S' -> S
1. S ->BB

ui
2 d3 d4 5 2. B -> aB

sa
3. B -> b
3 d3 d4 6

D
}

íe
4 r3 r3 r3

z
a b $ S B

Pl
5 r1
0 d3 R3 1 2

at
6 r2 r2 r2

as
1 Aceptar

2 d3 R3 R1
Los estados de reducción
única son el 4, 5 y 6 3 d3 R3 R2

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo general LR con eliminación de
estados (I)
• Representación de la información:
• accion[estado, terminal]

M
• ir_a [estado, no terminal]
entrada (símbolo actual de la entrada)

ªL

• cima (símbolo en la cima de la pila de análisis)

ui
• pan (pila de análisis)

sa
• Funciones

D
• apilar(pila, simbolos ) (introduce un o más símbolos en la pila)

íe
• desapilar( pila, num) (elimina un número de elementos)

z
• avanzar( ) (avanza en la entrada)

Pl
• emitir( ) (envia a la salida la producción aplicada)

at
• error( ) (invoca a la rutina de recuperación si hay, y emite mensaje de error

as
• izda(prod) (símbolo de la izda. de prod.)
• dcha(prod) (símbolos de la dcha. de prod.)
• num_elem(simolos) (numero de símbolos)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
apilar(pan, $); apilar (pan, 0);
mientras (accion[cima, entrada] != aceptar)
hacer
si (accion[cima, entrada]=dx)
entonces
apilar(pan, entrada);
apilar(pan, x);
avanzar( );

M
sino _si (accion[cima, entrada] = rx)

ªL
entonces

ui
desapilar(pan,2*num_elem(dcha(x)));

sa
emitir (x);
si (ir_a[cima, izquierda(x)]=”error”) entonces

D
error( );

íe
sino

z
mientras (ir_a[cima, izquierda(x)]=Rx) hacer

Pl
desapilar(pan, 2 *num_elem(dcha(x)) – 2)

at
fin mientras; aux=cima;

as
fin si
apilar(pan, izquierda(x)); apilar(pan,ir_a[aux,izquierda(x)]);

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
sino_si (accion[cima, entrada] = Rx)
entonces
desapilar(pan,num_elem(dcha(x)));
emitir (x);
avanzar();
si (ir_a[cima, izquierda(x)]=”error”) entonces
error( );

M
ªL
sino
mientras (ir_a[cima, izquierda(x)]=Rx) hacer

ui
sa
desapilar(pan, 2 *núm._elem(dcha(x)) – 2)
fin mientras; aux=cima;

D
íe
fin si

z
apilar(pan, izquierda(x)); apilar(pan,ir_a[aux,izquierda(x)]);

Pl
at
sino

as
error( );
fin_si
fin_mientras
aceptar();
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Ejemplo de reconocimiento
Pila Acción Entrada

Frase: abb$
$0 d3 abb$
a b $ S B

M
$0a3 R3 (avanza y elimina bb$
0)

ªL
0 d3 R3 1 2

ui
Aceptar
$0a3 Ir_a(3,B)=R2 b$
1 (elimina 2, no

sa
2 d3 R3 R1 avanza)

D
$0 Ir_a(0,B)=2 b$
3 d3 R3 R2

íe
z
$0B2 R3(avanza y elimina b$

Pl
0)

at
0. S' -> S $0B2 Ir_a(2,B)=R1 $

as
1. S ->BB (elimina 2, no
2. B -> aB avanza)
3. B -> b $0 Ir_a(0,S)=1 $
$0S1 Aceptar $

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Ejemplos de gramáticas
• G=( {a,b} , {S, A} , S , P )
P={
1. S -> AS

M
2. S -> b

ªL
3. A -> SA

ui
sa
4. A -> a}
• G=( { + , * , ( , ) , num , ; } ,

D
{ S , E , E' , T , T' , F } , S , P )

íe
z
Pl
P={ 1. S -> E; 6. T -> FT'

at
2. E -> TE' 7. T' -> *FT'

as
3. E -> λ 8. T' -> λ
4. E' -> +TE' 9. F -> (E)
5. E' -> λ 10. F -> num }

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Analizador LR(1)
• Es más potente que el SLR.
• Se debe de construir cuando aparecen conflictos en el SLR

M
• Considera el contexto de aplicación de las producciones.

ªL
• Generalmente, es transformado un LALR por tener menos estados.

ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Construcción del analizador sintáctico LR

Analizador Sintáctico SLR(1)

M
1. Construir el autómata LR(1).

ªL
2. Construir la tabla LR (algoritmo LR)

ui
sa
3. Compactar la tabla, cuando se pueda (algoritmo LR con
eliminación de estados)

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Construcción del autómata LR(1) (I)

• Elemento LR(1)

M
• Un elemento LR(1) es un par formado por un
ªL
elemento LR(0) y una lista de símbolos de anticipación

ui
(look-ahead)
sa
D
íe
• [A -> .aBc, a]

z
• [A -> a.Bc, b|$] 4 elementos LR(1) a, b Vt

Pl
• [A -> aB.c ,a ]

at
• [A -> aBc.,a]

•Los símbolos de anticipación son los terminales para los que se as


realizarán las reducciones cuando el elemento LR(0) asociado sea final.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Construcción del autómata LR(1) (II)

• Estado del autómata LR(1)

M
ªL
Elementos finales o intermedios

ui
sa
Núcleo

D
íe
z
Resto del estado Elementos iniciales

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Construcción del autómata LR(1) (III)

• Aristas.

M
• Unen los estados

ªL
• Representan la transición de estados

ui
• Etiquetadas con terminales o no terminales

sa
D
íe
z
Pl
at
c AàBc.d, a

as
AàB.cd,a

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo de construcción del autómata
LR(1) (I)
1. Se amplia la gramática añadiendo el símbolo S' y la producción S' -> S.

M
2. Se construye el núcleo del estado 0

ªL
[S' -> .S, $]

ui
sa
3. Para cada núcleo nuevo 'n‘,se realiza la cerradura del núcleo.
a) Se fijan los símbolos de cerradura ‘B‘ (los no terminales a la derecha del punto)

D
b) Para cada símbolo de cerradura B, si tenemos [A -> a.Bβ, a] se añaden

íe
los LR(0) iniciales de B y como símbolos de anticipación los terminales

z
pertenecientes a Prim(βa)

Pl
B -> .___, PR(βa)

at
as
c) Para cada elemento nuevo se repite a) y b) hasta que no se pueden
introducir nuevos elementos al estado

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo de construcción del autómata
LR(1) (II)
4. Por cada estado cerrado nuevo (n) se construyen los núcleos de nuevos
estados mediante transiciones.
a) Se realiza una partición del estado:

M
ªL
i. una parte para cada símbolo de transición t (símbolo a la derecha del
punto)

ui
ii. Una, a parte, con los elementos que tengan LR(0) finales

sa
b) Para cada parte de la partición correspondiente a t se crea un núcleo nuevo

D
'm' con los elementos LR(0) de esa parte desplazando el punto a la derecha.

íe
sin que se produzca cambio alguno en el símbolo de anticipación

z
i. Si 'm' es núcleo nuevo, se traza una arista de 'n‘ a 'm' etiquetada con ' t ' y

Pl
se pasa a 3.

at
ii. Si m ya existe, la arista se traza del estado n al ya existente etiquetada con
t.

as
Se repite 3 y 4 hasta que no se puedan añadir mas estados al autómata.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Ejemplo autómata LR(1)

1. S -> L=R

M
2. S -> R

ªL
3. L -> *R

ui
sa
4. L -> id

D
5. R -> L

íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo de construcción de la tabla LR(1) (I)

1. Se construye el autómata LR(1) para la gramática


ampliada.

M
2. Para cada estado 'n' se construye ACCION:
ªL
a) Si en n existe un elemento LR(1) [A -> α.aβ,b] con a terminal:

ui
sa
Accion[n, a] =dm
m es el estado al que llega la arista desde n etiquetada con a.

D
b) Si en n existe un elemento LR(1) [A -> α.,b] :

íe
Accion[n, b] = rm

z
m es la producción correspondiente al elemento.

Pl
c) Si en n existe [S' -> S,$] :

at
Accion[n, $]=Aceptar

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo de construcción de la tabla LR(1) (I)

3. Para cada estado ‘n’ se construye IR_A:


Si en n existe un elemento LR(0) [A -> α.Bβ,b] con B no terminal:

M
IR_A[n, B] = m,

ªL
siendo m el estado al que llega la arista desde n etiquetada con B.

ui
4. El resto de entradas se rellenan con 'Error‘.

sa
5. Si en la tabla hubiera conflictos la gramática no es LR y no puede

D
íe
ser analizada por otro analizador más potente. (Los conflictos

z
pueden ser tratados)

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
1. S -> L=R
2. S -> R
3. L -> *R
4. L -> id
5. R -> L

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Conflictos en una analizador LR.

• Existen dos tipos de conflictos posibles:

M
• Desplazamiento/reducción (d/r). En un mismo estado se puede desplazar un

ªL
terminal por el que también se puede realizar una reducción.

ui
• Reducción/reducción (r/r). En un mismo estado se pueden realizar

sa
reducciones por producciones distintas para el mismo terminal.

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Detección de conflictos en el autómata LR(1)
(I)
• Conflictos desplazamiento/reducción
• En un estado ‘n’ se tienen:

M
ªL
[Aàα. ,b1|..|bn] α (VT ∪ VN )*

ui
[Bàβ.aδ ,c] β, δ (VT ∪ VN )*, a VT

sa
D
Hay conflicto si a !{b1,b2,…,bn}

íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Detección de conflictos en el autómata LR(1)
(II)
• Conflictos reducción/reducción

M
• En un estado ‘n’ se tienen:
ªL
ui
sa
Aàα. ,b1|..|bn α (VT ∪ VN )*
Bàβ. ,c1|..|cn β (VT ∪ VN )*

D
íe
z
Hay conflicto si: {b1,..,bn} ∩ {c1,…,cn}≠ Ø

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Ejemplo de una gramática con conflictos en
LR(1)
•G=( {a,b} , {S, A} , S , P )
M
ªL
P={

ui
1. S -> AS
sa
D
2. S -> b
íe
z
3. A -> SA
Pl
at
4. A -> a}
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Analizador LALR
• Tiene la misma potencia que el LR(1)
• Es más eficiente porque es más rápido en el análisis porque tiene menos

M
estados

ªL
• Se unifican estados con los mismos elementos LR(0)

ui
• El analizador LALR con tabla compactada es el analizador óptimo(si no

sa
es SLR)

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Corazón de un estado LR(1)

• El corazón de un estado LR(1) esta formado por los elementos LR(0)

M
del núcleo

ªL
ui
sa
D
íe
z
El corazón del estado es:

Pl
SàL=.R

at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Algoritmo de construcción del analizador
LALR
1. Se construye el autómata LR(1)
2. Se crean grupos con los estados que tengan el mismo

M
corazón
ªL
ui
3. Por cada grupo de estados:

sa
a) Se unifican todos los estados del grupo sobre el primero de los

D
que pertenecen al grupo

íe
b) El estado unificado tendrá el mismo corazón y elementos LR(0)

z
que todos los del grupo

Pl
c) El estado unificado tendrá como símbolos de anticipación la

at
as
unión de todos los símbolos de anticipación de todos los
estados del grupo
4. Toda arista que saliese o entrase en algún estado del
grupo, saldrá o entrara en el unificado
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Recuperación de errores en un analizador LR

En Modo Pánico
• Se detecta un error
• Se invoca a a rutina del analizador de errores.

M
Rutina
ªL
ui
1. Se guarda el estado de la pila de analisis.

sa
2. Se desapila la pila de análisis y se intenta seguir el análisis:

D
a) Si se puede seguir => Recuperado.

íe
b) Sino se vuelve a 2.

z
Pl
3. Se repite este proceso hasta vaciar la pila.

at
4. Si la pila se vacía entonces se recupera el estado de la pila guardado en 1

as
y se avanza en la entrada intentando seguir el análisis.
1. Si se puede seguir entonces se recupera.
2. Sino, se vuelve a 2
5. Si la entrada también se vacía entonces el error no se recupera.
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
$0 error, pila vacía se babbaac$
1. S -> AbAc
desapila entrada
2. A -> BcD
3. A -> a
$0 R3 abbaac$
4. B -> Ab
5. D -> Aa babbaac$
$0A2 d5 bbaac$

M
$0A2b5 error, guarda estado baac$
a b c $ S A B D
$0A2b5 y desapila

ªL
0 R3 1 2 3

ui
1 ac.
$0A2 d5, se recupera baac$

sa
2 d5
3 d6 $0A2b5 R3 aac$

D
5 R3 r4 7 3 $0A2b5A7 error, guarda estado ac$

íe
6 R3 9 3 R2 $0A2b5A7 y desapila

z
7 R4 R1

Pl
9 R5 R4

at
as
$0A2b5 R3 se recupera ac$

$0A2b5A7 R1 c$

$0S1 aceptar $
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
M
ªL
ui
Procesadores de Lenguajes I
sa Análisis Sintáctico
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico ascendente M. Luisa Díez
Platas
Resumen del tema

• Tipos de análisis sintáctico.

M
• Elementos de un analizador

ªL
• Análisis sintáctico descendente

ui
sa
• Análisis descendente recursivo
• Análisis LL(1)

D
íe
• Análisis sintáctico ascendente

z
• Análisis de precedencia

Pl
• Análisis LR

at
• Generadores de analizadores LR. YACC

as
• Sintaxis
• Funcionamiento interno

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Características y funciones de un analizador
sintáctico (I)
• El analizador sintáctico construye una representación intermedia
del programa analizado.

M
ªL
• Construye un árbol de análisis a partir de los componentes léxicos que
recibe, aplicando las producciones de la gramática con el objeto de

ui
comprobar la corrección sintáctica de las frases.

sa
• Comprueba que el orden en que el analizador léxico le va

D
entregando los componentes léxicos es válido:

íe
z
• Para ello verifica que la cadena pueda ser generada por la gramática del

Pl
lenguaje fuente.

at
as
• Informar acerca de los errores de sintaxis, recuperándose de los
mismos (si es posible) para continuar procesando la entrada.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Características generales
• Los analizadores ascendentes son más potentes que los descendentes.
• Pueden manejar gramáticas recursivas a izquierdas.

M
• Los algoritmos de implementación son más complejos que los de los métodos

ªL
ascendentes.
• La implementación “a mano” de estos algoritmos es demasiado compleja y generalmente

ui
se utilizan generadores automáticos.

sa
D
íe
z
Pl
at
as
Gramáticas G. Indep.
LR(1) LL(1)
del
Contexto

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Características y funciones de un
analizador sintáctico (II)
• La salida del analizador sintáctico es una representación en
forma de árbol sintáctico de la cadena de componentes léxicos

M
producida por el analizador léxico

ªL
ui
sa
D
íe
z
Cadena de Analizador Árbol sintáctico

Pl
componentes léxicos sintáctico

at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Características y funciones de un
analizador sintáctico (III)
• El compilador se diseña de forma que el analizador léxico se
convierte en una rutina del sintáctico al que solicita los

M
componentes léxicos que necesita

ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Características y funciones de un analizador
sintáctico (IV). Criterios de diseño
• Eficiente: el tiempo de análisis debe ser proporcional al

M
tamaño del archivo.

ªL
ui
sa
• Predictivo: Debe decidir la acción a realizar conociendo un
número mínimo de componentes léxicos de la entrada.

D
íe
z
Pl
• Sin retrocesos: La acción a realizar se decide con exactitud

at
sin que se pueda dar lugar a retrocesos en el análisis.

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Características y funciones de un analizador
sintáctico (V). Métodos de implementación
• Existen dos formas de implementar una analizador

M
sintáctico:

ªL
1. Utilizando un lenguaje de programación, a través de una serie de

ui
técnicas que se explicarán mas adelante.

sa
• Complejidad, pero mayor control sobre su eficiencia.

D
íe
z
2. Utilizando un generador de analizadores sintácticos, como YACC.

Pl
• Sencillez, aunque más difícil de mantener y menor control sobre la eficiencia del

at
código generado.

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Tipos de analizadores sintácticos
• Analizadores sintácticos descendentes (Top-down)
• Construyen el árbol sintáctico de la raíz (arriba) a las hojas (abajo).

M
ªL
• Parten del símbolo inicial de la gramática (axioma) y van expandiendo
producciones hasta llegar a la cadena de entrada.

ui
• Se conocen como analizadores LL (left-left), porque leen la entrada de izquierda

sa
a derecha y aplican las producciones por la izquierda

D
• Analizadores sintácticos ascendentes (Bottom-up)

íe
z
• Construyen el árbol sintáctico comenzando por las hojas.

Pl
• Parten de los terminales de la entrada y mediante reducciones llegan hasta el

at
símbolo inicial.

as
• Se conocen como analizadores LR (left-right), porque leen la entrada de
izquierda a derecha y aplican las producciones por la derecha

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Características generales
• Comprueban si una cadena de símbolos pertenece a un lenguaje aplicando
reducciones sobre la cadena de entrada hasta alcanzar el símbolo inicial de la

M
gramática.

ªL
• En general son más potentes que los métodos descendentes.
• Pueden manejar gramáticas recursivas a izquierdas.

ui
• Los algoritmos de implementación son más complejos que los de los métodos

sa
ascendentes.

D
• La implementación “a mano” de estos algoritmos es demasiado compleja y generalmente
se utilizan generadores automáticos.

íe
z
Pl
at
as
Gramáticas G. Indep.
LR(1) LL(1)
del
Contexto

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Tipos de analizadores sintácticos. Ejemplo de
análisis(I)
• Gramática del lenguaje que se quiere analizar:

M
ªL
ui
G=( {+, *, ID, ( , ) } , {E , T , P} , E , P )

sa
(1) E -> E+T

D
(2) E -> T

íe
(3) T -> T*P

z
(4) T -> P

Pl
(5) P -> ID

at
(6) P -> ( E )

• Frase que se quiere analizar: ID + ( ID * ID ) as


Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Tipos de analizadores sintáctico. Ejemplo de análisis
(II).Analizadores descendentes
• Construyen el árbol de análisis sintáctico partiendo del símbolo inicial y
aplicando las producciones mediante derivaciones por la izquierda
(expanden el símbolo más a la izquierda)

M
ªL
ui
sa
D
Las producciones aplicadas han sido:

íe
(1),(2),(4),(5),(4),(6),(2),(3),(4),(5),(5)

z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Tipos de analizadores sintáctico. Ejemplo de análisis
(III).Analizadores ascendentes
• Construyen el árbol partiendo de la frase a reconocer y aplicando las
producciones mediante reducciones hasta llegar al símbolo inicial de la
gramática.

M
ªL
ui
Las producciones aplicadas son:

sa
(5) (4) (2) (5) (4) (5) (3) (2) (6) (4) (1)

D
íe
z
Si se hubiesen aplicado las

Pl
producciones desde la raiz por la

at
derecha, se habrían aplicado:

as
(1) (4) (6) (2) (3) (5) (4) (5) (2) (4) (5)
justo en orden inverso que como las
ha aplicado el ascendente

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Elementos de un analizador sintáctico(I).

• Los analizadores sintácticos utilizan:

M
• La gramática del lenguaje que van a analizar

ªL
• Una rutina de recuperación de errores

ui
sa
• Elementos propios del método de análisis utilizado (pilas de
análisis, etc.)

D
íe
• La tabla de símbolos

z
• Método para manejar y calcular atributos asociados a los

Pl
distintos elementos de la gramática (terminales y no

at
terminales)

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Gramática independiente del contexto

• Los analizadores sintácticos necesitan una gramática


independiente del contexto que describa el lenguaje a analizar:

M
ªL
G = (Vt, Vn, S, P)

ui
Vt- Símbolos terminales o componentes léxicos

sa
Vn- Símbolos no terminales

D
íe
S- Axioma de la gramática

z
P- Producciones que deben ser de la forma:

Pl
at
Aàβ, donde A∊Vn y β ∊(Vn ∪ Vt)*

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Problemas debidos a la construcción de las reglas
• Ambigüedad (dos arboles de derivación distintos para la misma frase)
• Gramáticas con ciclos
SàA

M
AàS

ªL
Sàa

Solución:eliminar ciclos( no usar reglas de redenominación - antecedente y consecuente con un único

ui
no terminal)

sa
• Gramáticas con caminos alternativos

D
SàA
SàB

íe
AàB

z
Solución:eliminar alternativas ( no usar reglas de redenominación - antecedente y consecuente con un

Pl
único no terminal)

at
• Reglas recursivas con ε o no terminales que derivan en ε
SàABS

as
Aàa| ε
Bàb| ε

Solución:eliminar las reglas con ε ( no usar reglas de redenominación - antecedente y consecuente con
un único no terminal)
• Reglas con consecuente con el comienzo y final común
SàA..A

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Problemas debidos a la construcción de las reglas

• Gramáticas con expresiones y operadores


EàE+E

M
EàE*E

ªL
Solución: definición de la precedencia y asociatividad de operadores

ui
sa
• Recursividad por la izquierda
A->Aa|b

D
íe
z
Solución: eliminación de la recursividad

Pl
• Reglas con partes comunes al principio de los consecuentes en reglas

at
con el mismo antecedente

as
A->bA|bB

Solución: factorización de la gramática

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Manejador de errores.

• Para los analizadores sintácticos es necesario implementar un

M
manejador de errores cuyas funciones deberían ser:

ªL
1. Informar de los errores con claridad y exactitud.

ui
2. Recuperar el error para que el análisis pueda continuar detectando

sa
errores posteriores

D
3. No retrasar el procesamiento de programas correctos

íe
4. Corregir el error si es posible

z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores

• Los objetivos de las rutinas de recuperación de

M
errores suelen ser:
ªL
1. Localizar el error.

ui
sa
2. Corregir el error si es posible (no se suele hacer).

D
3. Recuperar el error(revisando la configuración de la

íe
entrada y la del analizador).

z
4. Permitir que el análisis continúe.

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores. Tipos
(I)
• En Modo de pánico
• Deshecha componentes léxicos de la entrada hasta que el análisis puede

M
seguir.

ªL
• Ventajas

ui
• Sistema general de detección de errores.

sa
• Sencillez de implementación.

D
• Garantizada contra lazos (bucles) infinitos.

íe
• Adecuado para los casos en los que no es habitual que se produzcan

z
varios errores dentro de la misma frase.

Pl
at
• Inconvenientes

as
• Omite el análisis de muchos componentes léxicos.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores.
Tipos (II)
• Recuperación en un nivel de frase
• Esta rutina se basa en la realización de una corrección local de la entrada

M
restante, es decir, tiende a sustituir un prefijo de la entrada que queda por

ªL
leer por una cadena que permita continuar el análisis.

ui
• Ventajas.

sa
• Puede 'supuestamente' corregir cualquier error.

D
• Inconvenientes

íe
• El diseñador del compilador se encarga de elegir la corrección a realizar

z
('grava' mucho el analizador).

Pl
• Puede caer en lazos infinitos.

at
as
• No puede afrontar situaciones en las que el error se produce antes del
punto de detección.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores. Tipos (III)

• Producciones de Error
• Amplia la gramática con producciones que generan y reconocen las

M
construcciones erróneas mas frecuentes.

ªL
• Nos permite informar del error exactamente sin detener el analizador.

ui
• Se suele usar en combinación con otros tipos de rutinas

sa
• Ventajas

D
• No detiene el análisis.

íe
• Informa bien de los errores.

z
• “Podría” corregir....

Pl
• Inconvenientes

at
• No detecta todos los errores sintácticos

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores. Tipos
(IV)
• Método de corrección global

M
• Solo tiene interés desde un punto de vista teórico.

ªL
• Está basada en el método de mínima distancia de corrección de un

ui
error. Pretende sustituir una frase incorrecta por otra correcta a la

sa
que se llegue realizando a la frase original un número pequeño de
transformaciones.

D
íe
• Ventajas

z
• Corrige

Pl
• Inconvenientes

at
• Necesita almacenar mucha información (todas las frases posibles)

as
• Realizaría muchas comparaciones
• Casi imposible de implementar

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores. Tipos
(V)
• Método de corrección global

M
• Solo tiene interés desde un punto de vista teórico.

ªL
• Está basada en el método de mínima distancia de corrección de un

ui
error. Pretende sustituir una frase incorrecta por otra correcta a la

sa
que se llegue realizando a la frase original un número pequeño de
transformaciones.

D
íe
• Ventajas

z
• Corrige

Pl
• Inconvenientes

at
• Necesita almacenar mucha información (todas las frases posibles)

as
• Realizaría muchas comparaciones
• Casi imposible de implementar

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Gramáticas de atributos

• Es un método de implementación que se utiliza para poder

M
calcular información(atributos) asociada a los símbolos de la

ªL
gramática y pasarla de unos a otros.

ui
• Se utiliza para realizar el análisis semántico y la generación

sa
de código intermedio simultáneamente al análisis sintáctico

D
íe
• Consiste en una gramática convencional que ha sido

z
ampliada con acciones semánticas asociada a cada

Pl
producción para calcular y pasar la información de los

at
símbolos.

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Gramáticas de atributos. Tipos de atributos
(I)
• Atributos heredados. Se calculan para un símbolo que se

M
encuentra en la derecha de una producción a partir de los

ªL
atributos del símbolo de la izquierda (padre) y de el resto de

ui
símbolos de la derecha o hermanos.

sa
X à Y1Y2…Ym…Yn

D
Ym.a = F(X.a , Y1.a , Y2.a , ... , Ym-1.a , Ym+1.a , ... , Yn.a)

íe
• L-atributos . Son atributos heredados que sólo se calculan para un

z
símbolo a partir del atributo del padre y de sus hermanos a la

Pl
izquierda de él.

at
as
X à Y1Y2…Ym…Yn
Ym.a = F(X.a , Y1.a , Y2.a , ... , Ym-1.a)
• Se suelen usar en los analizadores descendentes.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Gramáticas de atributos. Tipos de
atributos (II)
• Atributos sintetizados. Son los que se calculan para el símbolo padre

M
(el de la izquierda) a partir de los atributos de sus hijos.

ªL
X à Y1Y2…Yn

ui
X.a = F(,Y1.a , Y2.a , ... , Yn.a)

sa
D
íe
• Se utilizan fundamentalmente en los analizadores ascendentes

z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Gramáticas de atributos. Ejemplo(I)
• Ejemplo en el que se usan los atributos para

M
comprobar un error semántico. Se almacena la lista
ªL
de variables declaradas y se comprueba que en las
ui
sa
sentencias se usan variables declaradas y sino da
error
D
íe
• Se usan atributos heredados y sintetizados

z
Pl
• Se construye el árbol de análisis

at
• Se recorre en ascendente en una parte y en descendente en

as
otra.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Gramáticas de atributos. Ejemplo(II)
G=( {var, ; , : , = , ID , .. ) } , { P , D , S , V , E , ..} , P , Prod )

M
ªL
(1) P -> DS

ui
(2) D -> var ID ; D

sa
(3) D -> λ

D
íe
(4) S -> V := E ; S

z
Pl
(5) S -> λ

at
(6) V -> ID

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Gramáticas de atributos. Ejemplo(III)

• Usaremos dos tipos de atributos:


• Lista: Lista de variables declaradas

M
ªL
• Nombre: Lexema de los Identificadores.
• El atributo lista se maneja en ascendente y descendente y el nombre solo como

ui
heredado

sa
• Lo primero va a ser hacer el árbol sintáctico y después lo

D
decoraremos con información (los atributos).

íe
• El “programa” a analizar:

z
Pl
at
var id ; //el id corresponden a (x)

as
id := ----- //x :=
id := ----- //y:=

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Gramáticas de atributos. Ejemplo(IV)

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Gramáticas de atributos. Ejemplo(V)

M
ªL
ui
sa
D
íe
z
Pl
at
as

Procesadores de Lenguajes I. Análisis sintáctico ascendente M. Luisa Díez Platas


Análisis sintáctico descendente

• Métodos que parten del axioma y, mediante

M
derivaciones por la izquierda, tratan de generar la
ªL
entrada.
ui
sa
• Existen dos formas de implementarlos: mediante

D
recursividad o mediante métodos predictivos.

íe
z
• En la práctica no se emplea nunca el recursivo (o

Pl
con retroceso) debido a diversos inconvenientes.
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Análisis descendente recursivo
• Mediante un método de backtracking se van probando todas las
opciones de expansión para cada no-terminal de la gramática

M
hasta encontrar la correcta.

ªL
ui
sa
• Si el terminal obtenido como consecuencia de probar con una
opción de las varias posibles para una producción no coincide

D
con el componente léxico leído en la entrada, hay que

íe
retroceder.

z
Pl
at
• Cada retroceso en el árbol sintáctico puede tener asociado un

as
retroceso en la entrada ya que se deben de eliminar todos los
terminales y no terminales correspondientes a la producción
que se “elimina” del árbol.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis descendente recursivo. Algoritmo
1. Se colocan las reglas en orden arbitrario.

M
2. Se crea el nodo inicial con el axioma y se considera nodo activo.

ªL
3. Para cada nodo activo A:

ui
• Si A es un no-terminal, se aplica la primera producción asociada a A.

sa
• El nodo activo pasa a ser el hijo izquierdo.
• Cuando se terminan de tratar todos los descendientes, el siguiente nodo activo es el
siguiente hijo por la derecha.

D
íe
• Si A es un terminal:

z
• Si coincide el símbolo de la entrada, se avanza en la entrada y el nodo activo pasa a ser el

Pl
siguiente “hermano” de A.
• Si no, se retrocede en el árbol hasta el anterior no-terminal (y en la entrada si entre los

at
símbolos de la producción que se elimina existe algún no terminal) y se prueba la siguiente

as
producción. Si no hay más producciones para probar, se retrocede hasta el anterior no-
terminal y se prueba con la siguiente opción de éste.

4. Si se acaban todas las opciones del nodo activo, error sintáctico. Si por el
contrario se encuentra un árbol para la cadena de entrada, éxito.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis descendente recursivo.
Inconvenientes
• No puede tratar gramáticas con recursividad a izquierdas.

M
A

ªL
AàAbc Entra en un

ui
A b c bucle infinito

sa
A b c

D
• Como consecuencia del retroceso necesita almacenar los componentes léxicos ya

íe
reconocidos por si es necesario volverlos a tratar.

z
Pl
• Cuando un analizador sintáctico se utiliza para comprobar la semántica y generar

at
código, cada vez que se expande una regla, se ejecuta una acción semántica. Al
retroceder esa regla o producción se deben deshacer las acciones semánticas lo que

as
no es fácil ni siempre posible.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis descendente recursivo. Ejemplos

• Ejemplo 1 Frase: aba$

M
G=({a,b,c} , {S, A} , S , P ) Un retroceso

ªL
P = { 1. S -> aAc
• Ejemplo 3

ui
2. A -> Ab
G=( {a, b} , {S, A, B} , S , P )

sa
3. A -> λ }
P= {
Frase: abbc$

D
1. S -> Aa
Recursividad por la izda., entra en bucle

íe
infinito 2. A -> aA

z
3. A -> aB
• Ejemplo 2

Pl
4. A -> a
G=( {a, b} , {S, A} , S , P )

at
5. B -> b
P= {

as
}
1. S -> Aa Frase: aaba$
2. S -> Ab Muchos retrocesos
3. A -> aA
4. A -> b }

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis descendente predictivo
• Decide la siguiente producción a aplicar con sólo leer un número fijo y
pequeño de componentes léxicos de la entrada, generalmente uno.

M
• Este tipo de analizadores se denomina LL(k)

ªL
• Leen la entrada de izquierda a derecha (Left to rigth)

ui
• Aplican derivaciones por la izquierda (Left)

sa
• Utilizan sólo k componentes léxicos de la entrada para predecir la dirección del análisis

D
• El más utilizado es el LL(1)

íe
• Sólo necesita un componente léxico para decidir la producción a aplicar.

z
• No realizan retrocesos y se conocen como dirigidos por tablas

Pl
• Se construye una tabla de análisis que contiene la información necesaria para decidir la

at
producción a aplicar con exactitud.

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Análisis descendente predictivo.
Elementos

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Análisis descendente predictivo.
Tabla de análisis LL(1)

M
ªL
ui
sa
D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Analizadores LL(1). Propiedades de las
gramáticas
• No todas las gramáticas se pueden analizar mediante

M
métodos descendentes predictivos.

ªL
ui
sa
• Para determinar si a una gramática se le puede aplicar
el método LL, debe comprobarse que:

D
íe
1. No es recursiva por la izquierda

z
2. Si existe un conjunto de reglas de la forma Aà a 1 | a2 | ... |an, es posible decidir la

Pl
opción a escoger mirando k componentes léxicos de la entrada.

at
as
• Para probar la segunda condición y construir la tabla
de analisis LL(1), se construyen dos conjuntos: primero
y siguiente.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Analizador LL(1).Conjunto primero(I)
• Dado un símbolo de la gramática A, su conjunto primero es el conjunto de
terminales por los que comienza cualquier frase que se genere a partir de A

M
aplicando las producciones mediante derivaciones por la izquierda.

ªL
• Algoritmo de cálculo del conjunto primero:

ui
1. Si A Î Vt => Prim(A) = A

sa
2. Si A Î Vn:

D
a. Si $ A à λ => λ Î Prim(A)

íe
b. Si $ A à Y1, Y2, ...,Yn => {Prim(Y1) - λ} Î Prim(A)

z
• Desde i=2 hasta n :

Pl
• Si λ Î Prim (Yi-1) => {Prim (Yi) – λ} Î Prim(A)

at
• Si no, se acaba la construcción

as
Fin del desde
Si "i , λ Î Prim(Yi) => λ Î Prim(A)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Conjunto primero. Ejemplo:
G=( {i , + , * , ( , ) , num ) , {S, E, E', T, T' , F} ,
S , P }

M
Prim(S)={(,num,;}

ªL
1. S -> E; Prim(E)={(,num, λ}
2. E -> TE'

ui
Prim(E’)={+, λ}

sa
3. E -> λ Prim(T)={(,num}
4. E' -> +TE'

D
Prim(T’)={*, λ}

íe
5. E' -> λ Prim(F)={(,num}

z
6. T -> FT'

Pl
7. T' -> *FT'

at
8. T' -> λ

as
9. F -> (E)
10. F -> num

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Analizador LL(1). Conjunto primero(II)

• Conjunto primero de una frase α

M
Sea α= X1 X2…Xn
ªL
1. Prim(α)=Prim(X1)- λ

ui
sa
2. Desde i=2 hasta n:

D
• Si λ Î Prim(Xi-1),entonces Prim(Xi)- λ Î Prim(α).

íe
• Si no, se termina la construcción del conjunto

z
3. Si λ Î Prim (Xn), entonces λ Î Prim(α)

Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Analizador LL(1). Conjunto siguiente

• Dado un símbolo A, su conjunto siguiente es el

M
conjunto de terminales que aparecen

ªL
inmediatamente después de A en alguna sentencia

ui
por la que se pasa al realizar una derivación por la

sa
izquierda

D
• Algoritmo:

íe
1. Sig (S) = $, siendo S el axioma.

z
2. Para cada símbolo no-terminal A de la gramática, añadir

Pl
elementos aplicando las siguientes reglas:

at
• Si $ X à aAB => {Prim(B) – λ } Î Sig(A)

as
• Si ($ B à aA) Ú (B à aAC Ù λ Î Prim(C)) => Sig (B) Î Sig
(A)
• λ nunca es elemento de un conjunto siguiente.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Conjunto siguiente. Ejemplo.

G=( {i , + , * , ( , ) , num ) , {S, E, E', T, T' ,10. F -> num

M
F} , S , P }

ªL
ui
1. S -> E;

sa
2. E -> TE' Sig(S)={$}

D
3. E -> λ Sig(E)={ ; , ) }

íe
4. E' -> +TE'

z
Sig(E’)={ ; , ) }

Pl
5. E' -> λ Sig(T)={ + , ; , ) }

at
6. T -> FT' Sig(T’)={ + , ; , ) }

as
7. T' -> *FT' Sig(F)={* , + , ; , ) }
8. T' -> λ
9. F -> (E)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Algoritmo de construcción de la tabla LL(1)

Se construye una tabla indexada en las filas por los no

M
terminales de la gramática y en las columnas por los terminales

ªL
y el $. Las entradas se rellenan según lo siguiente:

ui
Para cada producción de la forma A → α :

sa
1. Para todo terminal “t” perteneciente a Prim(α) hacer:

D
• T [A,t] = A → α

íe
z
Si λ Î Prim(α) hacer:

Pl
2.
" t Î sig(A), M [A,t] = A → α

at

as
3. Las entradas no marcadas (vacías) corresponden a errores
sintácticos.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Tabla LL(1). Ejemplo

G=( {i , + , * , ( , ) , num ) , {S, E, E', T, T' , F} , S , P }

M
ªL
1. S -> E;

ui
2. E -> TE'

sa
3. E -> λ

D
4. E' -> +TE'

íe
z
5. E' -> λ

Pl
6. T -> FT'

at
7. T' -> *FT'

as
8. T' -> λ
9. F -> (E)
10. F -> num

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Analizadores LL(1). Propiedades de las
gramáticas
1. Una gramática es LL1 si y sólo si no es recursiva por la izquierdas

M
2. Si y solo si para cada conjunto de producciones de la forma,

ªL
A à a1| a2| ...| an, se cumple que:

ui
sa
a. No hay dos partes derechas que comiencen por un mismo terminal:

D
íe
Prim (ai) Ç Prim (aj) = { }, " i ¹ j

z
Pl
at
b. A lo sumo un ai puede derivar la cadena vacía λ.

as
c. Si un ai => λ, entonces no hay otro aj que comience por un elemento que esté
en Siguiente(A):

Prim (aj) Ç Sig (A) = { }

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis LL(1). Ejemplos:

G=( { if , then , else , a , b , ... } , { S, C } , S , P )

M
P={ 1. S -> if C then S else S

ªL
2. S -> if C then S

ui
sa
3. S -> a
4. C -> b

D
íe
}

z
• Esta gramática no cumple la propiedad 2a, por lo que se debe factorizar.

Pl
at
• Después de la transformación, ocurre que no cumple la propiedad 2c,

as
luego esta gramática no es LL(1).

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis LL(1). Ejemplos:

G=( { a , b , c , d , e } , { S , A , B , C } , S , P )

M
P={

ªL
1. S -> aAa

ui
2. S -> cb

sa
3. A -> Ac

D
4. A -> B

íe
z
5. B -> dbc

Pl
6. B -> C

at
7. C -> Cd

as
8. C -> e
}
• No es LL(1) porque es recursiva por la izquierda

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis LL(1). Ejemplos (eliminación de la
recursividad por la izquierda)
• Alguna de las siguientes producciones del símbolo A son recursivas por la

M
izquierda

ªL
A -> Ab|Ac|B1|B2|….|Bn

ui
• Se deben transformar creando un nuevo símbolo A’, de la siguiente

sa
manera:

D
A -> B1A’|B2A’|….|BnA’

íe
A' -> bA' | cA’|λ

z
Pl
o así:

at
as
A -> B1A’|B2A’|….|BnA’|B1|B2|….|Bn
A' -> bA' | cA’|b|c

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis LL(1). Ejemplos (eliminación de la
recursividad)
G=( { a , b , c , d , e } , G=( { a , b , c , d , e } ,

M
{ S , A , B , C } , S , P ) { S , A , A’,B , C,C’ } , S , P )

ªL
ui
P={ 1. S -> aAa

sa
1. S -> aAa 2. S -> cb
2. S -> cb 3. A -> BA’

D
íe
3. A -> Ac 4. A’ -> cA’

z
4. A -> B 5. A’àλ

Pl
5. B -> dbc 6. B -> dbc

at
6. B -> C 7. B -> C

as
7. C -> Cd 8. C -> eC’
8. C -> e 9. C’àdC’
} 8. C’ -> λ

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis LL(1). Factorización de la gramática

• Alguna de las siguientes producciones del símbolo A son recursivas por la

M
izquierda

ªL
A -> Ab|Ac|B1|B2|….|Bn

ui
• Se deben transformar creando un nuevo símbolo A’, de la siguiente

sa
manera:

D
A -> B1A’|B2A’|….|BnA’

íe
A' -> bA' | cA’|λ

z
Pl
o así:

at
as
A -> B1A’|B2A’|….|BnA’|B1|B2|….|Bn
A' -> bA' | cA’|b|c

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Análisis descendente predictivo.
Algoritmo de análisis LL(1)
1. Se carga la pila con el símbolo final de cadena y el axioma.
2. Si la cima es:

M
a) Un no terminal A , se consulta la entrada de la tabla T[A,c.lex_entrada].

ªL
• Si la entrada contiene la producción n, se aplica eliminando la A de la cima de la pila y

ui
se sustituye por la parte derecha de la producción n apilada en orden inverso.

sa
• Si la entrada contiene el código de error, se emite un mensaje de error sintáctico y se
invoca a la rutina de recuperación si existe.

D
b) Un terminal ' a ‘,

íe
• Si coincide con la entrada se avanza en la entrada y se elimina la cima de la pila.

z
• Si no coincide, se emite un mensaje de error y se invoca a la rutina de recuperación si

Pl
existe.

at
3. Se vuelve al paso 2 hasta que la pila o la entrada se vacían.

as
4. Si se vacían la pila y la entrada, la frase pertenece al lenguaje

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Tabla LL(1). Ejemplo

G=( {i , + , * , ( , ) , num ) , {S, E, E', T, T' , F} , S , P }

M
ªL
1. S -> E;

ui
2. E -> TE'

sa
3. E -> λ

D
4. E' -> +TE'

íe
5. E' -> λ

z
6. T -> FT'

Pl
7. T' -> *FT'

at
8. T' -> λ

as
9. F -> (E)
10. F -> num
Frase: num+num;$

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Rutinas de recuperación de errores en
analizadores LL(1)
• En los analizadores LL(1), se implementa la recuperación en modo de

M
pánico que consiste en desechar componentes léxicos de la entrada

ªL
hasta llegar a uno por el que se pueda seguir el análisis sintáctico.

ui
• Se basa en el uso de unos conjuntos de sincronización que son conjuntos

sa
de componentes léxicos o terminales a partir de los cuales se podría
proseguir el análisis.

D
íe
• Existen dos formas de implementación.

z
• La original, que es menos eficiente (un único conjunto de

Pl
sincronización)

at
• La actual que mejora la eficiencia por el uso de más de un conjunto

as
de sincronización.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Recuperación de errores en modo de pánico
(I)
Método original

M
• Se crea un conjunto de sincronización; es decir, un conjunto formado

ªL
por una serie de componentes léxicos o terminales que por sus

ui
características se considera que permiten recuperar el análisis

sa
fácilmente. Suelen ser 'delimitadores', “END”, “ ; “ , “ } “.

D
• Si no se producen errores, la rutina no influye en el análisis del programa

íe
porque la rutina no realiza cambios en el algoritmo de análisis LL(1).

z
• Si hay errores se invocará a la rutina que es la que usará el conjunto

Pl
creado

at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Recuperación general de errores en modo de
pánico (II)
• Rutina de recuperación

M
1.Se emite el mensaje de error (también lo puede hacer el propio

ªL
analizador)

ui
2.Se desechan componentes léxicos de la entrada hasta que :

sa
1.Se encuentra uno del conjunto de sincronización, entonces se eliminan

D
símbolos de la pila hasta encontrar en ella el mismo componente léxico de la

íe
entrada.

z
1. Si se encuentra, prosigue el análisis

Pl
2. Si no, se encuentra; es decir, se vacía la pila, el error no es recuperable.

at
2.Se vacía la entrada porque no se encuentra ningún símbolo del conjunto de
sincronización. Entonces el análisis no es recuperable

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Recuperación de errores en modo de pánico
(III)

M
• La rutina anterior tiene varios problemas :

ªL
• Trabaja con la pila y la entrada de forma independiente, por lo que el

ui
símbolo elegido para la recuperación puede que no esté en la pila y la

sa
recuperación falla
• Usa un único conjunto de sincronización para cualquier situación de error

D
• La rutina que se implementa actualmente, usa varios conjuntos

íe
z
de sincronización y las modificaciones de la entrada y la pila se

Pl
hacen de forma sincronizada

at
• Para soportar esta rutina, se añadirán algunos elementos del analizador LL(1)

as
y se modificará el algoritmo de análisis LL(1)

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Recuperación de errores en modo de pánico
(IV)
• Conjuntos de sincronización

M
• Conjunto asociado a cada producción de la gramática (suele ser el

ªL
conjunto siguiente de la parte izquierda de la producción

ui
correspondiente).

sa
• Elementos del analizador LL(1)

D
• Se usan dos pilas:

íe
z
• Pila de análisis (que almacenará otros símbolos nuevos

Pl
además de los habituales)

at
as
• Pila de conjuntos de sincronización.

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Recuperación de errores en modo de pánico
(V)
• Modificaciones en el algoritmo LL(1)

M
1. Cuando se aplica una producción 'n' :

ªL
ui
a) Se desapila la cima

sa
b) Se introduce en la pila de análisis una marca de sincronización(#) que
indica que se ha usado una nueva producción

D
íe
c)Se apila en la pila de conjuntos, el conjunto correspondiente a la

z
producción ‘n’ aplicada

Pl
d) Se apila la parte derecha de ‘n’ en orden inverso

at
as
2. Si en la cima de la pila de análisis hay una marca, se desapilan ambas
pilas. (se quita la marca y el conjunto de la cima de la pila de
conjuntos).

Procesadores de Lenguajes I. Análisis sintáctico


ascendente M. Luisa Díez Platas
Recuperación de errores en modo de pánico
(VI)
• Rutina de recuperación de errores

M
1. Se usa el conjunto 'C' de la cima de la pila de conjuntos.

ªL
a) Se crea un subconjunto 'SC' con los elementos de C que se encuentran

ui
en la pila de análisis.

sa
b) Se eliminan componentes léxicos de la entrada hasta que se en
encuentra uno que está en el subconjunto SC creado.

D
íe
c) Se desapila la pila de análisis hasta el componente de la entrada.
(por cada marca que se elimine, se elimina un conjunto de la pila).

z
Pl
2. Si se vacía la entrada no es posible la recuperación, si no se vacía se

at
prosigue el análisis

as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas
Recuperación de errores en modo de pánico
(VII)
1. S -> aAa 8. C -> eC' Conjuntos de sincronizacion:
2. S -> cb 9. C' -> dC' 1, 2: SIG(S)={$}

M
3. A -> BA' 10. C' -> λ 3: SIG(A)={a}

ªL
4. A' -> cA' 4, 5: SIG(A')={a}
5. A' -> λ Frase: 6, 7: SIG(B)={a,c}

ui
6. B -> dbc aeeda$ 8: SIG(C)={a,c}

sa
7. B -> c 9, 10: SIG(C')={a,c}

D
íe
z
Pl
at
as
Procesadores de Lenguajes I. Análisis sintáctico
ascendente M. Luisa Díez Platas

También podría gustarte