82
se basa simplemente en la posibilidad de construir sin problemas las tablas de anlisis sintctico para analizadores ascendentes.
5.2
De forma similar a como suceda en los analizadores descendentes lineales dirigidos por tabla, veremos que el algoritmo de anlisis sintctico ascendente por desplazamiento y reduccin es siempre el mismo con independencia de la gramtica utilizada y lo que cambia de un analizador a otro es la tabla de anlisis. En este algoritmo (que veremos con ms detalle ms adelante) existen dos acciones bsicas: Desplazar: consiste en llevar de alguna manera el smbolo de la entrada a la pila y pedir el siguiente al analizador lxico (equivalente a lo que haca la funcin de emparejamiento en los ASDP con tabla). Reducir: consiste en sustituir en la pila los smbolos de la parte derecha de una produccin por su parte izquierda (como si fuera la "inversa" de derivar por esa regla). En este captulo se describe este algoritmo con alguna simplificacin para facilitar su implementacin. El algoritmo utiliza una pila de estados y una tabla de anlisis para decidir qu accin tomar segn el estado del tope de la pila y el smbolo de la entrada; la tabla tiene dos partes, aunque tambin se suele hablar de dos tablas: Accin e /r_a. Cada estado representa que se ha reconocido un prefijo de la parte derecha de alguna regla de la gramtica. A veces el estado tambin representa el contexto en que se ha reconocido ese prefijo. El algoritmo va leyendo terminales de la entrada y deshaciendo reglas hasta llegar a obtener la inversa de una derivacin por la derecha de la cadena de entrada. Las acciones que pueden aparecer en la tabla Accin para un estado s y un smbolo de la entrada a son: d? rfc desplazar el puntero de la entrada (leer el siguiente token de la entrada) y apilar el estado j. reducir por la regla k (deshacer la regla fe). Para ello hay que desapilar tantos estados como smbolos tenga la parte derecha de la regla (si es una produccin vaca no hay que desapilar ningn estado) y, siendo p el estado que queda en el tope de la pila y A la parte izquierda de la regla, apilar el estado indicado por Ir.a\p, A]. terminar el anlisis con xito. producir un error. El conjunto de smbolos que podran aparecer en lugar del token de la entrada son todos aquellos para los que exista una accin de desplazar o reducir en el estado s.
aceptar error
83
Figura 5.1: Algoritmo de anlisis por desplazamiento y reduccin. Ejemplo 5.1 Dada la tabla de anlisis de la figura 5.2, que est construida con el mtodo SLR, vamos a hacer la traza del anlisis de la entrada "id tipo begin cdigo end". De la misma forma que para el anlisis descendente, compondremos una tabla en cuya primera columna situaremos el estado de la pila en cada momento, con la base en la izquierda y el tope en la derecha. En la columna central situaremos la entrada que se leer de izquierda a derecha y de la que se irn retirando los smbolos que ya hayan sido analizados. En la columna de la derecha se indicar la accin que se ha llevado a cabo en cada momento. La secuencia de reglas por las que se ha reducido constituyen la inversa de la derivacin por la derecha de la cadena de entrada. PILA 0 04 043 047 02 026
0 2 6 10
ENTRADA id tipo begin cdigo tipo begin cdigo begin cdigo begin cdigo begin cdigo cdigo
$ $ $ $ $ $ $ $ $ $ $
ACCIN d4 d3 r4 (B - tipo )
r5 (B -> id B )
84
B A end
Estado
end
0 1 2 3 4 5
begin
$ a!
S
1
Ir_a A B
2 5
d6 r4
d3
7 9
6
7 8 9 10
d8 r5
dlO
rl
r2
r3
Las casillas vacas de la tabla Accin son error, y estn marcadas con un guin. En la tabla Ir_a no se puede dar esta situacin si est bien construida, y por eso no se han marcado las casillas vacas como error.
5.3
Existen diferentes mtodos para construir tablas de anlisis por desplazamiento y reduccin. Uno de los ms sencillos (aunque no el mtodo ms general posible con un smbolo de preanalysis) es el mtodo SLR1. Para explicar el mtodo SLR para la construccin de tablas de anlisis es necesario definir previamente una serie de conceptos.
Elemento
Un elemento (tem en la bibliografa en ingls) se obtiene situando un punto "" en cualquier posicin de la parte derecha de una regla.
Xi X^ ... Xi
Xi+i
...Xn
Esta marca indica qu smbolos de una produccin han sido ya reconocidos (los que quedan a su izquierda, X~, k = 1,... ,, en la expresin anterior).
^er [Aho, Sethi y Ullman, 1990, pp. 227 y ss.], tambin en [Fischer y LeBlanc, 1991, pp. 161 y ss.].
5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS DE ANLISIS A partir de las producciones vacas ( A > e ) slo se obtiene un elemento: A > Ejemplo 5.2 Sea la gramtica del ejemplo 5.1:
S A C B B
85
tipo tino id B
B B A A A C C
Clausura La operacin clausura se aplica a un conjunto de elementos, /, y devuelve otro conjunto de elementos, clausura(I), que incluye /, segn las siguientes reglas: 1. Todo elemento del conjunto / se aade al conjunto clausura(I).
2. Si A a B(3 es un elemento de clausura(I) siendo B e N y B + a\ \a-2\ |c*n, ai.5- entonces se aaden los elementos B on a 22, . - . , i clausura(I) si no estaban. Esta regla se sigue aplicando hasta que no se puedan aadir ms elementos a clausura(I).
Ejemplo 5.3 Para la gramtica del ejemplo anterior, si tenemos el roninnto He plp.mp.ntas forBA end, el conjunto clausura({S mado nicamente por el elemento S
BA end}) seia:
S B B
BA end tipo id B
86
La operacin ir_a tiene dos argumentos: un conjunto de elementos / y un smbolo gramatical A (terminal o no terminal), y da como resultado otro coniunto de elementos. Se A3 nue hava en 7. a define como sigue: para todos los elementos de la forma B 3) al conjunto zr_a(7, A). aadir los elementos de dausura(B > aA
Ejemplo 5.4
Si el conjunto /fuese
S B B
S A B
B A end tino
id
A end egm C id B
5.3.1
El primer paso para construir una tabla de anlisis con el mtodo SLR es obtener la coleccin cannica de conjuntos de elementos, C. Para ello deben de darse los siguientes pasos: 1. Ampliar la gramtica aadindole la regla X > S, donde S es el smbolo inicial. 2. Aadir el conjunto IQ = clausura({X S}) a la coleccin C.
3. Para cada conjunto de elementos 7 de C, y para cada smbolo gramatical A (terminal y no terminal) para el que exista en 7 un elemento del tipo B a. 4/3, (3 E (N(JT)+ (es decir, que la marca no est al final del elemento), aadir r_o(/, A) a C si no se haba aadido antes. Esta operacin se repite hasta que no se aadan ms conjuntos nuevos a la coleccin de conjuntos de elementos C = {/o, A,...}. Es conveniente seguir un orden predeterminado para recorrer los smbolos gramaticales; por ejemplo, se puede empezar por los no terminales en orden de aparicin en la gramtica y seguir despus por los terminales, tambin en orden de aparicin en la gramtica.
Ejemplo 5.5
En la gramtica de los ejemplos anteriores, la coleccin cannica de conjuntos de elementos, C, se calculara as:
1. Se Calcula Tn = rln.ii..<>iirn( f Y
IQ {X
S,S
S}}: BA end , B
tipo , B
id B}
87
Se obtienen ahora los conjuntos de elementos correspondientes a r_o(/o,X), donde X es cualquiera de los smbolos que en algn elemento de /o est a continuacin de
un
S B
s }
Desde los conjuntos anteriores que slo tienen el "" al final no se puede seguir la construccin (/ l5 1$). Calculamos, por tanto, los nuevos conjuntos de ir.a con los elementos aue no tienen el "" al final. BA end}) 5 BA end } /5 = r_a(/2,^4) = dausura({S begin c}) + IQ r_a(/2, begin) = dausuraA f A > begin cdigo } C, C Es evidente que si se calcula r_a(/4,tipo) se vuelve a obtener /a, que ya existe. Tambin se puede comprobar que zr_a(/4,id) = /4. El nico conjunto nuevo que se obtiene es /7 = zr_a(/4,5) = clausura({B id 5 }) {B iB } De /s se obtiene: /s = zr_a(/5,end) = clausura({S > B A end {S * B A end }
=
4.
5.
6.
De 76: begin C >}} = {A /q = ir-a(If,C} = c/ausitro(A I 10 = ir_a(l6, cdigo) = clausura({C> cdigo }) = {c > cdigo }
begin C
7.
Todos los nuevos conjuntos de elementos llevan el "" al final, luego ya no se pueden construir nuevos conjuntos y la coleccin C {/o, / i , . . . , /io) ya est completa.
5.3.2
Una forma ms intuitiva de construir la coleccin cannica de conjuntos de elementos (y, como veremos ms adelante, la tabla de anlisis) es construir el autmata reconocedor de prefijos viables, utilizando el siguiente algoritmo: 0 = clausura({X > S}) = Si REPETIR PARA cada Ae N\JT / 3B-* a A/3 Si HACER Crear un nuevo estado Sn ir-a(Si,A) (si no existe) Crear una transicin S > Sn FIN _PARA En la siguiente iteracin considerar como Si cada Sn nuevo. HASTA no poder crear ms Sn
88
Los estados 5 del autmata son los conjuntos de elementos IQ, /i, ... de la coleccin cannica de elementos, C. Ejemplo 5.6 El autmata para la gramtica
E E
sera el de la figura 5.3.
E+B. a
Ejemplo 5.7 En la figura 5.4 se muestra el autmata reconocedor de prefijos viables para la gramtica que estamos estudiando en los ejemplos de este captulo.
89
5.3.3
Como se indic al principio de este captulo, las tablas de anlisis sintctico SLR estn divididas en dos partes con la siguiente estructura y valores para su indexacin:
TU{$}
Accin Estados
Ir_a
dj rk aceptar error
Estados
El mtodo de construccin de tablas SLR se puede resumir en los siguientes pasos: 1. Obtener la coleccin cannica de conjuntos de elementos C = {/o,/i,.. .,/n}2. Cada conjunto / de C se corresponde con el estado i del analizador. 3. Construccin de la tabla Ir_a: Se buscan no terminales que aparezcan antes del punto en el conjunto /i, es decir, elementos de la forma A > a B (3 donde B e N. Segn el mtodo de construccin de la coleccin C, existir un Ij tal que zr_o(/,5) = Ij. En este caso, en la entrada Ir_a[,B] habr que poner el estado j. 4. Construccin de la tabla Accin: (a) Para todos los elementos de la forma A > a a/3 (con a e T) en el conjunto 7, existir un Ij tal que r_a(/, a) = Ij. En este caso, la entrada Accion[, a] ser dj, es decir, desplazar e ir al estado j. (b} Para los elementos de /, con el Dunto al final de la regla, es decir, elementos de la forma / & i de la forma A hay que calcular los SiG(v4), y para todo s que aparezca en Sic(A) hay que poner en la entrada Accin[i, s] la accin rk, es decir, reducir por la regla nmero k. La regla X > S se aade solamente para construir la coleccin C, nunca se reduce por ella y, por tanto, no se numera. (c) Si el elemento X S est en el conjunto 7, poner aceptar en la entrada Accin [i, $]. (d) Todas las entradas de la tabla Accin que queden vacas son entradas errneas y por tanto el analizador debe producir un error cuando acceda a ellas.
Ejemplo 5.8 A partir de la coleccin cannica de conjuntos de elementos calculada en el ejemplo 5.5, vamos a construir la tabla de anlisis para la gramtica que estamos utilizando como ejemplo desde el principio de este captulo. La tabla de anlisis
90
SLR que va a resultar es la que aparece en la figura 5.2. Consideraremos que cada produccin est numerada segn el orden en el que estn escritas al presentar esta gramtica al principio del captulo. A partir de ella, se obtienen las siguientes casillas de la tabla: Estado 0: Puesto que ir_o(/o,5) = /i y tambin ir.a(I0,B) = /2, se llenan Ir_a[0,5] = 1 e Ir.a[0, B] = 2. Adems, desde el estado O se va al estado 3 con tipo (jr_a(/o,tipo) = I), y al estado 4 con id; as, Accin[0,tipo] = d3 y Accin[0,id] = d4. Como no hay ningn elemento en el conjunto IQ con el punto al final de la regla, no hay reducciones en el estado 0. Estado 1: La nica accin que hay que poner es Accin[l, $] =aceptar. Estado 2: En este estado hay que poner un 5 en Ir_a[2, A] porque r_a(/2, A) = /s, y tambin hay que poner en Accin[2,begin] la accin d6 ya que ir_a(/2, begin) = /e. Estado 3: El nico elemento del conjunto 1$ tiene el punto al final de la regla, luego en este estado slo habr que poner acciones de reduccin por la regla B > tipo en todos los SlG(B), que en este caso slo es begin. Por tanto, la nica accin en este estado ser Accin[3,begin] = r4. Estado 4: Desde este estado hay tres transiciones: con tipo se va a Iy (por tanto, Accin[4,tipo] = d3), con id vuelve al propio /4 (Accin[4,id] = d4), y con una B va al estado Ij (Ir_a[4, B] = 7). Estado 5: En este estado slo hay una transicin con end, luego hay que hacer Accin[5,end] = d8. Estado 6: En este estado hay una transicin a Ig con C (Ir_a[6, C] = 9), y a /io con cdigo (Accin[6,codigo] = dlO). Estado 7: En este estado hay que reducir por la regla B > id B en todos los SlG(B), luego hay que hacer Accin[7,begin] = r5. Estado 8: En este estado hay reducir por la primera regla en todos los SlG(S), luego hay que hacer Accin[8,$] = rl. Estado 9: De igual forma que en los dos estados anteriores, en este estado solamente hay que reducir por la regla A > begin C. El nico siguiente de A es end, luego habr que hacer Accin[9,end] = r2. Estado 10: Finalmente, en este estado hay que reducir por la regla de C en los SiG(C) (que son los Sic(A), es decir, solamente end), luego habr que hacer Accin[10,end] = r3.
5.3.4
En el algoritmo descrito para la construccin de la tabla SLR a partir de la coleccin cannica de elementos basta con sustituir los conjuntos de elementos Ii por los estados
91
del autmata Si (que tendrn idntica numeracin si el orden de construccin de los estados ha sido el mismo que el de aquellos conjuntos). La funcin de transicin se corresponde con las entradas de la tabla de la siguiente manera: 1. Las transiciones etiquetadas con un no terminal A con los valores de la tabla lr-a(Si,A}2. Las transiciones etiquetadas con un terminal a con los desplazamientos desde el estado 5 a Sj (dj) para ese terminal en la celda Accin [Si, a]. 3. La metodologa para poner las reducciones en la tabla es la misma que en el caso de las colecciones cannicas, pero usando los estados del autmata. En cada estado, es necesario calcular los siguientes de las partes izquierdas de aquellas producciones con el punto al final del elemento, y poner la reduccin correspondiente en la casilla de la tabla asociada a ese estado y a cada smbolo siguiente. Se puede comprobar esta tcnica aplicndola al autmata del ejemplo 5.7 para comprobar que sale la tabla de anlisis SLR de la figura 5.2.
5.4
En las tablas SLR (y en las de la familia LR en general) pueden aparecer dos clases de conflictos que provocan entradas mltiples en la tabla. La aparicin de un conflicto indica que la gramtica no es SLR, aunque podra ser LALR(l), LR(1), etc., o podra ser una gramtica de otro tipo o bien una gramtica ambigua. Es importante destacar que no todos los conflictos aparecen por culpa de que la gramtica sea ambigua; tambin existen gramticas no ambiguas que producen conflictos porque no son SLR.
Desplazamiento-reduccin
Este conflicto se da cuando en una misma entrada de la tabla Accin es posible desplazar y reducir con el mismo smbolo de la entrada. Aunque la gramtica no sea SLR, se podra construir el analizador resolviendo el conflicto, es decir, eligiendo una de las dos posibilidades (desplazar o reducir); la eleccin depende del lenguaje concreto que se quiera analizar y debe hacerse con mucho cuidado para conseguir un analizador que reconozca exactamente el lenguaje descrito por la gramtica y con la semntica deseada.
Ejemplo 5.9
Sea la siguiente gramtica2:
S S L L R
2
L =R R *R id L
92
Comprubese que esta gramtica tiene un conflicto desplazamiento-reduccin en el estado 2 o en el eme contenga los elementos 5 L 3,v R-+L ya que con el smbolo "=" es posible desplazar o reducir por la regla R > L.
Ejemplo 5.10 La siguiente gramtica es una simplificacin de una gramtica ambigua que define la construccin IF-THEN-ELSE de la mayora de lenguajes de programacin de alto nivel. Aunque la gramtica sea ambigua, muchos compiladores utilizan analizadores ascendentes que resuelven este conflicto escogiendo la opcin de desplazar en lugar de la de reducir; de esta forma, se asocia el ELSE al IF ms cercano.
5 S S S SeS o
Al construir la coleccion de conjuntos el conjunto Ij = { S --> is . , S --> is . es }. Si calcuamos los Sig(s) vercmos que son {"e", "o"}. Por tanto, en el astado j, en la entrada Accion[j,e podremos poner la accion rl o bien la accion dk, siendo k el estado correspondiente a lk= ir_a (Ij, e)En este caso concreto, si elegimos la accion de desplazar, dk, el analizador reconocera perfectamento, el lenguaje generado por la gramatica; si hubieramos elegido reducir, el analizador no podaia reconocer las cadenas con una "e", como por ejemplo "i o e o".
Reduccin-reduccin Este conflicto aparece cuando en una misma entrada de la tabla Accin es posible reducir por dos o ms reglas distintas ante el mismo smbolo en la entrada. La solucin ms razonable para resolver este conflicto suele ser cambiar la gramtica, aunque es posible elegir una de las reducciones y descartar las dems, teniendo en cuenta siempre que el analizador resultante debe reconocer exactamente el lenguaje definido por la gramtica. Ejemplo 5.11 La siguiente gramtica tiene un conflicto rcduccin-rcduccin:
S D A
93
Al hacer el autmata, encontramos que el estado 2 presenta ese conflicto, puesto que en ese estado se debe reducir por la regla A * e con los SlG(A), y por la regla B * e con los SlG(J5). El conflicto aparece porque "fin" pertenece a ambos conjuntos de siguientes.
5.5
Un analizador SLR se puede implementar a partir de una tabla de anlisis construida a mano, es decir, con lpiz y papel. En cuanto a los errores, existen dos tcnicas alternativas para producir mensajes de error: Es posible producir mensajes de error especficos rellenando aquellas casillas de la tabla Accin que queden vacas con un nmero que indique un mensaje de error particular para cada caso. Aunque la tabla Ir_a tenga entradas vacas, nunca se van a llegar a utilizar. Algunas entradas de la tabla Accin tampoco se utilizarn nunca, pero la mayora pueden ser utilizadas. En este caso, para reducir el nmero de mensajes de error especficos que hay que implementar se puede, en aquellos estados en los que existan reducciones y sean todas por la misma regla, extender esas reducciones tambin a las casillas vacas; de esta forma, los errores se detectarn al desplazar en lugar de al reducir. Cuando el lenguaje a analizar tiene un tamao medio, el nmero de estados crece considerablemente y una tcnica de mensajes de error especficos es muy costosa y laboriosa. Por este motivo, se pueden producir mensajes de error generales de la siguiente manera: cuando se produce el error, en el tope de la pila hay un estado s determinado; los smbolos esperados en lugar del token de la entrada son aquellos para los que la tabla Accin en la fila del estado s tenga alguna accin, ya sea una reduccin o un desplazamiento. Los mensajes de error producidos por un analizador SLR suelen ser diferentes (en el nmero de smbolos esperados) que los producidos por analizadores descendentes recursivos o con tabla para la misma gramtica. De igual forma que con los mensajes de error, es posible implementar una estrategia de recuperacin de errores especfica, que trate cada error o tipo de error de forma diferente. Sin embargo, lo normal es que el nmero de estados de una tabla SLR no permita emplear esta estrategia y se tenga que implementar una tcnica de recuperacin de errores general (no dependiente del lenguaje). Una buena tcnica de recuperacin de errores debe eliminar el menor nmero de tokens de la entrada antes de reanudar el anlisis, y a la vez debe dejar al analizador en un estado en el que sea posible analizar el resto de la entrada y detectar ms errores si los hubiera. Conseguir que se cumplan ambas condiciones a la vez es difcil y se debe intentar conseguir un compromiso entre ambas opciones, es decir, eliminar pocos tokens de la entrada y a la vez dejar el analizador en un estado en el que pueda continuar el anlisis.
94
5.6
Clasificacin de gramticas
Hemos visto que no todos los analizadores sirven para todas las gramticas, ya que a la hora de construir las tablas de anlisis hay que imponer determinadas restricciones a las gramticas. Vamos a ver una comparacin entre las gramticas que pueden ser analizadas segn cada uno de los mtodos, estableciendo as una comparacin entre distintos tipos de anlisis. Entre todos los mtodos existentes en la prctica, el ms amplio es el LR. Se sabe que, en lo que respecta a lenguajes de programacin, todos los que pueden ser analizados con analizadores LR(fc) , pueden serlo con LALR(l) o SLR, puesto que puede encontrarse una gramtica equivalente que verifique esta propiedad. Estos lenguajes se llaman deterministas y son un subconjunto propio de los de contexto libre. Por otra parte, puede demostrarse que los lenguajes LL(fc) son un subconjunto propio de los LR(/c). A continuacin se muestra un diagrama que muestra estas relaciones, en el que cada flecha representa la inclusin del conjunto que est al final de la flecha en el conjunto origen.
-L(k) LL(1)
LR(k) LR(1)
LALR(1)
SLR
LR(0)
La relacin entre las gramticas LL(1), SLR y las gramticas ambiguas (todas ellas independientes del contexto) es compleja y se podra definir con las siguientes afirmaciones: No existe ningn algoritmo para saber (en tiempo finito) si una gramtica G es ambigua o no. La nica forma de asegurar que una gramtica es ambigua es encontrando una cadena con dos o ms rboles de derivacin para esa gramtica. Una gramtica G es LL(1) si y slo si los conjuntos de prediccin de las reglas de cada variable son disjuntos entre s. Una gramtica G es SLR si es posible construir una tabla de anlisis SLR (sin entradas mltiples, obviamente) para ella. Si una gramtica tiene recursividad por la izquierda, entonces no es LL(1). Sin embargo, si una gramtica no es LL(1) no necesariamente tiene que tener recursividad por la izquierda. Si una gramtica tiene factores comunes por la izquierda, entonces no es LL(1). Que una gramtica G tenga recusividad por la izquierda o factores comunes por la izquierda no influye en que la gramtica sea o no SLR.
95
Las transformaciones para eliminar la recursividad por la izquierda (o los factores comunes por la izquierda) lo que hacen es construir una gramtica equivalente (que genera exactamente el mismo lenguaje). Si transformamos una gramtica G eliminando la recursividad por la izquierda y los factores comunes, obtendremos una gramtica equivalente G' que genera el mismo lenguaje y es posible que sea LL(1), pero no se puede asegurar siempre que G' sea LL(1). Si una gramtica G es ambigua, entonces no es LL(1), ni SLR, ni LR(1). Sin embargo, si G no es ambigua es posible que sea LL(1) y tambin es posible que no lo sea. De igual forma, una gramtica G no ambigua puede ser o no SLR. Si una gramtica G es LL(1), entonces no es ambigua (y puede que sea SLR). En cambio, si G' no es LL(1), es posible que sea ambigua y es posible que no lo sea. Por ejemplo, la siguiente gramtica no es LL(1) y no es ambigua:
E E+a E > a
Si una gramtica G es SLR, entonces no es ambigua (y puede que sea LL(1)). En cambio, si G' no es SLR, puede que sea ambigua o puede que no. Por ejemplo, la siguiente gramtica no es SLR (ni tampoco LL(1)) y no es ambigua:
S S
> >
Qq Rr
Q R A E
Se dice que un lenguaje L es LL(1) (o es SLR) si existe una gramtica LL(1) (o SLR) que genera ese lenguaje. Puede haber otras gramticas de otras categoras que generen ese lenguaje, e incluso puede haber gramticas ambiguas que generen un lenguaje LL(1) (o SLR). Nota: En la pgina 68 de [Appel, 1998] se puede observar, en la figura 3.29, un diagrama que muestra grficamente la relacin entre todos estos tipos de gramticas.
5.7
Referencias bibliogrficas
epigarfes;ke 5.1, 5.2 y 5.3 4.5 y 4.7 6.3.1, 6.3.2 y 6.3.3 6.1, 6.2, 6.4 y 6.11
REFERENCIAS
[Louden, 1997] [Aho, Sethi y Ullman, 1990] [Bennett, 1990] [Fischer y LeBlanc, 1991]
5.8. EJERCICIOS
96
5.8
Ejercicios
Ejercicio 5.1 A partir de la siguiente gramtica (de expresiones aritmticas), construir la tabla de anlisis SLR a partir del autmata reconocedor de prefijos viables y, a continuacin, hacer la traza del anlisis ascendente de la cadena "id * id + id":
E E T T F F
> > > > >
E +T T T *F F (E ) id
S inst
*
TRV
T R
R
r > c
V F F
e
> tipo
Escribid la tabla de anlisis sintctico SLR para esta gramtica y haced la traza del funcionamiento del analizador SLR para las cadenas "tipo id blq id ; f blq fin inst" e "id tipo id fin ;" Ejercicio 5.3 Dada la siguiente gramtica:
E E L Q Q
Escribid la tabla de anlisis sintctico SLR para esta gramtica y haced la traza del mcionamiento del analizador SLR para la cadena "[a, [a,a] ,]".
5.8. EJERCICIOS Ejercicio 5.4 Dada la siguiente gramtica: S S S D D D D E > > > > > > S inst SvarD e D ident E D ident sep int float S fproc
97
Construye una tabla de anlisis SLR para ella y haz la traza del funcionamiento del analizador para las cadenas "var int ident inst fproc inst" e "inst fproc". Ejercicio 5.5 Escribe la tabla de anlisis sintctico SLR para la gramtica siguiente:
S i d ( L ) S > id L e L -> SQ Q -+ e Q * , S Q
Haz tambin la traza de las cadenas "a(b())" y "c(d,e, ()". Ejercicio 5.6 Dada la siguiente gramtica:
S
A A B C C
ABC
Sin modificar en absoluto la gramtica (excepto la modificacin que prescribe el algoritmo, la de aadir una regla al principio), disea un analizador SLR para esa gramtica y haz la traza de la cadena "begin var tipo fvar end var tipo fvar".