Analizadores sintácticos LR(0) y SLR

Anuncio
Analizadores sintácticos LR(0) y SLR
Teorı́a de Lenguajes
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
Analizadores sintácticos LR(0) y SLR
Clase de Hoy
Anteriores: Parsing descendente (LL(1), ELL)
Recursivos e iterativos
Generan árbol de derivación desde la raı́z hasta las hojas
Simulan derivación a izquierda
Hoy: Parsing ascendente
Construyen el árbol sintáctico desde las hojas hasta la raı́z
Más expresivos que los descendentes
Más difı́ciles de construir
Analizadores sintácticos LR(0) y SLR
Analizadores Sintácticos LR(k)
L: left-to-right
R: rightmost derivation
k: número de sı́mbolos de lookahead
Analizadores sintácticos LR(0) y SLR
Tipos de Analizadores Sintácticos LR(k)
LR(0)
SLR(1): Simple LR(1)
LALR(1): Lookahead LR(1)
LR(1)
Poder expresivo
LR(0) ⊂ SLR(1) ⊂ LALR(1) ⊂ LR(1)
Analizadores sintácticos LR(0) y SLR
Algunas Definiciones
Handle: (informalmente) Subcadena de una forma sentencial,
que coincide con el lado derecho de una producción, y cuya
reducción representa un paso en una derivación a derecha, en
reversa.
Prefijos Viables: Prefijos de una forma sentencial derecha
que pueden aparecer en la pila de un parser shift-reduce,
porque no sobrepasan el handle ubicado más a la derecha.
El conjunto de todos los prefijos viables es un lenguaje
regular.
Analizadores sintácticos LR(0) y SLR
Parsers LR(k) - Estructura General
Analizadores sintácticos LR(0) y SLR
Modelo de los analizadores sintácticos LR
Pila: Contiene los estados del AFD por los que se va pasando.
Tabla ir a: Función de transición de un AFD que reconoce
los prefijos viables de la gramática.
Tabla acción:
desplazar i: desplazar y apilar el estado i.
reducir A → β: reducir por la producción indicada.
aceptar : aceptar la cadena de entrada.
error : rechazar la cadena de entrada.
Analizadores sintácticos LR(0) y SLR
Parsers LR(k) - Algoritmo
apilar s0
loop
s ← tope de la pila
a ← próximo sı́mbolo apuntado en w $
if accion[s, a] = desplazar s 0 then
apilar s 0
avanzar al próximo sı́mbolo de entrada
else if accion[s, a] = reducir A → β then
sacar |β| sı́mbolos de la pila
s 0 ← tope de la pila
apilar ir a[s 0 , A]
else if accion[s, a] = aceptar then
return
else
error ()
end if
end loop
Analizadores sintácticos LR(0) y SLR
Analizadores sintácticos LR(0) y SLR(1)
Item LR(0)
Producción con un pivote (•) en alguna posición del lado derecho.
Representa hasta dónde se vio una producción en el proceso de
análisis sintáctico, y cómo se espera que continúe la cadena de
entrada.
Por ejemplo, para la producción A → BC , existen estos ı́tems
LR(0):
A → •BC
A→B •C
A → BC •
Para la producción A → λ el único ı́tem es: A → •
Analizadores sintácticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramática
Para armar las tablas ir a y acción es necesario construir un
AFD que reconozca los prefijos viables de la gramática.
El alfabeto es V = VN ∪ VT .
Los estados son conjuntos de ı́tems.
La función de transición determina la tabla ir a.
Analizadores sintácticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramática
Clausura de un Conjunto de Items
J←I
repeat
for ı́tem A → α·Bβ ∈ J, y producción B → γ de G do
agregar B → ·γ a J
end for
until no se puedan agregar ı́tems a J
return J
Analizadores sintácticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramática
Construcción del Autómata
1 Aumentar la gramática G a G 0 agregando S 0 → S y
cambiando el sı́mbolo distinguido a S 0
2 Construir los conjuntos de ı́tems LR(0) C = {I0 , ..., In }
(estados del AFD)
Analizadores sintácticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramática
Construcción del Autómata
3 Construir la tabla accion:
if A → α · aβ está en Ii , y δ(Ii , a) = Ij , a ∈ VT then
asignar desplazar j a accion[i, a]
end if
if A → α· está en Ii , A 6= S 0 then
asignar reducir A → α a accion[i,a]
LR(0): para todos los terminales a
SLR(1): para a en Siguientes(A)
end if
if S 0 → S· está en Ii then
asignar aceptar a accion[i,$]
end if
Analizadores sintácticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramática
Construcción del Autómata
4 Construir la tabla ir a:
Para cada no terminal A, ir a[i,A] = j ⇔ δ(Ii , A) = Ij
5 Las entradas vacı́as de la tabla acción son consideradas error
6 El estado inicial es el que contiene el ı́tem S 0 → ·S
Analizadores sintácticos LR(0) y SLR
Gramáticas LR(0) – SLR(1)
Conflictos
Si la tabla acción tiene más de una entrada en algún casillero,
entonces la gramática no es LR(0) / SLR(1).
Posibles conflictos:
shift-reduce
reduce-reduce
Analizadores sintácticos LR(0) y SLR
Ejercicio (1)
Sea G1 la siguiente gramática:
S
A
→ SA|A
→ (S)|()
¿Es LR(0)? ¿Es SLR?
Analizar la siguiente cadena: (()) ()
Analizadores sintácticos LR(0) y SLR
Tabla acción LR(0) para G1
estado
0
1
2
3
4
5
6
7
(
desplazar 3
desplazar 3
reducir S → A
desplazar 3
reducir S → SA
desplazar 3
reducir A → ()
reducir A → (S)
)
reducir S → A
desplazar 6
reducir S → SA
desplazar 7
reducir A → ()
reducir A → (S)
$
aceptar
reducir S → A
reducir S → SA
reducir A → ()
reducir A → (S)
Analizadores sintácticos LR(0) y SLR
Tabla ir a LR(0) para G1
estado
0
1
2
3
4
5
6
7
S
1
A
2
4
5
2
4
Analizadores sintácticos LR(0) y SLR
Análisis de una cadena del lenguaje generado por G1
pila
0
03
033
0336
032
035
0357
02
01
013
0136
014
01
entrada
(())()$
())()$
))()$
)()$
)()$
)()$
()$
()$
()$
)$
$
$
$
acción
desplazar 3
desplazar 3
desplazar 6
reducir A → ()
reducir S → A
desplazar 7
reducir A → (S)
reducir S → A
desplazar 3
desplazar 6
reducir A → ()
reducir S → SA
aceptar
Derivación:
S ⇒ SA ⇒ S() ⇒ A() ⇒ (S)() ⇒ (A)() ⇒ (())()
Analizadores sintácticos LR(0) y SLR
Ejercicio (2)
Sea G2 la siguiente gramática:
E
→ id|id(E )|E + id
¿Es LR(0)? ¿Es SLR?
Analizar la siguiente cadena: id(id + id)
Analizadores sintácticos LR(0) y SLR
Tabla acción SLR para G2
estado
0
1
2
3
4
5
6
7
id
2
(
)
+
$
4
E → id
3
E → id
aceptar
E → id
E → E + id
7
E → id(E )
E → E + id
3
E → id(E )
E → E + id
5
2
E → id(E )
Siguientes(E) = {), +, $}
Analizadores sintácticos LR(0) y SLR
Tabla ir a SLR para G2
estado
0
1
2
3
4
5
6
7
E
1
6
Analizadores sintácticos LR(0) y SLR
Análisis de una cadena del lenguaje generado por G2
pila
0
02
024
0242
0246
02463
024635
0246
02467
01
entrada
id(id+id)$
(id+id)$
id+id)$
+id)$
+id)$
id)$
)$
)$
$
$
acción
desplazar
desplazar
desplazar
reducir E
desplazar
desplazar
reducir E
desplazar
reducir E
aceptar
2
4
2
→ id
3
5
→ E + id
7
→ id(E )
Derivación:
S ⇒ id(E ) ⇒ id(E + id) ⇒ id(id + id)
Analizadores sintácticos LR(0) y SLR
Bibliografı́a
A. Aho, R. Sethi, J. Ullman. Compiladores: Principios, técnicas y
herramientas. Addison Wesley, 1990. (El Libro del Dragón)
Capı́tulo 4, secciones 4.5 y 4.7
Analizadores sintácticos LR(0) y SLR
Descargar