Está en la página 1de 12

CI3725 - Traductores e Interpretadores Abril-Julio 2006 Prof.

Ernesto Hern andez-Novich

Laboratorio Semana IX
Gram aticas LR Denominamos asa (handle ) de una palabra a aquella subpalabra que corresponde con la parte derecha de alguna producci on de manera que su reemplazo por la parte izquierda correspondiente representa un paso en reversa a trav es de una derivaci on m as derecha, i.e. si usamos solamente derivaciones derechas tendremos S A y diremos que es un asa para = A . Llamaremos prejos viables de una forma sentencial a los prejos de . Si la gram atica no es ambigua entonces existe exactamente un asa para cada forma sentencial. Los items LR(0) de una gram atica libre de contexto G = (N, , P, S ) son tripletas de la forma (A, , ) tales que A P y se denotan A . Para cada gram atica puede construirse el conjunto de items LR(0) aplicando el algoritmo de clausura de irems, denido como clausura(I ) =f ix I {B |A B clausura(I ) B N } Utilizando la clausura de los conjuntos de items LR(0) puede construirse el aut omata nito reconocedor de los prejos viables de G denido como M donde Q = items(G) I0 = clausura({S |S P }) (I, X ) = clausura({A X |A X I X N }) Diremos que una gram atica G es LR(0) si: 1. Su s mbolo inicial no aparece a la derecha en ninguna producci on. 2. Todos los estados accesibles de su aut omata de prejos viables que tienen items terminales1 , tienen u nicamente un elemento (un item). Las conguraciones inv alidas ser an de la forma Ii : A B a que corresponde a un conicto shift-reduce, o bien de la forma Ii : A B que corresponde a un conicto reduce-reduce.
1 Un

(Q, N , , I0 , Q {})

item terminal es de la forma A .

Ejemplo 1 Determinemos si la gram atica G = ({S }, {(, ), a}, P, S ) es LR(0) siendo P denida como S S S (S ) SS a

Puesto que el s mbolo inicial de la gram atica aparece al lado derecho de la segunda producci on, aumentamos la gram atica con un nuevo s mbolo inicial S y calculamos los conjuntos de items. La gram atica aumentada queda como S S S S S (S ) SS a

y calculamos el conjunto de tems I0 . Inicialmente se incluye en I0 el item S S y luego calculamos su clausura, que de acuerdo con el algoritmo denido previamente implica agregar todos los items construidos a partir de las producciones para S con un punto a la izquierda, quedando I0 : S S S (S ) S SS S a Notamos que en I0 todos los no-terminales que est an a la derecha de un punto, ya est an inclu dos en la clausura, por lo tanto culmina el c alculo de clausura(I0 ). Para obtener los estados alcanzables del aut omata mbolo de la gram atica a su derecha de prejos viables, basta con considerar para todos los items de I0 el s y mover el punto; eso genera un nuevo item al cual hemos de calcular su clausura. Consideremos el primer item de I0 en el cual podemos mover el punto usando S entonces podemos construir el nuevo conjunto I1 formado por todos los items de I0 que pueden mover el punto usando S , que inicialmente nos queda I1 : S S S SS pero luego notamos que tenemos el no-terminal S a la derecha del punto, por lo que tenemos que calcular su clausura, quedando I1 : S S S SS S (S ) S SS S a Prosiguiendo de la misma manera nos quedar a el conjunto de items LR(0) denitivos como I0 : S S S (S ) S SS I1 S a : S S 2

S SS S (S ) S SS S a I2 : S ( S) S (S ) S SS I3 S a : S SS S (S ) S SS S a I4 I5 : S a : S (S ) S SS S (S ) S SS I6 S a : S SS S SS S (S ) S SS I7 S a : S (S )

N otese que el estado I1 es accesible y contiene un item terminal (S S ) pero acompa nado de otros items. Lo mismo puede decirse de I6 . As que esta gram atica no es LR(0). Ejemplo 2 Determinemos si la gram atica S E E T T F F E E +T T T F F (E ) id

es LR(0) y calculemos su aut omata de prejos viables. El conjunto de clausura de items nos queda : S E E E +T E T T T F

I0

T F F (E ) I1 I2 I3 I4 F id : SE E E +T : ET T T F : T F : F ( E) E E +T E T T T F T F F (E ) F id I5 I6 : F id : E E+ T T T F T F F (E ) F id I7 : T T F F (E ) F id I8 I9 I10 I11 : F (E ) E E +T : E E +T T T F : T T F : F (E )

y podemos construir el aut omata de prejos viables estableciendo las transiciones entre los Ii notando el s mbolo de la gram atica que lleva de uno a otro. Observando I0 notaremos que hay una transici on hasta I1 con el s mbolo E , una transici on hasta I2 con el s mbolo T , una transici on hasta I3 con el s mbolo F , una transici on hasta I4 con el s mbolo ( y una transici on hasta I5 con el s mbolo id. Repitiendo el procedimiento para todos los conjuntos de items, nos quedar a el aut omata

Figura 1: Aut omata de Prejos Viables para la Gram atica del Ejemplo 2 En el conjunto de items podemos observar que I1 , I2 e I9 son inv alidos (todos con conicto shift-reduce ) por tanto la gram atica no es LR(0). Funcionamiento de un Parser LR por Tabla de Parsing Un Parser LR es una m aquina de estados que consta de: Una pila que contiene estados. El estado actual de la m aquina parser LR es aquel que se encuentra en el tope de la pila. Un apuntador al siguiente elemento de la entrada. Al comenzar la ejecuci on de la m aquina, apunta al primer caracter de la entrada. Un mecanismo de emisi on para presentar por la salida los n umeros asociados a las producciones de la gram atica que han sido utilizadas. Al terminar la ejecuci on del parser, la salida tendr a (en orden inverso) las producciones necesarias para conseguir una derivaci on m as derecha a partir del s mbolo inicial de la gram atica, de la cadena suministrada en la entrada. Una tabla de acciones y una tabla de goto que controla el funcionamiento de la m aquina de estados. La tabla de acciones (estado ) contiene valores que pueden ser shif t n, reduce n, accept o error. La tabla de goto (estado N ) contiene valores que corresponden a estados de la m aquina. C omo funciona? La ejecuci on de una m aquina de parser LR es como sigue: 1. Al comenzar el procesamiento de una cadena de entrada, la pila contiene el estado inicial y se apunta al primer caracter de la entrada. 2. Se observa el estado en el tope de la pila (estado actual) y el s mbolo terminal que est an en la entrada. Se busca en la tabla de acciones esa combinaci on, y se opera seg un el valor contenido en la tabla, a saber: Si la acci on es shif t n, se consume el s mbolo terminal de la entrada avanzando el apuntador al siguiente s mbolo, y se coloca el estado n al tope de la pila.

Si la acci on es reduce n, se emite el n umero n en la salida. Se sacan de la pila tantos estados como n umero de s mbolos (terminales o no-terminales) presentes en el lado derecho de la n- esima producci on de la gram atica. Se observa el estado que qued o en el tope de la pila y el no-terminal que corresponde a la n- esima producci on de la gram atica, se busca en la tabla de goto esa combinaci on, y se coloca el valor obtenido en el tope de la pila. Si la acci on es accept, el parser termina su ejecuci on indicando la aceptaci on de la palabra contenida en la entrada. La secuencia de estados emitida por la salida hasta ese punto corresponde a las producciones utilizadas (en orden inverso) en una derivaci on m as derecha. Si la acci on es error, el parser termina su ejecuci on indicando la falla. Construcci on de la Tabla de Parsing LR para una Gram atica Comenzaremos por considerar la construcci on de tablas de parsing LR para gram aticas LR(0). El algoritmo de construcci on consiste en: 1. Aumentar la gram atica con un nuevo s mbolo inicial S tal que se agregue la producci on S S $ donde S es el s mbolo inicial original de la gram atica y $ es el terminal que representa el nal de la entrada. 2. Enumerar contando desde cero cada producci on de la gram atica aumentada comenzando por la nueva producci on inicial. 3. Calcular el aut omata de prejos viables a partir de los items LR(0) de la gram atica. Cada conjunto de a para construir el i- esimo estado de la m aquina parser LR. items Ii servir 4. Construir la tabla de goto usando una columna por cada s mbolo no-terminal de la gram atica original y una la por cada estado. Si en el aut omata de prejos viables hay una transici on desde Ii hasta Ij con el s mbolo no-terminal X entonces, goto[i, X] j . 5. Construir la tabla de acciones usando una columna por cada s mbolo terminal de la gram atica aumentada (incluyendo el $) y una la por cada estado. a ) Si en el aut omata de prejos viables hay una transici on desde Ii hasta Ij con el s mbolo terminal x, entonces acciones[i, x] shif t j . b ) Si en el aut omata de prejos viables el i- esimo conjunto contiene un item de la forma A y A es la n- esima producci on de la gram atica (n > 0), entonces x acciones[i, x] reduce n, i.e. llenar la i- esima la de la tabla. c ) Si en el aut omata de prejos viables el i- esimo conjunto contiene un item de la forma S S $, entonces acciones[i, $] accept. d ) El resto de la tabla de acciones se llena con error. Ejemplo 3 Construyamos la tabla de parsing LR(0) para la gram atica E E E B B E B E +B B 0 1

Comenzamos por aumentar la gram atica con un nuevo s mbolo no-terminal inicial S y agregando un nuevo s mbolo terminal $ para representar el nal de la entrada. Enseguida enumeramos las producciones seg un

describe el algoritmo, para tener (0) (1) (2) (3) (4) (5) S E$ E E B E E +B EB B0 B1

Construimos el aut omata de prejos viables calculando los conjuntos de items LR(0) de la gram atica, que nos quedan I0 : S E $ E E B E E +B E B B 0 B 1 I1 : S E$ E E B E E +B I2 I3 I4 I5 : EB : B 0 : B 1 : E E B B 0 B 1 I6 : E E+ B B 0 B 1 I7 I8 I9 siendo el aut omata resultante de la forma : E E B : E E +B : S E $

Figura 2: Aut omata de Prejos Viables para el Ejemplo 3 Notamos que la gram atica es LR(0) pues todos los conjuntos de items que contienen un elemento de la forma A contienen u nicamente ese elemento. Ahora podemos construir la tabla de parsing LR seg un el algoritmo. Observamos que: En el estado 0 notamos la transici on I0 0 I3 por lo tanto acciones[0, 0] shif t 32 . As mismo, observamos que hay una transici on I0 1 I4 por lo tanto acciones[0, 1] shif t 4. Finalmente, las transiciones I0 E I1 e I0 B I2 dan lugar a goto[0, E ] 1 y goto[0, B ] 2 respectivamente. En el estado 1 notamos las transiciones I1 I5 , I1 + I6 e I1 $ I9 que dan lugar a acciones[1, ] shif t 5, acciones[1, +] shif t 6 y acciones[1, $] shif t 9 respectivamente. No hay contribuci on a la tabla de goto. El estado 2 es un estado con un item nal (tiene el punto a la derecha) y corresponde a la producci on n umero 3 de la gram atica, por lo tanto x acciones[2, x] reduce 3. No hay contribuci on a la tabla de goto. El estado 3 es un estado con un item nal que corresponde a la producci on n umero 4 de la gram atica, por lo tanto x acciones[3, x] reduce 4. No hay contribuci on a la tabla de goto. El estado 4 es un estado con un item nal que corresponde a la producci on n umero 5 de la gram atica, por lo tanto x acciones[4, x] reduce 5. No hay contribuci on a la tabla de goto. En el estado 5 notamos las transiciones I5 0 I3 e I5 1 I4 que dan lugar a acciones[5, 0] shif t 3 y acciones[5, 1] shif t 4 respectivamente. Finalmente, la transici on I5 B I7 da lugar a goto[5, B ] 7. En el estado 6 notamos las transiciones I6 0 I3 e I6 1 I4 que dan lugar a acciones[6, 0] shif t 3 y acciones[6, 1] shif t 4 respectivamente. Finalmente, la transici on I6 B I8 da lugar a goto[6, B ] 8. El estado 7 es un estado con un item nal que corresponde a la producci on n umero 1 de la gram atica, por lo tanto x acciones[7, x] reduce 1. No hay contribuci on a la tabla de goto. El estado 8 es un estado con un item nal que corresponde a la producci on n umero 2 de la gram atica, por lo tanto x acciones[8, x] reduce 2. No hay contribuci on a la tabla de goto. El estado 9 contiene el item S E $ por lo tanto acciones[9, $] accept. As , llegaremos a construir la tabla de parsing que queda como sigue (los espacios vac os deben contener error).
2 No

confundirse! El primer cero corresponde al estado y el segundo cero corresponde al s mbolo terminal en la entrada.

0 1 2 3 4 5 6 7 8 9 shif t 5 reduce 3 reduce 4 reduce 5

+ shif t 6 reduce 3 reduce 4 reduce 5

0 shif t 3 reduce 3 reduce 4 reduce 5 shif t 3 shif t 3 reduce 1 reduce 2

1 shif t 4 reduce 3 reduce 4 reduce 5 shif t 4 shif t 4 reduce 1 reduce 2

$ shif t 9 reduce 3 reduce 4 reduce 5

E 1

B 2

7 8 reduce 1 reduce 2 accept

reduce 1 reduce 2

reduce 1 reduce 2

Cuadro 1: Tabla de Parsing LR para Ejemplo 3 Ilustraremos el funcionamiento del Parser LR utilizando la tabla para hacer el an alisis de la cadena 0 + 1$ que pertenece al lenguaje. En la tabla, la pila crece hacia la derecha y cada grupo de las representa un cambio en la m aquina de estados (una la para un shif t o accept, y dos las para un reduce). Estado 0 3 2 1 6 4 8 1 9 Entrada 0 + 1$ +1$ +1$ +1$ +1$ +1$ 1$ $ $ $ $ $ $ Salida Pila 0 0,3 0,2 0,2 0,1 0,1 0,1,6 0,1,6,4 0,1,6,8 0,1,6,8 0,1 0,1 0,1,9 Acci on shif t 3 reduce 4 reduce 3 shif t 6 shif t 4 reduce 5 reduce 2 shif t 9 accept Detalles Consumir y push 3. Usar regla B 0 Emitir 4, pop y goto[0, B ] Usar regla E B Emitir 3, pop y goto[0, E ] Consumir y push 6. Consumir y push 4. Usar regla B 1 Emitir 5, pop y goto[6, B ] Usar regla E E +B Emitir 2, tres pop y goto[0, E ] Consumir (queda igual) y push 9. Fin.

4 4 4,3 4,3 4,3 4,3 4,3,5 4,3,5 4,3,5,2 4,3,5,2 4,3,5,2

Cuadro 2: Ejecuci on del Parser LR del Ejemplo 3 N otese que lo emitido por la salida representa, en orden inverso, las producciones que deben utilizarse para obtener una derivaci on m as derecha en la gram atica original para la cadena suministrada en la entrada. Concretamente E 2
5 3

E +B E +1 B +1 0+1

4 Ejemplo 4

Construyamos la tabla de parsing LR(0) para la gram atica S B B BB aB c

Comenzamos por aumentar la gram atica con un nuevo s mbolo inicial T y agregando un nuevo s mbolo terminal $ para representar el n de la entrada. En seguida enumeramos las producciones seg un indica el algoritmo para tener (0) (1) (2) (3) T S$ S BB B aB Bc

Construimos el aut omata de prejos viables calculando los conjuntos de items LR(0) para la gram atica que nos quedan I0 : T S $ S BB B aB I1 I2 B c : T S$ : S BB B aB B c I3 I4 : S BB : B aB B aB B c I5 I6 I7 siendo el aut omata resultante de la forma : B c : B aB : T S $

Figura 3: Aut omata de Prejos Viables para el Ejemplo 4 Notamos que la gram atica es LR(0) pues todos los conjuntos de items que contienen un elemento de la forma A contienen u nicamente ese elemento. Ahora podemos construir la tabla de parsing LR seg un el algoritmo. Nos queda

10

0 1 2 3 4 5 6 7

a shif t 4 shif t 4 reduce 1 shif t 4 reduce 3 reduce 2

c shif t 5 shif t 5 reduce 1 shif t 5 reduce 3 reduce 2

$ shif t 7

S 1

B 2 3

reduce 1 6 reduce 3 reduce 2 accept

Cuadro 3: Tabla de Parsing LR para Ejemplo 4

Ejercicio 5 Construyamos la tabla de parsing LR(0) para la gram atica E E E (L) () id L,E E

L L

Comenzamos por aumentar la gram atica con un nuevo s mbolo inicial S y agregando un nuevo s mbolo terminal $ para representar el n de la entrada. En seguida enumeramos las producciones seg un indica el algoritmo para tener (0) (1) (2) (3) (4) (5) S E$ E (L) E () E id L L,E LE

Construimos el aut omata de prejos viables calculando los conjuntos de items LR(0) para la gram atica que nos quedan I0 : S E $ E (L) E () I1 I2 E id : S E$ : E ( L) E () L L,E L E E (L) E () E id 11

I3 I4 I5 I6 I7 I8

: E id : E (L ) L L ,E : E () : LE : E (L) : L L, E E (L) E () E id

I9 I10 siendo el aut omata resultante de la forma

: E L,E : S E $

Figura 4: Aut omata de Prejos Viables para el Ejemplo 5 Notamos que la gram atica es LR(0) pues todos los conjuntos de items que contienen un elemento de la forma A contienen u nicamente ese elemento. Ahora podemos construir la tabla de parsing LR seg un el algoritmo. Nos queda ( shif t 2 shif t 2 reduce 3 reduce 2 reduce 5 reduce 1 shif t 2 reduce 4 ) , id shif t 3 shif t 3 reduce 3 reduce 2 reduce 5 reduce 1 shif t 3 reduce 4 $ shif t 10 shif t 5 reduce 3 shif t 7 reduce 2 reduce 5 reduce 1 reduce 4 6 reduce 3 reduce 2 reduce 5 reduce 1 9 reduce 4 accept 4 reduce 3 shif t 8 reduce 2 reduce 5 reduce 1 reduce 4 E 1 L

0 1 2 3 4 5 6 7 8 9 10

Cuadro 4: Tabla de Parsing LR para Ejemplo 5 12