You are on page 1of 17

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


Tipos de analizadores sintácticos LR

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


Modelo de los analizadores sintácticos LR

Analizadores sintácticos LR(0) y SLR


Modelo de los analizadores sintácticos LR

Tabla ir a: función de transición de un AFD que reconoce los


prefijos viables de la gramática.
Pila: contiene los estados del AFD por los que se va pasando.
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.

Prefijos viables de una gramática


Prefijos de formas sentenciales derechas que pueden aparecer en la
pila de un analizador sintáctico por desplazamiento-reducción,
porque no sobrepasan el pivote (•) situado más a la derecha.

Analizadores sintácticos LR(0) y SLR


Algoritmo de los analizadores sintácticos LR
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


Clausura de un conjunto de ı́tems
Algorithm 1.1 Clausura de un conjunto de ı́tems I
J←I
repeat
for cada ı́tem A → α • Bβ en J y cada producción B → γ de
G do
agregar B → •γ a J
end for
until no se puedan agregar ı́tems a J
return J

Sea el conjunto de ı́tems I = {[E → •E + T ], [E → •T ]}


correspondiente a la siguiente gramática, calcular Clausura(I ).

E → E + T |T
T → T ∗ F |F
F → id|(E )

Analizadores sintácticos LR(0) y SLR


Construcción del AFD para los prefijos viables

Algorithm 1.2 Función Ir a(I conjunto de ı́tems, X sı́mbolo)


J→∅
for cada ı́tem A → α • X β en I do
agregar Clausura({A → αX • β}) a J
end for
return J

Algorithm 1.3 Items de una gramática G


C ← {Clausura({S 0 → •S})}
repeat
for cada conjunto de ı́tems I en C y cada sı́mbolo X do
agregar Ir a(I , X ) a C
end for
until no se puedan agregar más conjuntos de ı́tems a C

Analizadores sintácticos LR(0) y SLR


Construcción de las tablas LR(0) y SLR(1)
1) Aumentar la gramática G agregando S 0 → S
2) Construir los conjuntos de ı́tems LR(0) C = {I0 , ..., In }
3) Construir la tabla accion:
if A → α • aβ está en Ii e ir a(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
4) Construir la tabla ir a:
Para cada no terminal A, ir a[i, A] = j ⇔ Ir a(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


Ejercicios

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).

Sean las siguientes gramáticas:

G1: S → SA|A
A → (S)|()

G2: E → id|id(E )|E + id

Son LR(0)? Son SLR? Reconocer las cadenas (())() y id(id+id)


respectivamente.

Analizadores sintácticos LR(0) y SLR


Tabla acción LR(0) para G1

estado ( ) $
0 desplazar 3
1 desplazar 3 aceptar
2 reducir S → A reducir S → A reducir S → A
3 desplazar 3 desplazar 6
4 reducir S → SA reducir S → SA reducir S → SA
5 desplazar 3 desplazar 7
6 reducir A → () reducir A → () reducir A → ()
7 reducir A → (S) reducir A → (S) reducir A → (S)

Analizadores sintácticos LR(0) y SLR


Tabla ir a LR(0) para G1

estado S A
0 1 2
1 4
2
3 5 2
4
5 4
6
7

Analizadores sintácticos LR(0) y SLR


Análisis de una cadena del lenguaje generado por G1

pila entrada acción


0 (())()$ desplazar 3
03 ())()$ desplazar 3
033 ))()$ desplazar 6
0336 )()$ reducir A → ()
032 )()$ reducir S → A
035 )()$ desplazar 7
0357 ()$ reducir A → (S)
02 ()$ reducir S → A
01 ()$ desplazar 3
013 )$ desplazar 6
0136 $ reducir A → ()
014 $ reducir S → SA
01 $ aceptar
Derivación:
S ⇒ SA ⇒ S() ⇒ A() ⇒ (S)() ⇒ (A)() ⇒ (())()
Analizadores sintácticos LR(0) y SLR
Tabla acción SLR para G2

estado id ( ) + $
0 2
1 3 aceptar
2 4 E → id E → id E → id
3 5
4 2
5 E → E + id E → E + id E → E + id
6 7 3
7 E → id(E ) E → id(E ) E → id(E )

Siguientes(E) = {), +, $}

Analizadores sintácticos LR(0) y SLR


Tabla ir a SLR para G2

estado E
0 1
1
2
3
4 6
5
6
7

Analizadores sintácticos LR(0) y SLR


Análisis de una cadena del lenguaje generado por G2

pila entrada acción


0 id(id+id)$ desplazar 2
02 (id+id)$ desplazar 4
024 id+id)$ desplazar 2
0242 +id)$ reducir E → id
0246 +id)$ desplazar 3
02463 id)$ desplazar 5
024635 )$ reducir E → E + id
0246 )$ desplazar 7
02467 $ reducir E → id(E )
01 $ aceptar

Derivación:
S ⇒ id(E ) ⇒ id(E + id) ⇒ id(id + id)

Analizadores sintácticos LR(0) y SLR

You might also like