Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ªL
ui
sa
D
Procesadores de lenguajes I
íe
Análisis sintáctico ascendente
z
Pl
at
as
Mª Luisa Díez Platas
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
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
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.
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
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]*
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.
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]
• 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)
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)
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
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
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
• 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)
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
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.
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)
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)
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)
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();
$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
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
• 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)
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
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)
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)]);
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 $
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 }
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
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]
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
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
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.
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)
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)
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.
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)
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
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
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.
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
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
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
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 )
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
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
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
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
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
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
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.
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.
• 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
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
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.
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.
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)
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:=
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
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.
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.
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.
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 }
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.
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)
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
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
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.
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)
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.
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
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):
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).
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
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
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’ -> λ
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
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
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;$
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.
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)
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.
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).
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