Anda di halaman 1dari 18

Captulo 5

Anlisis sintctico ascendente


5.1 Introduccin
Recordemos ahora del captulo de anlisis sintctico que el anlisis ascendente, parte de la cadena de entrada y construye la inversa de la derivacin por la derecha para ella, que representa un recorrido del rbol de anlisis empezando por las hojas (donde estn los tokens), visitando nodos intermedios hasta llegar a la raz (el smbolo inicial), y recorriendo as el rbol de abajo a arriba. El problema clave del anlisis ascendente consiste en decidir cundo lo que parece ser la parte derecha de una produccin puede ser reemplazada por su parte izquierda. Esto no es trivial pues puede haber partes derechas comunes a varias producciones o producciones que derivan a e. La ventaja que presenta el anlisis ascendente es que es aplicable a un mayor nmero de gramticas que el descendente, pues para aplicar el anlisis ascendente lineal la gramtica debe ser LR(1) y este conjunto es mucho ms amplio que el de las gramticas LL(1). Adems, las gramticas LR(1) son ms adecuadas para la traduccin de los operadores binarios (asociativos por la izquierda o por la derecha) que las gramticas LL(1), que en muchos casos necesitan procesos de traduccin bastante ms complejos que aqullas, como veremos en los siguientes captulos. Existen varios algoritmos de anlisis ascendente lineal. El ms comnmente utilizado es el algoritmo de anlisis por desplazamiento-reduccin. Este algoritmo est basado en una pila y una tabla de anlisis, como un analizador descendente dirigido por tabla, pero tiene un funcionamiento completamente diferente, como veremos ms adelante. Existen distintos mtodos para construir tablas para el algoritmo de anlisis por desplazamientoreduccin: SLR, LALR(l), LR(1), etc. El ms sencillo de todos es el mtodo SLR, que es el que vamos a estudiar en este captulo. Las tablas construidas segn el mtodo SLR (Simple LR) se caracterizan por ser mucho compactas que las LR(1), pero el conjunto de gramticas SLR (analizables con tablas SLR) es ms reducido que el conjunto de gramticas LR(1). Existe un conjunto intermedio de gramticas, LALR(l), que es un subconjunto muy amplio de las LR(1) para el cual se pueden construir tablas casi tan compactas como las SLR. As como existe una condicin LL(1) que distingue a las gramticas susceptibles de ser analizadas mediante un ASDP, la condicin equivalente para las gramticas LR(1)
81

5.2. ANLISIS SINTCTICO POR DESPLAZAMIENTO Y REDUCCIN

82

se basa simplemente en la posibilidad de construir sin problemas las tablas de anlisis sintctico para analizadores ascendentes.

5.2

Anlisis sintctico por desplazamiento y reduccin

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

La figura 5.1 muestra este algoritmo en notacin pseudoalgortmica.

5.2. ANLISIS SINTCTICO POR DESPLAZAMIENTO Y REDUCCIN


push(O) /* estado inicial */ a := analexQ /* a siempre ser el siguiente token */ REPETIR sea s el estado en el tope de la pila SI Accion[s, a] = dj ENTONCES push(j) a : analexQ SI NO SI Accion[s, a] = rk ENTONCES PARA i := 1 HASTA Longitud_Parte_Derecha(fc) HACER pop() sea p el estado en el tope de la pila sea A la parte izquierda de la regla k push(Ir_a[p, A}) SI NO SI Accion[s, a] - aceptar ENTONCES fin del anlisis SINO error () FIN-SI HASTA fin del anlisis

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

0269 025 0258


01

end end end end end end end end end

$ $ $ $ $ $ $ $ $ $ $

ACCIN d4 d3 r4 (B - tipo )

r5 (B -> id B )

d6 dlO r3 (C cdigo ) r2 (A -> begin C ) d8 rl (S- BAend) aceptar

5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS DE ANLISIS


Gramtica: 5 A C B B

84

begin C cdigo tipo


id B
id d4 d4

B A end

Estado
end
0 1 2 3 4 5

begin

Accin cdigo tipo d3

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

Figura 5.2: Tabla de anlisis por desplazamiento y reduccin

5.3

Mtodo SLR de construccin de tablas de anlisis por desplazamiento y reduccin

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

B A end begin C cdigo tipo id B

Los posibles elementos que se pueden obtener de esa gramtica son:


S S S S B B B
4 end

tipo tino id B

B A end BA end BA end

B B A A A C C

id B id 5 begin C begin C begin C cdigo cdigo

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

5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS DE ANLISIS


Ir_a

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

el conjunto r_a(/,J3) sera:

A end egm C id B

5.3.1

Construccin de la coleccin cannica de conjuntos de elementos

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}

5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS DE ANLISIS S 2.

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

/i = ir_a(/o,5) = dausura({X /2 = ir.a(Io.B) = dausura({S


a begin C }

S B

}} = {X> A endd }) + \> > D /i ena


tino } id B,

s }

/3 r_a(/o,tipo) = clausura({B tipo }) = {B \ L ir_a(In.id} clausuraA ( B - id B}) + {BB tipo , B id B} 3.

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

Construccin de autmatas reconocedores de prefijos viables

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

5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS DE ANLISIS

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

Figura 5.3: Autmata reconocedor de prefijos viables.

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.

Figura 5.4: Autmata para la gramtica de ejemplo.

5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS DE ANLISIS

89

5.3.3

Construccin de tablas SLR

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

5.3. MTODO SLR DE CONSTRUCCIN DE TABLAS 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

Construccin de tablas SLR a partir del autmata reconocedor de prefijos viables

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

5.4. CONFLICTOS EN LAS TABLAS SLR

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

Conflictos en las tablas SLR

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

[Aho, Sethi y Ullman, 1990, p. 235]

5.4. CONFLICTOS EN LAS TABLAS SLR

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

id A \ id 5 fin prin A fin | e otro I e

5.5. MENSAJES DE ERROR EN UN ANALIZADOR SLR

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

Mensajes de error en un analizador SLR

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.

5.6. CLASIFICACIN DE GRAMTICAS nfmf;,f;;;fmf fnnfjjjpfnfjflldndndiediodmnd vc,

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)

Lenguajes independientes del contexto

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.

5.7. REFERENCIAS BIBLIOGRFICAS

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

> (A) -+ ( E ) > a > a

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

Ejercicio 5.2 Dada la siguiente gramtica: S


S

S inst
*
TRV

T R
R

r > c
V F F
e

> tipo

> blq Ffblq > idSfin > id; > e

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

[L] > a + EQ > ,L

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

> + > >

begin Cend e var tipo BC fvar

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

Anda mungkin juga menyukai