Sei sulla pagina 1di 24

Analizadores sintacticos LR(0) y SLR

Teora de Lenguajes

Facultad de Ciencias Exactas y Naturales


Universidad de Buenos Aires

Analizadores sint
acticos LR(0) y SLR
Clase de Hoy

Anteriores: Parsing descendente (LL(1), ELL)


Recursivos e iterativos
Generan arbol de derivaci
on desde la raz hasta las hojas
Simulan derivacion a izquierda
Hoy: Parsing ascendente
Construyen el arbol sintactico desde las hojas hasta la raz
Mas expresivos que los descendentes
Mas difciles de construir

Analizadores sint
acticos LR(0) y SLR
Analizadores Sintacticos LR(k)

L: left-to-right
R: rightmost derivation
k: n
umero de smbolos de lookahead

Analizadores sint
acticos LR(0) y SLR
Tipos de Analizadores Sintacticos 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
acticos LR(0) y SLR
Algunas Definiciones

Handle: (informalmente) Subcadena de una forma sentencial,


que coincide con el lado derecho de una produccion, y cuya
reduccion representa un paso en una derivaci
on 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 mas a la derecha.
El conjunto de todos los prefijos viables es un lenguaje
regular.

Analizadores sint
acticos LR(0) y SLR
Parsers LR(k) - Estructura General

Analizadores sint
acticos LR(0) y SLR
Modelo de los analizadores sintacticos LR

Pila: Contiene los estados del AFD por los que se va pasando.
Tabla ir a: Funci on de transici
on de un AFD que reconoce
los prefijos viables de la gramatica.
Tabla acci
on:
desplazar i: desplazar y apilar el estado i.
reducir A : reducir por la producci on indicada.
aceptar : aceptar la cadena de entrada.
error : rechazar la cadena de entrada.

Analizadores sint
acticos LR(0) y SLR
Parsers LR(k) - Algoritmo
apilar s0
loop
s tope de la pila
a proximo smbolo apuntado en w $
if accion[s, a] = desplazar s 0 then
apilar s 0
avanzar al proximo smbolo de entrada
else if accion[s, a] = reducir A then
sacar || smbolos 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
acticos LR(0) y SLR
Analizadores sintacticos LR(0) y SLR(1)

Item LR(0)
Produccion con un pivote () en alguna posici
on del lado derecho.

Representa hasta donde se vio una producci on en el proceso de


analisis sintactico, y como se espera que contin
ue la cadena de
entrada.

on A BC , existen estos tems


Por ejemplo, para la producci
LR(0):

A BC
AB C
A BC

Para la produccion A el u
nico tem es: A

Analizadores sint
acticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramatica

Para armar las tablas ir a y acci


on es necesario construir un
AFD que reconozca los prefijos viables de la gramatica.
El alfabeto es V = VN VT .
Los estados son conjuntos de tems.
La funcion de transici
on determina la tabla ir a.

Analizadores sint
acticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramatica

Clausura de un Conjunto de Items


JI
repeat
for tem A B J, y producci on B de G do
agregar B a J
end for
until no se puedan agregar tems a J
return J

Analizadores sint
acticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramatica

Construccion del Automata


1 Aumentar la gramatica G a G 0 agregando S 0 S y
cambiando el smbolo distinguido a S 0
2 Construir los conjuntos de tems LR(0) C = {I0 , ..., In }
(estados del AFD)

Analizadores sint
acticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramatica

Construccion del Automata


3 Construir la tabla accion:
if A a esta en Ii , y (Ii , a) = Ij , a VT then
asignar desplazar j a accion[i, a]
end if
if A esta 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 esta en Ii then
asignar aceptar a accion[i,$]
end if

Analizadores sint
acticos LR(0) y SLR
AFD para reconocer prefijos viables de una gramatica

Construccion del Automata


4 Construir la tabla ir a:
Para cada no terminal A, ir a[i,A] = j (Ii , A) = Ij
5 Las entradas vacas de la tabla acci
on son consideradas error
6 El estado inicial es el que contiene el tem S 0 S

Analizadores sint
acticos LR(0) y SLR
Gramaticas LR(0) SLR(1)

Conflictos
Si la tabla acci
on tiene mas de una entrada en alg
un casillero,
entonces la gramatica no es LR(0) / SLR(1).

Posibles conflictos:
shift-reduce
reduce-reduce

Analizadores sint
acticos LR(0) y SLR
Ejercicio (1)

Sea G1 la siguiente gramatica:

S SA|A
A (S)|()

Es LR(0)? Es SLR?

Analizar la siguiente cadena: (()) ()

Analizadores sint
acticos LR(0) y SLR
Tabla accion 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
acticos 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
acticos LR(0) y SLR
Analisis de una cadena del lenguaje generado por G1

pila entrada acci


on
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
Derivacion:
S SA S() A() (S)() (A)() (())()
Analizadores sint
acticos LR(0) y SLR
Ejercicio (2)

Sea G2 la siguiente gramatica:

E id|id(E )|E + id

Es LR(0)? Es SLR?

Analizar la siguiente cadena: id(id + id)

Analizadores sint
acticos LR(0) y SLR
Tabla accion 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
acticos LR(0) y SLR
Tabla ir a SLR para G2

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

Analizadores sint
acticos LR(0) y SLR
Analisis de una cadena del lenguaje generado por G2

pila entrada acci


on
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

Derivacion:
S id(E ) id(E + id) id(id + id)

Analizadores sint
acticos LR(0) y SLR
Bibliografa

A. Aho, R. Sethi, J. Ullman. Compiladores: Principios, tecnicas y


herramientas. Addison Wesley, 1990. (El Libro del Dragon)
Captulo 4, secciones 4.5 y 4.7

Analizadores sint
acticos LR(0) y SLR

Potrebbero piacerti anche