Está en la página 1de 43

TEMA 5

ANALISIS SINTACTICO ASCENDENTE

Bibliografa:

Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, t cnicas y herramientas, Tema 4, p ginas: 200-286. e a Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 5, p ginas: 197-256. a Vivancos, E. (2000), Compiladores I: una introducci on a la fase de an lisis, Tema 3, p ginas: 51-85. Especialmente para ejercicios. a a
Contenido: 1 An lisis ascendente: el aut mata desplaza/reduce. a o 2 Tipos de conictos: desplaza/reduce y reduce/reduce. 3 Gram ticas LR: a 3.1 Modo de operaci n del an lisis ascendente. o a 3.2 Mango de una forma secuencial derecha. 3.3 Elemento LR(0) y Aut mata nito de elementos LR(0). o 4 An lisis LR(0): a 4.1 Algoritmo de an lisis LR(0). a 4.2 Limitaciones del an lisis LR(0). a

94

5.1. ANALISIS ASCENDENTE: EL AUT OMATA DESPLAZA/REDUCE

5 An lisis SLR(1): a 5.1 Algoritmo de an lisis SLR(1). a 5.2 Resoluci n de conictos por precedencia de operadores. o 5.3 Limitaciones del an lisis SLR(1). a 6 An lisis LR(1) y LALR(1): a 6.1 Elemento LR(1). 6.2 Aut mata nito de elementos LR(1). o 6.3 Algoritmo de an lisis LR(1). a 6.4 Agrupaci n de estados: an lisis LALR(1). o a 7 An lisis sint ctico por precedencia de operadores. a a 8 Recuperaci n de errores en los analizadores ascendentes. o

5.1 ANALISIS ASCENDENTE: EL AUTOMATA DESPLAZA/REDUCE An lisis ascendente: se construye el arbol de an lisis sint ctico de la cadea a a na de entrada desde las hojas hasta la raz. En las hojas tenemos la cadena a analizar (los smbolos terminales) que se intentan reducir al axioma, que se encontrar en la raz, si la cadena es correcta sint cticamente. a a Como construir el arbol? Se trata de desplazarse en la entrada hasta encontrar una subcadena de smbolos que represente la parte derecha de una produccion, en ese mo mento sustituimos esa subcadena por el no-terminal de la parte izquierda correspondiente de la producci n, la reducimos. o Ejemplo: Supongamos la siguiente gram tica que permite generar exprea siones aritm ticas donde aparece el operador suma y potencia y combinar e n meros e identicadores. u

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

95

E E E E

E + E E E id num

Para la entrada id

+ id + id

E mtodo ascendente E E E E

id

id

id

Nos restringimos al caso de m todos deterministas (no hay vuelta atr s) e a analizando un s lo smbolo de prean lisis sabemos exactamente en todo o a momento que acci n realizar: bien desplazarnos en la entrada o bien aplio car una reducci n. En el caso de una reducci n debemos saber de forma o o unica que producci n aplicar. o Los m todos ascendentes se caracterizan porque analizan la cadena de e componentes l xicos de izquierda a derecha, obtienen la derivaci n m s e o a a la derecha y el arbol de derivaci n se construye desde la raz hasta las o hojas.

5.2 TIPOS DE CONFLICTOS

Qu acci n realizar: desplazar o reduccir? e o Qu producci n elegir al reducir cuando hay varias posibles? e o
Conicto desplaza-reduce:

96

5.2. TIPOS DE CONFLICTOS

E + E E

E id num

Para la entrada 2

E E
2 2^3=8

8^2=64

E
2

2^9=512

E
3

E
3

E E

3^2=9

E ^

num
2

num
3

num
2

num
2

num
3

num
2

reducir
(a) Arbol incorrecto (b) Arbol correcto

desplazar

Conicto reduce-reduce: Supongamos una sencilla gram tica que permite generar sentencias que a son bien llamadas a procedimientos o asignaciones.
S V E id V:=E id id num

Para la entrada suma := 3, equivalente a los componentes l xicos: id e := num, tenemos las posibilidades

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

97

id

:=

num

id

:=

num

reducir S --> id
(a) Arbol incorrecto

reducir V --> id
(b) Arbol correcto

5.3 GRAMATICAS LR Los m todos de an lisis sint ctico LR permiten reconocer la mayora de e a a las construcciones de los lenguajes de programacion. Son m todos muy e potentes, con mayor poder de reconocimiento que los m todos LL (Las e gram ticas LL son un subconjunto de las gram ticas LR). a a Las gram ticas LR(k) se caracterizan porque: a

L: Procesamos la cadena de entrada de izquierda a derecha (from leftto-right) R: proporcionan la derivaci n m s a la derecha de la cadena de entrao a da en orden inverso (rigth-most derivation) k: se examinan k-smbolos de la entrada por anticipado para tomar la decisi n sobre la acci n a realizar. o o
Ventajas: es un m todo potente que permite reconocer la mayora de las e construcciones de los lenguajes de programacion con k=0,1. Es un m todo e sin retroceso y por tanto determinista. Desventajas: los m todos son difciles de comprender, de implementar a e

98

5.3. GRAMATICAS LR

mano y de realizar una traza. Necesidad de usar generados autom ticos de a analizadores sint cticos LR. Por ejemplo: Bison (para Linux) y Yacc (yet a another compiler compiler) para Unix. Dentro del an lisis sint ctico LR se distinguen cuatro t cnicas: a a e

El m todo LR(0). Es el m s f cil de implementar, pero el que tiene e a a menos poder de reconocimiento. No usa la informacion del smbolo de prean lisis para decidir la acci n a realizar. a o El m todo SLR(1) (del ingl s Simple LR). Usa ya un smbolo de e e prean lisis. a
El m todo LR(1). Es el m s poderoso y costoso. El tamano del e a autom ta a pila para el reconocimiento se incrementa considerablea mente.

El m todo LALR(1) (del ingl s Look-Ahead LR, con smbolo de ane e ticipaci n). Es una version simplicada del LR(1), que combina el o coste en tama o (eciencia) de los m todos SLR con la potencia del n e LR(1).
Jerarqua de las gram ticas: a
GIC GIC no ambigua LR(k) LR(1) LALR(1) SLR(1) LR(0) LL(1) LL(k)

La diferencia que hace a los m todos LR m s poderosos que los LL e a es que los primeros disponen de la informacion de la entrada y los estados

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

99

por lo que ha ido pasando el analizador (la cadena que ha ido reconociendo hasta ahora), mientras que los m todos LL s lo disponen de la informaci n e o o de la entrada.

para que una gram tica sea LR(k) tenemos que ser capaces de recoa nocer la presencia del lado derecho de una produccion habiendo visto todo lo que deriva del lado derecho y usando k-smbolos por antici pado. para que una gram tica sea LL(k) tenemos que ser capaces de reconoa cer el uso de una producci n viendo s lo los k-smbolos que derivan o o su lado derecho.
Modo de operaci n del an lisis ascendente: o a De forma esquem tica un analizador sint ctico consta de: a a
a
1

a2

a i en V T

S X

Programa conductor Salida

m-1

S1 X1 S0 X i en V U VN T accin[S m , a i ]=d,r,error,aceptar ir_a[ S m , VN ]=Sm+1 accin ir_a Tabla de anal. sintctico

La entrada formada por la serie de componentes l xicos a reconocer. e

100

5.3. GRAMATICAS LR

Un programa conductor que lee tokens de la cadena de entrada de uno en uno y utiliza una pila para almacenar los smbolos que va reconociendo y los estados por los que pasa el analizador. Una pila. El contenido de la pila es de la forma , donde cada son smbolos de la gram tica que se van reconociendo, a , y los son los estados por los que pasa el analizador. Los smbolos terminales se introducen en la pila mediante desplazamientos de la cadena de entrada a la pila, los no-terminales se apilan como resultado de hacer una reduccion.

La tabla de an lisis sint ctico formada por dos partes. La primera a a indica que acci n se debe de reao parte es de la forma a lizar si observamos en la entrada el token y el analizador est en el estado . Las acciones posibles son: desplazar, reducir, error, aceptar. La segunda parte es de la forma indica el estado al que tenemos que ir despu s de hacer una reducci n. e o Salida: la derivaci n m s a la derecha de la cadena de entrada en o a orden inverso (de abajo hacia arriba).
Denici n de mango (handle): o Mango o asidero: conjunto de smbolos terminales y no-terminales en la cima de la pila que forman la parte derecha de una producci n y que se o pueden reducir sacandolos de la pila y sustituyendolos por el no-terminal de la parte izquierda de la producci n. o
Pila V U VNT T 1 2 k Resto de la entrada i 1 2 i+1 k V* T

Mango existe j in VNT tal que j

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

101

Resumiendo lo visto hasta ahora necesitamos:

Un mecanismo que nos determine el tipo de acci n a realizar: desplao zar o reducir. En el caso de que tengamos que reducir nos debe proporcionar la subcadena de smbolos a reducir (el mango) y qu producci n a utilizar. e o
Este mecanismo nos lo proporciona el Automata Finito Determinista de elementos LR(0).

5.3.1 Denici n de Elemento LR(0) y Construcci n del Aut mata Fio o o nito de elementos LR(0) Un elemento de an lisis sint ctico LR(0) de una gram tica G, es una a a a producci n de G con un punto en alguna posicion del lado derecho. o

siendo una producci n. Este punto separa la parte que se o ha analizado hasta ese momento, y por tanto est en la cima de la pila, a de la parte que se espera a n analizar, que es el resto de la cadena de u tenemos los posibles entrada. Por ejemplo para la producci n o siguientes items LR(0):

se espera en la entrada una cadena derivable de XYZ se ha reconocido una cadena derivable de X y se espera en la entrada una cadena derivable de YZ Item completo. Indica que ya se ha reconocido por completo una cadena derivable de A. Hemos encontrado el mango.

102

5.4. ANALISIS LR(0)

Aut mata nito de elementos LR(0) o Los estados son los propios items LR(0). Las transiciones son de la forma: o Si tenemos una transici n

Si

tenemos una transici n o

y adem s a

En el primer caso, cuando signica que hemos reconocido X en la entrada y estamos haciendo un desplazamiento del terminal X desde la entrada a la cima de la pila. En el segundo la interpretaci n es m s complio a cada. Signica que hemos reconocido un no-terminal como consecuencia de haber hecho una reducci n, por tanto tenemos que haber reconocido ese o no terminal previamente, por tanto tenemos que a adir transiciones a estan dos que indiquen que vamos a reconocer ese no-terminal. Adem s, como a no consumimos ningun token de la entrada son -transiciones.

5.4 ANALISIS LR(0) El an lisis LR(0) es el m s sencillo de los m todos ascendentes. No usa a a e informaci n de la entrada, el smbolo de prean lisis, para decidir la acci n o a o a realizar. Algoritmo de an lisis LR(0) a Sea el estado de la cima de la pila. Entonces:

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

103

Si el estado contiene cualquier item de la forma con terminal , entonces la acci n es desplazar a la pila. El o nuevo estado al que pasa el analizador, y que se coloca en la cima de la pila, es aquel que contenga un item de la forma . Si el estado contiene un item de la forma , entonces la . Sacamos acci n es reducir aplicando la producci n o o elementos de la pila y el estado que queda al descubierto debe conte , metemos el no-terminal en ner un item de la forma la pila y como nuevo estado, aquel que contenga el item de la forma . Si no se puede realizar ninguna de las acciones anteriores entonces error.
Se dice que una gram tica es LR(0) si la aplicaci n de las reglas anteriores a o no son ambiguas, es decir, que si un estado contiene un item de la forma , entonces no puede contener cualquier otro item. Si se produjera eso apareceran conictos. En efecto:

Si tuviera adem s un item de la forma a tendramos un conicto desplaza-reduce. Si tuviera adem s un item de la forma a conicto reduce-reduce.

con

terminal

, se producira un

Por tanto, una gram tica es LR(0) sii cada estado es bien un estado a de desplazamiento (contiene s lo items que indican desplazar) o bien un o estado de reducci n (contiene un unico item completo). o

104

5.4. ANALISIS LR(0)

Ejemplo: Consideremos la siguiente gram tica para generar par ntesis anidados: a e


El AFD de elementos LR(0) es:

A S A A
I0

.A .(A) .a

I1

A. (.A) .(A) .a A I4 A (
I3 I2

( a

A I3 A A

(A.)

)
I5

(A).

a A
I2

a.

A partir del aut mata se construye la tabla de an lisis sint ctico: o a a


Estado 0 1 2 3 4 5 Acci n o desplazar reducir (acep.) reducir desplazar desplazar reducir

Entrada ( a ) 3 2

Ir a A 1

3 2 5

Hacer notar que no hemos necesitado conocer el tipo de token que tenamos en la entrada para decidir la acci n a realizar. o Veamos el contenido de la pila, la entrada y la acci n a realizar para la o entrada ((a))#

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

105

PILA #0 #0(3 #0(3(3 #0(3(3a2 #0(3(3A4 #0(3(3A4)5 #0(3A4 #0(3A4)5 #0A1

ENTRADA ((a))# (a))# a))# ))# ))# )# )# # #

ACCION desplazar desplazar desplazar reducir desplazar reducir desplazar reducir aceptar

Obtenemos la derivaci n m s a la derecha de la cadena de entrada: o a . Limitaciones del an lisis LR(0): a Supongamos la gram tica siguiente: a

El AFD de elementos LR(0) correspondiente es:


Conflicto desplaza/reduce

E E E
I0

.E .n .E+n

E n
I1

E E

E. E.+n

+
I3

E
I4

E+.n n E+n.

E
I2

n.

En el estado I1 tenemos un item que indica desplazar y . Tenemos un conicto desplaza/reduce, otro que indica reducir seg n el algoritmo LR(0). u Existen determinadas construcciones de los lenguajes de programaci on

106

5.5. ANALISIS SLR(1)

que no pueden ser reconocidas por este tipo de m todo. Para solucionar e este problema se introduce el an lisis SLR(1). a

5.5 ANALISIS SLR(1) Este tipo de an lisis usa el AFD construido a partir de elementos LR(0) a y usa el token de la cadena de entrada para determinar el tipo de acci n a o realizar. Este m todo consulta el token de la entrada antes de realizar un e desplazamiento para tener seguro que existe una transicion correspondiente en el estado en el que se encuentra el analizador (sino sera un error) y en el caso de que se tenga que hacer una reduccion se comprueba que el token actual pertenece al conjunto de SIG del no-terminal al que se quiere reducir (sino sera un error). Algoritmo de an lisis sint ctico SLR(1) a a Sea el estado de la cima de la pila. Entonces:

Si el estado contiene cualquier item de la forma con terminal ( ) y es el siguiente terminal en la entrada, a la pila. Como nuevo estado al entonces la acci n es desplazar o que pasa el analizador apilamos aquel que contenga un item de la . forma Si el estado contiene un item de la forma y el siguiente token en la entrada est en SIG(A), entonces la acci n es reducir a o . Sacamos elementos de la aplicando la producci n o pila y el estado que queda al descubierto debe contener un item de , metemos el no-terminal en la pila y como la forma . nuevo estado, aquel que contenga el item de la forma Si el smbolo en la entrada es tal que no se pueden realizar ninguna de las acciones anteriores entonces error.

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

107

Se dice que una gram tica es SLR(1) si la aplicaci n de las reglas antea o riores no son ambiguas. Es decir, una gram tica es SLR(1) sii se cumple a para cada estado una de las siguientes condiciones:

Para cada item de la forma en con terminal, no existe un item completo en , con . Sino tendramos un conicto desplaza-reduce. Para cada par de items completos y en , entonces . De lo contrario se producira un conicto reduce-reduce.
El aspecto de la tabla de an lisis sint ctico cambia respecto al an lisis a a a LR(0), puesto que un estado puede admitir desplazamientos o reducciones dependiendo del token en la entrada. Por tanto, cada entrada debe tener una etiqueta de desplazamiento o reducci n. o Ejemplo: Para la gram tica: a Reglas:

Regla 0 1 2 E E E E E+n n

El AFD de elementos LR(0) correspondiente es:


E E E
I0

.E .n .E+n

E n
I1

E E

E. E.+n

+
I3

E
I4

E+.n n E+n.

E
I2

n.

108

5.5. ANALISIS SLR(1)

Comprobemos que segun el an lisis SLR(1), ahora no existe conicto a . desplaza/reduce en el estado . En efecto:

La tabla de an lisis sint ctico es: a a


# estado 0 1 2 3 4 n d2 Entrada + # Ir a E 1

d3 aceptar r2 r2 d4 r1 r1

Tabla 5.1: Tabla de an lisis sintactico a

Consideremos la entrada n+n+n# y veamos el contenido de la pila, la entrada y la acci n a realizar. o


PILA #0 #0n2 #0E1 #0E1+3 #0E1+3n4 #0E1 #0E1+3 #0E1+3n4 #0E1 #0E ENTRADA n+n+n# +n+n# +n+n# n+n# +n# +n# n# # # # ACCION desplazar d2 reducir r2 E n desplazar d3 desplazar d4 reducir r1 E E+n desplazar d3 desplazar d4 reducir r1 E E+n reducir r0 aceptar

Limitaciones del an lisis SLR(1): a El an lisis SLR(1) es simple y eciente. Es capaz de describir pr cticamente a a todas las estructuras de los lenguajes de programaci on. Pero existen algunas situaciones donde este tipo de an lisis no es sucientemente poderoso a y falla. Veamos un ejemplo simplicado de la gram tica en Pascal que a

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

109

genera las llamadas a procedimientos y las asignaciones de expresiones a variables. Supongamos la gram tica siguiente: a
S V E id V:=E id V num
Conflicto reduce/reduce id V S id . id .

S S S V

. . . .

S id V := E id

Existe un conicto reduce/reduce, segun el algoritmo SLR(1), porque y , de manera que . Imaginemos que estamos observado por tanto no sabemos si es el nal de la llamada a un procedimiento o es el nal de una de una expresi n o (una expresi n es una variable). o Los conictos reduce/reduce no son habituales y suelen ser un sntoma de un mal dise o de la gram tica. n a

5.6 ANALISIS LR(1) Para solucionar este problema se introduce el m todo m s general que e a existe, el llamado an lisis sint ctico LR(1). Este es el m todo m s podea a e a roso que existe, a costa de que se incrementa la complejidad (un factor de 10 respecto a los m todos que usan el AFD de items LR(0)). e Las limitaciones del m todo LR(0) y SLR(1) radican en que tienen en e cuenta el smbolo de prean lisis despu s de la construcci n del AFD de a e o items LR(0), que por s misma ignora los smbolos siguientes en la entrada.

110

5.6. ANALISIS LR(1)

5.6.1 Denici n de Elemento LR(1) y Construcci n del Aut mata o o o nito de elementos LR(1) Un elemento de an lisis sint ctico LR(1) de una gram tica G, es un a a a par consistente de un item LR(0) y un smbolo de prean lisis. a

el token de prean lisis. a

siendo

un item LR(0) y

, indica que ya se ha reconocido por Un item completo completo una cadena derivable de A y reducir siempre que en la entrada e tenga el token .

Aut mata nito de elementos LR(1) o Los estados son los propios items LR(1). Las transiciones son de la forma: o Si tenemos una transici n

Si

tenemos una transici n o

y adem s -transiciones a

El estado inicial del AFD se obtiene ampliando la gram tica, como para a el caso de items LR(0), y poniendo como smbolo de prean lisis . a

que signica que reconoceremos una cadena derivable de smbolo .

seguida del

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

111

Algoritmo de an lisis sint ctico LR(1) a a Es b sicamente igual al algoritmo de an lisis SLR(1), excepto que usa a a el smbolo de prean lisis en vez del conjunto de SIG. a Sea el estado de la cima de la pila. Entonces:

Si el estado contiene cualquier item de la forma con terminal ( ) y es el siguiente terminal en la entrada, a la pila. Como nuevo estado al entonces la acci n es desplazar o que pasa el analizador apilamos aquel que contenga un item de la . forma Si el estado contiene un item de la forma y el siguiente o token en la entrada es , entonces la acci n es reducir aplicando la . Sacamos elementos de la pila y el estado producci n o que queda al descubierto debe contener un item de la forma , metemos el no-terminal en la pila y como nuevo estado, . aquel que contenga el item de la forma Si el smbolo en la entrada es tal que no se pueden realizar ninguna de las acciones anteriores entonces error.
Se dice que una gram tica es LR(1) si la aplicaci n de las reglas anteriores a o no son ambiguas. Es decir, una gram tica es LR(1) sii se cumple para cada a estado una de las siguientes condiciones:

Para cada item de la forma nal, entonces no existe un item completo tendramos un conicto desplaza-reduce.

en con termi en . Sino

No existen dos items completos de la forma y en . De lo contrario se producira un conicto reduce-reduce.


La tabla de an lisis sint ctico tiene el mismo aspecto que para el caso a a SLR(1).

112

5.6. ANALISIS LR(1)

Supongamos la gram tica y calculemos el AFD de items LR(1) a


S V E id V:=E id V num

S [S [S [S [V
I0

[S [V [S

S . , #] id ., :=] id ., #]

I1

. S, #] . id, #] . V := E, #] . id, :=] V

id

I2

[S
I3

V . := E, #] E

:=

I4

[ S [E [E [V V

V := . E , #] .V,#] . n, #] . id, #] id

n [E n . , #]
I8

[S

V := E . , #]
I5

[E

V . , #]
I6

[V

id . , #]
I7

Se ha evitado el conicto que apareca en el estado .

5.6.2 An lisis LALR(1) a Una modicaci n del m todo LR(1), llamada m todo LALR(1) mano e e tiene el poder del LR(k) y preserva la eciencia del SLR(1). El an lisis a LALR(1) se basa en la observacion de que en muchos casos el tamano grande del AFD de items LR(1) se debe a la existencia de muchos estados diferentes que tienen igual la primera componente, los items LR(0), y dieren s lo de la segunda componente, los smbolos de prean lisis. o a Lo que haremos es identicarlos como un unico estado combinando los

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

113

smbolos de prean lisis. Si el proceso est bien hecho, llegaremos a un a a aut mata como el de items LR(0), excepto que cada estado tiene smbolos o de prean lisis. a El algoritmo de an lisis LALR(1) es id ntico al LR(1). a e Por ejemplo para la gram tica para generar par ntesis anidados: a e


El AFD de elementos LR(1) resultante despu s de combinar estados es: e

S [S [A [A
I0

[S [A

A . , #] n ., # ) ]

I1

. A, #] . ( A ), #] . n , #] ( n

I3

[A [A [A

( . A), #)] . n , )] . ( A ) , )] (
I2

A [A ( A . ), # )]
I4

[A
I5

( A ) . , # )]

5.7 ANALISIS SINTACTICO POR PRECEDENCIA DE OPERADORES Existe una clase especial de gram ticas, las gram ticas de operadores, a a para las cuales se puede construir con facilidad a mano ecientes analizadores sint cticos. Se dice que una gram tica es de operadores si: a a

No contiene no-terminales adyacentes.

114

5.7. ANALISIS SINTACTICO POR PRECEDENCIA DE OPERADORES

No contiene - producciones.
Ejemplo

El an lisis sint ctico por precedencia de operadores es util para el an lisis a a a sem ntico ya que el valor de la expresi n es un atributo sintetizado ( de a o hijos a padres) que se calcula en forma ascendente, pero existe el problema de la ambig edad. Para resolverlo introducimos precedencias entre los u terminales, que servir n para guiar la selecci n de la subcadena a reducir a o (el mango). Existen tres tipos de relaciones de precedencia que representaremos por los smbolos:

, signica que , signica que , signica que

cede la precedencia a . tiene la misma precedencia que . tiene mayor precedencia que .

La tabla de an lisis sint ctico es una tabla con dos entradas. Las las a a indican el operador que ya est en la pila y las columnas indican el operaa dor en la entrada. Para construir la tabla de an lisis sint ctico tendremos a a en cuenta que:

Si

son dos operadores tales que tiene mayor precedencia que , hag se y . Por ej: . a

Si

son dos operadores de igual precedencia entonces hag se: a y , si son asociativos por la izquierda. y , si son asociativos por la derecha. Por ej: .

Respecto a los otros no terminales: Respecto al nal de cadena, . general,

. En

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

115

Veamos como las relaciones de precedencia nos van a servir para guiar la selecci n de las cadenas a reducir. EL smbolo va a marcar el extremo o izquierdo del mango, el smbolo va a marcar el extremo derecho y , en caso de que aparezca, ser siempre en el interior del mango. Entonces, la a cadena a reducir se puede encontrar mediante el siguiente proceso: 1 Examnese la cadena desde el principio hasta encontrar el . 2 Despu s examnese la cadena hacia atr s, saltando los e a trar . 3 El mango es todo lo que est a la izquierda del a . Por ejemplo para la entrada large
od + id * id

hasta encon-

y a la derecha del


Algoritmo de an lisis sint ctico por precedencia de operadores a a Entrada: Una cadena de componentes l xicos y una tabla de relaciones e de precedencia. a a a Salida: Si est bien formada, una estructura de arbol de an lisis sint ctico sino una indicaci n de error. o a M todo: Tenemos dos variables: (un puntero al terminal m s cerca de la e cima de la pila) y (un puntero al primer smbolo de la entrada que queda por analizar). Inicialmente, la pila contiene y en el buffer de entrada la cadena . terminar=falso repetir si PILA==#S y b==# entonces terminar=verdadero

116

5.7. ANALISIS SINTACTICO POR PRECEDENCIA DE OPERADORES

sino si

o entonces desplazar a la pila

sino si

entonces reducir, el mango est formado un extremo por a la cima de la pila y el otro se desapila hasta encontrar un smbolo terminal , tal que existe un smbolo por debajo de , tal que . sino error nsi

nsi nsi hasta terminar==verdadero

Ejemplo

+ + * ( ) id # * (


id #


error1()


error2()

error1()


error1()


error4()

error1()

error3()

Recuperaci n de errores: Recuperaci n a nivel de frase: al deso o cubrir el error el analizador sint ctico realiza una correcci n local de la a o entrada, para ello: inserta, elimina o sustituye un smbolo de la cadena de entrada a partir del punto donde se ha encontrado el error por otro que le permita continuar con el an lisis (por ejemplo: (, +, id). a

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

117

Procedimientos de error:
error1()

printf(Falta operador:

inserto + );

error2()

printf(Parntesis no equilibrado: e

inserto ( );

error3()

printf(Falta expresin); o

error4()

printf(Parntesis no equilibrado: e

inserto ) );

5.8 RECUPERACION DE ERRORES SINTACTICOS Los programas pueden contener errores de muy diverso tipo. En general se trata de: errores de ortografa por no tener el cuidado suciente al programar, errores por desconocer o no comprender bien los requisitos formales del lenguaje o por la confusi n con otro lenguaje que el programador o utiliza habitualmente (por ejemplo al usar a la vez Pascal y Modula-2). Dependiendo de la fase del compilador en la cual se detectan, los errores se clasican en:

l xicos: pueden ocasionarse por usar un car cter inv lido, que no pere a a tenezca al vocabulario del lenguaje de programaci n, al escribir mal o

118

5.8. RECUPERACION DE ERRORES SINTACTICOS

PILA # # id #E #E* #E*( # E * ( id #E*(E #E*(E+ # E * ( E + id #E*(E+E #E*(E #E*( E) #E*E #E

ENTRADA id*(id+id)# * (id+id)# *(id+id)# (id+id) # id+id) # + id)# + id)# id)# )# )# )# # # #

ACCION desplazar reducir desplazar desplazar desplazar reducir desplazar desplazar reducir reducir desplazar reducir reducir aceptar

un identicador, palabra reservada u operador.

sint cticos: se producen cuando el analizador sint ctico espera un a a smbolo terminal en cierta posici n de la gram tica que no corres o a ponde con el que se acaba de leer. Por ejemplo, en una expresi n o aritm tica con par ntesis no equilibrados. e e sem nticos: corresponden a la sem ntica del lenguaje de programaa a ci n la cual no est descrita en la gram tica. Por ejemplo: un opeo a a rador aplicado a un operando incompatible o uso de una variable no declarada. de ejecuci n: son errores de ejecuci n por ejemplo el uso de un ndice o o en una matriz fuera del rango especicado, usar un puntero no inicializado o intentar una divisi n por cero o la raz cuadrada de un n mero o u negativo. Son detectados por el sistema de ejecuci n cuando el proo grama fuente se ha compilado con una determinada opcion en la que se generan ciertas acciones autom ticamente para tratar estos casos. a Lo usual es que se informe del error y se detenga la ejecucion.

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

119

l gicos: especialmente en entornos de ensenanza, un compilador deo be tambi n informar de errores l gicos que pueden ser potenciales e o errores como variables declaradas pero no usadas, instrucciones que no son alcanzables, y operaciones aritm ticas sin signicado, como e la suma de un valor cero a una variable. La mayor parte de la detecci n de errores en un compilador se centra o en la fase de an lisis sint ctico. La raz n es porque muchos errores son de a a o naturaleza sint ctica. En esta secci n se presentan algunas t cnicas b sicas a o e a para recuperarse de errores sint cticos y su implantaci n en los diferentes a o m todos de an lisis sint ctico estudiados. e a a La mayora de las especicaciones de los lenguajes de programaci n no o describen c mo debe responder un compilador a los errores; la respuesta o se deja al dise ador del compilador. Un buen gestor de errores: n

Debe informar de la presencia de errores con claridad y exactitud, de manera que permita al programador encontrar y corregir f cilmente a los errores en su programa. Se debe recuperar de cada error con la suciente rapidez y sin perder demasiada informaci n de la entrada para detectar errores posteriores. o No debe retrasar de manera signicativa la compilaci n de programas o correctos.
El gestor de errores debe imprimir la lnea y la columna donde se ha detectado el error. Tambi n se debe incluir un mensaje de diagn stico sue o cientemente informativo, por ejemplo se espera punto y coma en esa posici n. En la mayora de los casos no es conveniente que el proceo so de an lisis sint ctico se detenga despu s de encontrar el primer error, a a e ya que podran existir m s errores en la entrada. Adem s, puesto que la a a compilaci n de un programa puede tardar varios minutos, el programador o espera que la compilaci n detecte todos los errores posibles en el mismo o

120

5.8. RECUPERACION DE ERRORES SINTACTICOS

momento. Se debe entonces implantar una recuperacion del error, donde el analizador sint ctico intenta volver el mismo a un estado consistente en a el que el procesamiento de la entrada pueda continuar. Los m todos y detectan un error lo antes posible, se dice que e tienen la propiedad del prejo viable, lo cual quiere decir que detectan el error nada m s ver un prejo de la entrada que no es un prejo de ninguna a cadena del lenguaje. En los analizadores LR los errores sint cticos se dea tectan cuando a partir del estado que actualmente se encuentra en la cima de la pila no existe ninguna transici n denida con el car cter actual de eno a trada. El contenido de la pila representa el contexto a la izquierda del error y el resto de la cadena de entrada el contexto a su derecha. La recuperaci n o de errores se lleva a cabo modicando la pila y/o la entrada de forma que el analizador puede llegar a un estado adecuado para poder continuar con el an lisis de la entrada. En los analizadores sint cticos LL los errores de a a sintaxis se detectan cuando un terminal en la cima de la pila no coincide con el smbolo actual en la entrada o cuando el smbolo de prean lisis y a el no-terminal de la cima de la pila nos lleva a una entrada de la tabla de an lisis sint ctico que est vaca. a a a Hay que hace notar que cualquier reparaci n efectuada por el compio lador tiene el n unico de continuar la b squeda de otros errores, no de u corregir el c digo fuente. o

5.8.1 Estrategias de recuperaci n de errores sint cticos o a Aunque hay muchas estrategias que se pueden emplear para la recuperaci n de errores, ninguna de ellas ha demostrado ser universal (que o sirva para todos los lenguajes de programacion y m todos de an lisis). e a El proceso de recuperaci n siempre debe basarse en hipotesis (estrategias o heursticas) acerca sobre el tipo de errores m s comunes y esto hace que a siempre dependa del lenguaje. Sin embargo, algunos m todos tienen ame plia aplicabilidad.

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

121

1 Recuperaci n de emergencia (o en modo de panico): al detectar un o error, el analizador desecha smbolos en la entrada hasta que encuen tra uno perteneciente a un conjunto de componentes l xicos de sine cronizaci n. Estos componentes de sincronizacion son generalmente o delimitadores de sentencia como el punto y coma, la palabra end de nal de bloque o cualquier palabra clave que pueda ser inicio de una proposici n nueva. Es el m todo m s sencillo de implantar y puede o e a ser usado por la mayora de los m todos de an lisis sint ctico, pero e a a s lo reconoce un error por proposicion, unidad sint ctica. Esto no o a es necesariamente una desventaja ya que no es probable que ocurran varios errores en la misma proposicion. Es tarea del dise ador del n compilador elegir un conjunto adecuado de componentes de sincronizaci n. o 2 Recuperaci n a nivel de frase: al descubrir el error el analizador o sint ctico realiza una correcci n local de la entrada, para ello: ina o serta, elimina o sustituye un smbolo de la cadena de entrada a partir del punto donde se ha encontrado el error por otro que le permita continuar con el an lisis (por ejemplo: insertar un punto y coma faltante a al nal de una sentencia). Es el dise ador del compilador el que debe n elegir que tipo de modicaci n se debe realizar en cada caso. o 3 Recuperaci n mediante producciones de error (o expansi on de la o gram tica): si se tiene una buena idea de los errores m s comunes que a a se pueden encontrar, se puede aumentar la gram tica del lenguaje con a producciones que generan las construcciones err oneas, producciones de error, los errores quedan as legalizados, que no quiere decir que no sean detectados, ya que se incluyen las acciones correspondientes para informar de la detecci n. Se usa entonces esta gram tica ampliao a da para construir el analizador sint ctico. a 4 Recuperaci n mediante correcci n global: dada una cadena de entrao o a da con errores, x, y una gram tica se trata de encontrar otra cadena, y, correcta tal que el n mero de inserciones, supresiones y sustituciones u e para transformar x en y sea el mnimo posible. Estos m todos son

122

5.8. RECUPERACION DE ERRORES SINTACTICOS

demasiado costosos y su uso queda restringido a entornos experimentales. La recuperaci n en modo de p nico se utiliza normalmente en analio a zadores escritos a mano, como el analizador recursivo descendente predictivo, mientras que la recuperaci n mediante producciones de error se o utilizan en analizadores generados autom ticamente. Por ejemplo: Bison a y Yacc. Los m todos de recuperaci n a nivel de frase son los menos usados e o y los de correcci n global s lo se usan en proyectos de investigacion. o o Los tres primeros m todos son m todos ad hoc que no se pueden exe e trapolar a gram ticas de otros lenguajes. La idea es que cuando el analizaa dor encuentra un error en la cadena de entrada llama a una rutina de manejo especco de ese error. Los dise adores son libres de decidir las acciones n m s oportunas para llevar a cabo en cada situacion. Se puede conseguir a una recuperaci n de errores bastante buena, siempre que los errores que se o presentan encajen en alguna de las categoras de errores que los creadores del compilador han anticipado. Esto es difcil de anticipar en la pr ctica. a Otra desventaja, es que debemos codicar rutinas adecuadas para las entradas de la tabla lo cual implica un riguroso conocimiento de la tabla de an lisis sint ctico y se adapta con dicultad a cambios que se realicen en a a la gram tica, ya que implicara la modicaci n de la tabla. a o

5.8.2 Recuperaci n en modo de p nico en analizadores LR o a En caso de que se produzca un error se desechan smbolos de la pila hasta encontrar un estado con un valor de ir a para un determinado noa terminal . Entonces se desechan cero o m s smbolos de la entrada hasta encontrar un smbolo que pueda seguir legalmente a . De esta forma el analizador intenta aislar la frase que tiene el error. En el momento de la detecci n del error parte de la cadena ya se ha metido en la pila y el reso to queda en la entrada. Por tanto, el analizador echa marcha atr s saca a

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

123

smbolos de la pila hasta donde empez a recocer la cadena que tenia el o error, es decir, encontrar un estado, (estado al descubierto), que contenga un valor para la funci n ir a y desecha smbolos en la entrada hasta o encontrar un smbolo que pueda seguir a . Veamos un ejemplo para la gram tica para generar expresiones aritm ticas: a e
E E E E E E+ . E . E+E . E*E . (E) . num E ( E E E E+E . E.+E E . *E I7 + * I4 I5

+ E E E E E I0 num E I
3

.E . E+E . E*E . (E) . num

E E I1 E

E. E . +E E . *E *

I2 num I 3 E ( E E E

E E E E I5 E

E* . E . E+E . E*E . (E) . num

num .

( E E E E E I2 ( . E) . E+E . E*E . (E) . num E I6 ( E E E

I 2 num I
3

E*E . + I4 E . +E E . *E * I5 I8

E -> . E

I 2 num I
3

) (E . ) E E . +E I4 E . *E + I5 *

(E) . I9

Figura 5.1: Automata de elementos LR # 1 2 3 4 Regla S E E E E E E+E E*E (E) num

Tabla de an lisis sint ctico: a a Veamos ahora cual sera el contenido de la pila y el estado de la entrada al reconocer la cadena num * num num. He reconocido .

124

5.8. RECUPERACION DE ERRORES SINTACTICOS

# estado 0 1 2 3 4 5 6 7 8 9

num d3

( d2

) aceptar

E 1 6

d4 d5 d3 r4 d3 d3 d4 d5 r1 d5 r2 r2 r3 r3 r4 d2 d2 d9 r1 r2 r3 d2 r4

r4 7 8 r1 r2 r3

Tabla 5.2: Tabla de an lisis sintactico a Pila 0 0num3 0E1 0E1*5 0E1*5num3 0E1*5E8 0E1 Entrada Acci n o Mensaje

num * num num # desplazar * num num # reducir * num num # desplazar num num # desplazar num # error, saco smbolos de pila, desplazar # reducir # aceptar

espero +,*,),#

Tabla 5.3: Recuperaci n en modo de p nico: An lisis sintactico para la entrada num * o a a
num num #

5.8.3 Recuperaci n a nivel de frase en analizadores LR o La recuperaci n a nivel de frase se implanta examinando cada entrada o de error en la tabla de an lisis sint ctico y decidiendo, bas ndose en el uso a a a del lenguaje, cual es el procedimiento de recuperaci n m s apropiado. El o a proceso de recuperaci n puede implicar la modicaci n de los estados de o o la pila y/o la cadena de entrada. Hay que evitar que no se produzcan lazos innitos, esto se garantiza si siempre al menos un smbolo de la entrada es eliminado o desplazado a la pila o aplicando una reducci n en la pila si se ha alcanzado el nal de un o

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

125

mango.

e1: esta rutina se llama desde los estados 0,2,4,5 que esperan el comienzo de un operando, es decir, id, (. En vez de eso se ha encontrado un +,*,#. En este caso se introduce un num cticio en la pila y se cubre con el estado 3. Emtase el mensaje Falta operando. e2: esta rutina se llama desde los estados 0,1,2,4,5 al encontrar un par ntesis derecho. En este caso se elimina el par ntesis derecho. e e e Emtase el mensaje Parntesis ) no equilibrado. e3: esta rutina se llama desde los estados 1,6 que esperan un operador y se encuentra con un id, ). En este caso se introduce un + cticio en la pila y se cubre con el estado 4. Emtase el mensaje Falta operador. e4: esta rutina se llama desde el estado 6, se espera un operador o un par ntesis derecho y se encuentra con un #,. En este caso se introduce e un ) cticio en la pila y se cubre con el estado 9. Emtase el mensaje Falta parntesis derecho ). e
La tabla de an lisis sint ctico queda ahora de la forma: a a
# estado 0 1 2 3 4 5 6 7 8 9 num d3 e3 d3 r4 d3 d3 e3 r1 r2 r3 + e1 d4 e1 r4 e1 e1 d4 r1 r2 r3 * e1 d5 e1 r4 e1 e1 d5 d5 r2 r3 ( ) E 1 6 7 8

d2 e2 e1 e3 e2 aceptar d2 e2 e1 r4 r4 r4 d2 e2 e1 d2 e2 e1 e3 d9 e4 r1 r1 r1 r2 r2 r2 r3 r3 r3

Tabla 5.4: Tabla de an lisis sintactico a

126

5.8. RECUPERACION DE ERRORES SINTACTICOS

IMPORTANTE: Se ha sustituido las entradas de error en estados que indican una reducci n por la reducci n correspondiente, esto lo unico que o o har es que se retrase la detecci n hasta haber hecho las reducciones, pero a o el error ser siempre detectado antes de que tenga lugar cualquier movia miento de desplazamiento. Veamos el ejemplo con la entrada id
Pila 0 0num3 0E1 0E1+4 0E1+4num3 0E1+4E7 0E1 Entrada num+)# +)# +)# )# # # # Acci n o desplazar reducir regla desplazar error, elimina ) error, mete operando, reducir reducir aceptar
+ )#

Mensaje

Parntesis ) no equilibrado e Falta operando

Tabla 5.5: An lisis sintactico para la entrada num +)# a

5.8.4 Recuperaci n mediante producciones de error en analizadores o LR Este m todo se basa en la incorporaci n en la gram tica del lenguaje lo e o a que se llama producciones de error. Desde el punto de vista formal se trata de producciones normales en las que se ha incorporado un smbolo termi a o nal especial, , que indica al algoritmo de an lisis d nde se desea realizar una recuperaci n de error. Por ejemplo, dada la gram tica para generar o a expresiones aritm ticas podemos introducir las siguientes producciones de e error:
E | E | | + E + E E

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

127

Estas producciones se tratan como las otras a la hora de construir el aut mata de an lisis LR. Mientras no se detecte ning n error en la entrada, o a u no se activar n ya que al ser un smbolo cticio no puede aparecer en la a cadena de entrada de forma natural y nunca dar una transici n en condia o ciones normales. En el momento en que se detecta un error el m todo hace e lo siguiente: 1 Si el estado que se encuentra en la cima de la pila tiene una transici n o en entonces se introduce en la entrada delante del smbolo conic tivo y se continua con el an lisis como si nada hubiera ocurrido. a 2 Si por el contrario no es un smbolo v lido en el estado de la cima, a entonces se elimina el smbolo actual de la entrada, se sustituye por y se eliminan de la pila tantos estados y smbolos como sea necesario hasta encontrar uno en el que s sea v lido el car cter o hasta vaciar a a la pila, en este caso el m todo falla y no es capaz de recuperarse del e error que se ha encontrado. Veamos como se aplicara el m todo al caso sencillo de una gram tica e a que genera sumas de numeros naturales
E E + E

| num |

en la que se ha introducido una produccion de error gen rica. Construe yamos el aut mata de elementos LR y la tabla de an lisis asociada. o a
# 1 2 3 4 Regla S E E E E E+E num

Tabla de an lisis sint ctico: a a

128

5.8. RECUPERACION DE ERRORES SINTACTICOS

I1 E S E E E I0 S E E. E . +E num . . + E E E E I4 E

I5 E+ . E E . E+E E . num num I 2 . I3 E+E . E . +E + I4

.E . E+E num . num E . I2

E I3

Figura 5.2: Automata de elementos LR # estado 0 1 2 3 4 5 + d4 r3 r4 d2 r2 d3 r2 num d2 d3 aceptar r3 r4 5 E 1

Tabla 5.6: Tabla de an lisis sintactico a

A continuaci n veremos ejemplos que ilustran el comportamiento del o algoritmo en dos situaciones diferentes. como smbolo cticio Vamos a estudiar de qu forma reacciona el analizador sint ctico ante e a o la cadena err nea . Veamos la evoluci n de la pila, la entrada y o la acci n que se lleva a cabo en cada momento: o
Pila 0 0num2 0E1 0E1+4 Entrada num++num# ++num# ++num# +num# Acci n o desplazar reducir regla 3 desplazar error

No existe ninguna transici n v lida con el car cter en el estado por o a a tanto se declara un error, el analizador introduce el smbolo cticio en la o a entrada y como el estado tiene una transici n para ese car cter, se lleva

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

129

a cabo un desplazamiento al estado y el an lisis continua como si nada a hubiera pasado:


Pila 0E1+4 0E1+4 3 0E1+4E5 0E1 0E1+4 0E1+4num2 0E1+4E5 0E1 Entrada +num# +num# +num# +num# num# # # # Acci n o desplazar reducir regla 4 reducir regla 2 desplazar desplazar reducir regla 3 reducir regla 2 aceptar

Tabla 5.7: An lisis sintactico para la entrada num + + num# a

El analizador se ha recuperado del error introduciendo en la cadena de o entrada el smbolo cticio , de forma que la expresi n que realmente e se ha reconocido ha sido num+ +num. Ahora la pregunta es: Qu es ? Tenemos que sustituirlo por un smbolo de la gram tica adecuado en esa a posici n. En este caso el unico que es posible es , de forma que o la cadena una vez recuperada es num+num+num, se ha corregido el error. Se podra haber sustituido tambi n por num+num, pero siempre se suele sustituir e por el smbolo que resulte m s simple en el contexto de la regla que ha a introducido en la entrada. para ignorar parte de la entrada Veamos ahora un ejemplo de como se comporta el analizador cuando es necesario ignorar smbolos en la entrada. En este caso se dice que el ana lizador tira parte de la entrada antes de continuar con el reconocimiento. Supongamos la cadena de entrada num num + num#.
Pila 0 0num2 Entrada num num+num# num+num# Acci n o desplazar error

No existe ninguna transici n a partir del estado con el car cter num y o a

130

5.8. RECUPERACION DE ERRORES SINTACTICOS

tampoco ninguna para . En esta situaci n se sustituye el car cter conico a tivo de la entrada por y se eliminan smbolos de la pila hasta encontrar un estado que admita una transici n con este smbolo de error. En este caso o sera necesario desapilar hasta que el estado quedase en la cima. A partir de entonces la evoluci n del analizador sera: o
Pila 0 0 3 0E1 0E1+4 0E1+4num2 0E1+4E5 0E1 Entrada +num# +num# +num# num# # # # Acci n o desplazar reducir regla 4 desplazar desplazar reducir regla 3 reducir regla 2 aceptar

Tabla 5.8: An lisis sintactico para la entrada num num + num# a

Hemos reconocido

5.8.5 Heursticas para obtener buenas producciones de error Tal y como hemos visto la eciencia del m todo depende en gran mee dida de la adecuada elecci n de las reglas de error y del punto en donde o se coloca el smbolo cticio . Desgraciadamente no existen reglas de uso general que podamos aplicar en todas las situaciones. Las reglas se denen en base a la experiencia introduciendo reglas heursticas basadas en los errores m s comunes y que funcionan de forma razonable en la mayora de a los casos. A continuaci n se enumeran algunos consejos que se pueden o tener en cuenta: 1 Obtener una gram tica sin producciones de error lo m s compacta a a posible teniendo una idea intuitiva clara de los elementos del lenguaje. 2 A partir de la gram tica anterior dise e un analizador sint ctico y rea n a copile una colecci n de programas con errores sint cticos y obtenga o a

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

131

una clasicaci n de los errores que han aparecido y con qu frecueno e cia. 3 Una vez clasicados los errores en funcion de su frecuencia, estable cer una cota inferior, de forma que tan solo introduciremos producciones de error para tratar de forma especca aquellos errores que se presentan con una frecuencia superior a la jada. La forma de tratar estos errores es:

Si el error ocurre con mucha frecuencia de forma sistem tica. a Por ejemplo en Pascal: olvidar el ; en una declaraci n de un o procedimiento o escribir detr s del end del programa principal a un punto y coma ; en vez del punto .. Lo mejor es entonces introducir acciones concretas para su tratamiento, por ejemplo:
bloque ppal BEGIN lista inst END punto bloque ppal . | ; yyerror(Se esperaba un . y se enpunto bloque ppal contr un ;) o

Aunque puede parecer una t cnica un poco burda lo cierto es que e muchos errores frecuentes se pueden tratar de una forma muy c moda y sencilla con este m todo. o e

Si el error es frecuente pero no puede describirse como la omisi n o la adici n de smbolos incorrectos, sino que se trata realo o mente de un conjunto errores que se suelen presentar en una posici n especca de la entrada sin que ninguno de ellos se de con o mayor frecuencia que los otros, entonces se utiliza una producci n de error con el smbolo colocado en el punto conictivo, o donde el prejo y el sujo son cadenas correctas. Por ejemplo, en una gram tica para generar expresiones se a suele producir un error con bastante frecuencia que consiste en la omisi n de un operador o uso de un operador no existente en el o lenguaje, entonces una producci n adecuada de error sera: o
E E E

4 No intentar introducir reglas de recuperaci n especca para los erroo res que no superen cierta frecuencia de corte mnima establecida.

132

5.8. RECUPERACION DE ERRORES SINTACTICOS

Estos errores se tratan con las reglas de forma gen rica, llamadas e tr gatelo-todo (catch-all). En general, los lenguajes constan de sua bestructuras sint cticas delimitadas por ciertos smbolos de la gram tica. a a Por ejemplo: un bloque de instrucciones empieza con el smbolo begin y termina con el smbolo end. De forma general una regla donde es el notr gatelo-todo es una regla de la forma a terminal que describe la estructura a la que queremos asociar el trata miento de errores y y son los terminales respectivos smbolos de inicio y nal.

5.8.6 Ejemplo A continuaci n veamos un ejemplo sencillo para ilustrar la metodoo loga. Supongamos un lenguaje para una pequena calculadora que genera instrucciones del tipo:
print 1 +2 y:=3 x:= y + [y=0?1:4]

Tenemos s lo dos instrucciones: para imprimir y para asignar. Las exo presiones son las aritm ticas elementales y consta de un operador condicioe nal. La primera tarea es dise ar una gram tica que genere dicho lenguaje: n a
P I E P I | I PRINT E | ID ASIG E E + E | E = E | ( E ) | [ E ? E : E ]

A continuaci n se realiza un estudio sobre los posibles errores m as coo munes obteni ndose los resultados: e 1 Se omiti la palabra print (25%). o 2 Se confundi el signo = con la asignaci n := (15%). o o

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

133

3 Se olvid cerrar el par ntesis en las expresiones (20%). o e 4 Se olvid escribir un operador o se utilizo uno incorrecto (20%). o 5 Se escribi (?b:c) en vez de [a?b:c] (5%). o 6 Se olvid cerrar un corchete (5%). o 7 El resto fueron errores variados. La gram tica ampliada queda para este ejemplo: a
P P I | I I PRINT E | ID ASIG E | ID = E | E E E + E | E = E | ( E ) | [ E ? E : E ] | ( E | E E yyerror(Olvid el ) ); o yyerror(Error en el operador ); yyerror(Confundi ell = con el :=); o

yyerror(Olvid el PRINT ); o

Una vez introducidas estas reglas debemos completarlas con las reglas tr gatelo-todo para cona templar el posible resto de errores. Tenemos tres estructuras b sicas: las a instrucciones, las subexpresiones entre par ntesis y la expresi n condicioe o nal encerrada entre corchetes, que faltaban por tratar. Por tanto, a adimos n las reglas:
I E ( | [ ) ]

134

5.9. EJERCICIOS

5.9 EJERCICIOS 1 (0.25 ptos) La siguiente gram tica corresponde a algunas de las lisa tas v lidas en PROLOG. Se pide: (a) Construir la tabla de an lisis a a SLR(1). (b) Eliminar los posibles conictos que aparecen, considerando que el operador , es asociativo por la derecha.
Lista [ ] [ Termino ] Termino Termino , Termino Lista id

2 (0.25 ptos) Dada la siguiente gram tica que genera bloques de c digo a o que pueden contener declaraciones y sentencias. Se pide: (a) Construir la colecci n de elementos LR(1). (b) Construir la tabla de an lisis o a sint ctico LALR(1). (c) Obtener la traza del an lisis LALR(1) para a a la cadena de entrada: begin d; d; s; s end (a) Construir la colecB D S begin D ; S end d D ;d s S ;s

ci n de elementos LR(1). (b) Construir la tabla de an lisis sint ctico o a a LALR(1). (c) Obtener la traza del an lisis LALR(1) para la cadena a de entrada: begin d; d; s; s end 3 (0.25 ptos) Dada la siguiente gram tica a
S E if E S if E S else S id E and E E or E id ( E )

(a) Construir la tabla de an lisis sint ctico SLR(1). (b) En el caso a a de que haya conictos elegir la acci n adecuada para que el operador o disyunci n or tenga menor prioridad que el operador conjuncion and, o y que ambos tengan asociatividad por la derecha; y que toda parte del else de una sentencia condicional debe estar asociada al if m s a pr ximo. o

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

135

4 (0.25 ptos) Demostrar que la siguiente gram tica no es LR(1). Es a LR(k) para alg n k? u
S X Y XYa a Yab c

5 (0.25 ptos) Construir la tabla de precedencias de operadores para la siguiente gram tica de operadores de forma que la parte del else est a e asociada al if m s cercano. a
S C if C then S 0 1 if C then S else S id

Indica el contenido de la pila, la entrada y la acci n a realizar para la o entrada if 0 then id else id. 6 (0.25 ptos) Considerar la siguiente gram tica. Se pide: (a) Construir a el AFD de items LR(0). (b) Construir la tabla de an lisis sint ctico a a SLR(1). (c) Mostrar el contenido de la pila, la entrada y la acci n o para la cadena s; s; s. (d) Es esta gram tica LR(0)? Sino, describe a el tipo de conicto.
stmt seq stmt s stmt seq ; stmt stmt

También podría gustarte