Está en la página 1de 56

TEMAS

ANLISIS SINTCTICO ASCENDENTE

Bibliografa:
Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios,
tcnicas y herramientas. Tema 4, pginas: 200-286.
Louden, K.C. (1997), Compiler Construction: Principies and Practice, Tema 5, pginas: 197-256.
Vivancos, E. (2000), Compiladores I: una introduccin a la fase de
anlisis. Tema 3, pginas: 51-85. Especialmente para ejercicios.
Contenido:
1 Anlisis ascendente: el autmata desplaza/reduce.
2 Tipos de conflictos: desplaza/reduce y reduce/reduce.
3 Gramticas LR:
3.1 Modo de operacin del anlisis ascendente.
3.2 Mango de una forma secuencial derecha.
3.3 Elemento LR(0) y Autmata finito de elementos LR(0).
4 Anlisis LR(0):
4.1 Algoritmo de anlisis LR(0).
4.2 Limitaciones del anlisis LR(0).
94

5.1. ANLISIS ASCENDENTE: EL AVIMPSADESPL AZA/REDUCE

5 Anlisis SLR(l):
5.1 Algoritmo de anlisis SLR(l).
5.2 Resolucin de conflictos por precedencia de operadores.
5.3 Limitaciones del anlisis SLR(l).
6 Anlisis LR(1) y LALR(l):
6.1 Elemento LR(1).
6.2 Autmata finito de elementos LR(1).
6.3 Algoritmo de anlisis LR(1).
6.4 Agrupacin de estados: anlisis LALR(l).
7 Anlisis sintctico por precedencia de operadores.
8 Recuperacin de errores en los analizadores ascendentes.

5.1

ANLISIS ASCENDENTE: EL AUTMATA DESPLAZA/REDUCE

Anlisis ascendente: se construye el rbol de anlisis sintctico de la cade


na de entrada desde las hojas hasta la raz. En las hojas tenemos la cadena
a analizar (los simbolos terminales) que se intentan reducir al axioma, que
se encontrar en la raz, si la cadena es correcta sintcticamente.
Como construir el rbol?
Se trata de desplazarse en la entrada hasta encontrar una subcadena de
smbolos que represente la parte derecha de una produccin, en ese mo
mento sustituimos esa subcadena por el no-terminal de la parte izquierda
correspondiente de la produccin, la reducimos.
Ejemplo: Supongamos la siguiente gramtica que permite generar expre
siones aritmticas donde aparece el operador suma y potencia y combinar

nmeros e identificadores.
TEMA 5.

ANLISIS SINTCTICO ASCENDENTE

95

EE + E

EE
E
E id
E num

Para la entrada id + id + id

Nos restringimos al caso de mtodos deterministas (no hay vuelta atrs)


analizando un slo smbolo de preanlisis sabemos exactamente en todo
momento que accin realizar: bien desplazamos en la entrada o bien apli
car una reduccin. En el caso de una reduccin debemos saber de forma
nica que produccin aplicar.
Los mtodos ascendentes se caracterizan porque analizan la cadena de
componentes lxicos de izquierda a derecha, obtienen la derivacin ms
a la derecha y el rbol de derivacin se construye desde la raz hasta la
s
hojas.

5.2

TIPOS DE CONFLICTOS
Qu accin realizar: desplazar o reduccir?

Qu produccin elegir al reducir cuando hay varias posibles?


Conflicto desplaza-reduce:
96

5.2. TIPOS DE CONFLICTOS

EE +

Para la entrada

23=8
2

ElEElidl num

E 32=9
3

E 29=512

82=64

desplazar

reducir
(a) rbol incorrecto

(b) rbol correcto

Conflicto reduce-reduce:
Supongamos una sencilla gramtica que permite generar sentencias que
son bien llamadas a procedimientos o asignaciones.
S id I V:=E

Vid
E id I num

Para la entrada suma : = 3, equivalente a los componentes lxicos: id


: = num, tenemos las posibilidades

TEMA 5. ANALISIS SINTACTICO ASCENDENTE

97

s
s

id

num

reducir S ~ > id
(a) rbol incorrecto

5.3

id

num

reducir V ~> id
(b) rbol correcto

GRAMTICAS LR

Los mtodos de anlisis sintctico LR permiten reconocer la mayora de


las construcciones de los lenguajes de programacin. Son mtodos muy
potentes, con mayor poder de reconocimiento que los mtodos LL (Las
gramticas LL son un subconjunto de las gramticas LR).
Las gramticas LR(k) se caracterizan porque:
L: Procesamos la cadena de entrada de izquierda a derecha (from leftto-right)
R: proporcionan la derivacin ms a la derecha de la cadena de entra
da en orden inverso {rigth-most derivation)
k: se examinan k-simbolos de la entrada por anticipado para tomar la
decisin sobre la accin a realizar.
Ventajas: es un mtodo potente que permite reconocer la mayora de las
construcciones de los lenguajes de programacin con k=0,l. Es un mtodo

98

sin retroceso y por tanto determinista.

5.3.

GRAMATICAS LR

mano y de realizar
una traza. Necesidad de usar generados automticos
de a
de implementar
Desventajas: los mtodos son difciles de comprender,
analizadores sintcticos LR. Por ejemplo: Bison (para Linux) y Yacc (yet
another compiler compi 1er) para Unix.
Dentro del anlisis sintctico LR se distinguen cuatro tcnicas:
El mtodo LR(0). Es el ms fcil de implementar, pero el que tiene
menos poder de reconocimiento. No usa la informacin del smbolo
de preanlisis para decidir la accin a realizar.
El mtodo SLR(l) (del ingls Simple LR). Usa ya un smbolo de
preanlisis.
El mtodo LR(1). Es el ms poderoso y costoso. El tamao del
automta a pila para el reconocimiento se incrementa considerable
mente.
El mtodo LALR(l) (del ingls Look-Ahead LR, con smbolo de an
ticipacin). Es una versin simplificada del LR(1), que combina el
coste en tamao (eficiencia) de los mtodos SLR con la potencia del
LR(1).
Jerarqua de las gramticas
GIC

LRCk)
LRCl)

LLCk)

SLRCl)

LLCl)

LR(0)

La diferencia que hace a los mtodos LR ms poderosos que los LL


es que los primeros disponen de la informacin de la entrada y los estados
TEMA 5. ANLISIS SINTCTICO ASCENDENTE
99

por lo que ha ido pasando el analizador (la cadena que ha ido reconociendo
hasta ahora), mientras que los mtodos LL slo disponen de la informacin
de la entrada.
para que una gramtica sea LR(k) tenemos que ser capaces de reco
nocer la presencia del lado derecho de una produccin habiendo visto
todo lo que deriva del lado derecho y usando k-smbolos por antici
a 1

pado.

3-2

a.

an

s m LL(k) tenemos que ser capaces de recono


para que una gramtica sea
cer el uso de una produccin
viendo slo los k-smbolos que derivan
X
m-1

su lado derecho.

Modo d

accin

ir a

S.

X.

e operacin del anlisis ascendente:

So
De forma esquemtica un analizador
sintctico consta de:

X en

ai

en\

Programa
conductor

Salida

V,

Tabla de anal, sintctico


N

accin[S >

]=d,r,error,aceptar

ir_a[ S m ' %

La entrada formada por la serie de componentes lxicos a reconocer.


100

5.3. GRAMTICAS 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 50-151-252 SmXmt
donde cada Xi son smbolos de la gramtica que se van reconociendo,
Xi G (Vt U Vnt), y los Si son los estados por los que pasa el ana
lizador. 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 reduccin.
Resto de la entrada

Pila

a
o
o
m

osKso

02*

orno

Vt

Mango
existe

cJj

inV-p

tal que

*2

' '

La tabla de
nlisis sintctic
formada por d
s partes. La pri
era
parte es de la fo

rma accion{srm cl) indica que accin se debe de rea


lizar si observamos en la entrada el token ai y el analizador est en el
estado s. Las acciones posibles son: desplazar, reducir, error, acep
tar. La segunda parte es de la forma irM{sm, Vt) indica el estado al
que tenemos que ir despus de hacer una reduccin.
Salida: la derivacin ms a la derecha de la cadena de entrada en
orden inverso (de abajo hacia arriba).
Definicin de mango (handle):

Mango o asidero: conjunto de smbolos terminales y no-terminales en la


cima de la pila que forman la parte derecha de una produccin y que se
pueden reducir sacndolos de la pila y sustituyndolos por el no-terminal
de la parte izquierda de la produccin.
TEMA 5. ANLISIS SINTCTICO ASCENDENTE

101

Resumiendo lo visto hasta ahora necesitamos:


Un mecanismo que nos determine el tipo de accin a realizar: despla
zar o reducir.
En el caso de que tengamos que reducir nos debe proporcionar la subcadena de smbolos a reducir (el mango) y qu produccin a utilizar.
Este mecanismo nos lo proporciona el Autmata Finito Determinista de
elementos LR(0).

5.3.1

Definicin de Elemento LR(0) y Construccin del Autmata Fi


nito de elementos LR(0)

Un elemento de anlisis sintctico LR(0) de una gramtica G, es una


produccin de G con un punto en alguna posicin del lado derecho.

[A 3i 2]
siendo A

/3i/32 una produccin. Este punto separa la parte que se


ha analizado hasta ese momento, y por tanto est en la cima de la pil
a,
de la parte que se espera an analizar, que es el resto de la cadena
de
entrada. Por ejemplo para la produccin A XYZ tenemos los posibles

siguientes items LR(0):


A X Y Z se espera en la entrada una cadena derivable de XYZ
A X Z se ha reconocido una cadena derivable de X
y se espera en la entrada una cadena derivable de YZ

A X Y Z A XYItem completo. Indica que ya se ha reconocido

por completo una cadena derivable de A. Hemos encontrado el mango.


5.4. ANLISIS LR(0)

102

Autmata fnito de elementos LR(0)


Los estados son los propios items LR(0).
Las transiciones son de la forma:
Si X gVt tenemos una transicin
[AaX3][AaX 3]
Si X G Vnt tenemos una transicin
[AaX3][AaX 3]
y adems
[AaX3][X 7] VX 7
En el primer caso, cuando X eVr significa 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 interpretacin es ms compli
cada. Significa que hemos reconocido un no-terminal como consecuencia
de haber hecho una reduccin, por tanto tenemos que haber reconocido ese
no terminal previamente, por tanto tenemos que aadir transiciones a esta
dos que indiquen que vamos a reconocer ese no-terminal. Adems, como
no consumimos ningn token de la entrada son e-transiciones.

5. ANLISIS SINTCTICO ASCENDENTE


5.4 TEMAANLISIS
LR(0)

103

Si el estado S contiene cualquier item de la forma A a X(3 co

nEl anlisis LR(0) es el ms sencillo de los mtodos ascendentes. No usa


X terminal
X G Vt,
entoncesdelapreanlisis,
accin es para
X laa accin
la pila. El
informacin
de la entrada,
el simbolo
decidir
desplazar
nuevo estado al que pasa el analizador, y que se coloca en la cima de
a realizar.

la pila, es aquel que contenga un item de la forma A aX 3.


Algoritmo de anlisis LR(0)
Si el estado S contiene un item de la forma A a*, entonces la
es reducir
la produccin
Sea Saccin
el estado
de la cima
de la pila.
Entonces: A a. Sacamos 2||||
aplicando
elementos de la pila y el estado que queda al descubierto debe conte
ner un item de la forma B 'j Aa, metemos el no-terminal A e
n
la pila y como nuevo estado, aquel que contenga el item de la forma
B
jA a.
s

Si no se puede realizar ninguna de las acciones anteriores entonce


error.

Se dice que una gramtica es LR(0) si la aplicacin de las reglas anteriores


no son ambiguas, es decir, que si un estado contiene un item de la form
a
A
a*, entonces no puede contener cualquier otro item.
Si se produjera eso apareceran conflictos. En efecto:
al

Si tuviera adems un item de la forma A a X3 con X termin


tendramos un conflicto desplaza-reduce.
Si tuviera adems un item de la forma B /3, se producira un
conflicto reduce-reduce.
Por tanto, una gramtica es LR(0) sii cada estado es bien un estad

de desplazamiento (contiene slo tems que indican desplazar) o bien un


estado de reduccin (contiene un nico item completo).
104
5.4. ANLISIS LR(0)

Ejemplo:
Consideremos la siguiente gramtica para generar parntesis anidados:
A (.A)]
A .(A) A
{A)\a
A w
A .a
f

13
El AFD de elementos
LR(0) es:
Entrada

3
desplazar
reducir S' A (acep.)
reducir A a

Estado
0
1
2

S' A.

Ir_a
a

Accin

desplazar

desplazar
reducir A
(A)

(A.)

A_(A).
15

10

13
12
A
12

a.

PILA

ENTRADA

ACCION

((a))#

desplazar

(a))#

desplazar

a))#

desplazar
reducir A a

#0
#0(3
#0(3(3
#0(3(3a2
#0(3 (3 A4

))#

#0(3(3A4)5

)#

desplazar
reducir A

#0(3A4

)#

desplazar

))#

Hacer notar que no hemos necesitado conocer el


# reducir A
#0(3A4)5
tipo de token que tenamos
en la entrada para decidir la accin a realizar. #0A1
#
aceptar
Veamos el contenido de la pila, la entrada y la accin a realizar para la
entrada ((a)) #
TEMA 5. ANLISIS SINTCTICO ASCENDENT
105

+ .n
E E'_E .E
V.
E . n
E
.E + n
n
,
14

A partir del autmata se construye laE tabla


sintctico:
n.
Ede+ anlisis
/

Obtenemos la derivacin ms a la derecha de la cadena de entrada:


(A) ((A)) ((a)) .
Limitaciones del anlisis LR(0):
Supongamos la gramtica siguiente:
E E + n\n

(A)
(A)

El AFD de elementos LR(0) correspondiente es:


Conflicto desplaza/reduce

E
n

II

10
12

En el estado II tenemos un item que indica desplazar E E + n


y
otro que indica reducir E'
segn el algoritmo LR(0).

E. Tenemos un conflicto desplaza/reduce,

Existen determinadas construcciones de los lenguajes de programacin


5.5. ANLISIS SLR(l)

106

que no pueden ser reconocidas por este tipo de mtodo. Para solucionar
este problema se introduce el anlisis SLR(l).

5.5

ANLISIS SLR(l)

Este tipo de anlisis usa el AFD construido a partir de elementos LR(0)


y usa el token de la cadena de entrada para determinar el tipo de accin a
realizar. Este mtodo consulta el token de la entrada antes de realizar un
desplazamiento para tener seguro que existe una transicin correspondien
te 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 reduccin 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 anlisis sintctico SLR(l)


Sea S el estado de la cima de la pila. Entonces:
Si el estado S contiene cualquier tem de la forma A a X/3
con X terminal ( X G Vr) y X es el siguiente terminal en la entrada,
entonces la accin es desplazar X a la pila. Como nuevo estado al
que pasa el analizador apilamos aquel que contenga un tem de la
forma A
aX 3.
Si el estado S contiene un tem de la forma A a y q\ siguiente
token en la entrada est en SIG(A), entonces la accin es reducir
aplicando la produccin A a. Sacamos 2|||| elementos de la
pila y el estado que queda al descubierto debe contener un tem de
Regla
la forma B 'j Aa, metemos el no-terminal A en la pila y como
0 E'
nuevo estado, aquel que contenga el tem de la forma B jA a.
1

E E +n

E non se
Si el smbolo en la entrada es tal2 que
pueden realizar ninguna
de las acci
ones anteriores ento
+
E' .EE.
E E
E
.
n
nces error.
E
E . + n
13 'v

TEMA 5. ANLISIS SINT


107

E . E + n

CTICO ASCENDENTE

Se dice que una gramtica es SLR(l) si la aplicacin de las reglas ante


riores no son ambiguas. Es decir, una gramtica es SLR(l) sii se cumple
para cada estado una de las siguientes condiciones:
Para cada item de la forma A a X/3 en S con X terminal, no
existe un item completo B
j en S, con X G SIG{B). Sino
tendramos un conflicto desplaza-reduce.
Para cada par de items completos A a y B en 5, entonces
SIG{A) P SIG{B) = 0. De lo contrario se producira un conflicto

reduce-reduce.
El aspecto de la tabla de anlisis sintctico cambia respecto al anlisis

LR(0), puesto que un estado puede admitir desplazamientos o reducciones


dependiendo del token en la entrada. Por tanto, cada entrada debe tene
r
una etiqueta de desplazamiento
o reduccin.
# estado
Entrada
Ir_a

Ejemplo:

n
0
1

#0

1
d3

E + n\n
r2

aceptar
r2

d4

4
rl
ENTRADA
+n+n#

#0E1

+n+n#
+n#

#0E1

+n#

#0El+3

reducir rl E E + n
desplazar d3
desplazar d4

n#

#0El+3n4

#0E1

#0E'

#
n

ACCION

desplazar d3
desplazar d4

n+n#

#0El+3n4

rl

desplazar d2
reducir r2 E n

n+n+n#

#0n2
#0El+3

d2

Para la gramtica: E
2
Reglas:
3
PILA

El AFD de elemento
s LR(0) correspondie
nte es:

reducir rl E E + n
E

reducir rO
II

aceptar
14

10
n .

E + n .

12
108

5.5. ANLISIS SLR(l)

Comprobemos que segn el anlisis SLR(l), ahora no existe conflicto


desplaza/reduce en el estado /i. En efecto: {+} SIG{E') = { # } .
La tabla de anlisis sintctico es:

Tabla 5.1: Tabla de anlisis sintctico

Consideremos la entrada n+n+n# y veamos el contenido de la pila, la

entrada y la accin a realizar.

Limitaciones del anlisis SLR(l):


El anlisis SLR(l) es simple y eficiente. Es capaz de describir prcticamente
todas las estructuras de los lenguajes de programacin. Pero existen algu
nas situaciones donde este tipo de anlisis no es suficientemente poderoso
y falla. Veamos un ejemplo simplificado de la gramtica en Pascal que
TEMAS.

ANALISIS SINTACTICO ASCENDENTE

109

genera las llamadas a procedimientos y las asignaciones de expresiones


a
variables.
Supongamos la gramtica siguiente:
S id I V:=E

Vid
E V I num

Conf lic to reduce/reduce


id

V
S

id .
id .

Existe un conflicto reduce/reduce, segn el algoritmo SLR(l), porque


SIG(V) = {:=,#} y 5/G(5) = {#}, de manera que SIG(V)r\SIG(S)

0. Imaginemos que estamos observado # por tanto no sabemos si es el fi

nal de la llamada a un procedimiento o es el final de una de una expresi


n
(una expresin es una variable).
Los conflictos reduce/reduce no son habituales y suelen ser un sntoma
de un mal diseo de la gramtica.

5.6

ANLISIS LR(1)
Para solucionar este problema se introduce el mtodo ms general qu

e
existe, el llamado anlisis sintctico LR(1). Este es el mtodo ms pode

roso que existe, a costa de que se incrementa la complejidad (un factor d


e
10 respecto a los mtodos que usan el AFD de items LR(0)).
Las limitaciones del mtodo LR(0) y SLR(l) radican en que tienen e
n

cuenta el smbolo de preanlisis despus de la construccin del AFD


de
items LR(0), que por s misma ignora los smbolos siguientes en la entrada.
5.6. ANLISIS LR(1)

110

5.6.1

Definicin de Elemento LR(1) y Construccin del Autmata fi


nito de elementos LR(1)

Un elemento de anlisis sintctico LR(1) de una gramtica G, es un


par consistente de un item LR(0) y un smbolo de preanlisis.
[4 a /3, a]
siendo 4 a /3 un item LR(0) y a el token de preanlisis.
Un item completo [4 /3, a], indica que ya se ha reconocido por
completo una cadena derivable de A y reducir siempre que en la entrada
tenga el token a.
Autmata finito de elementos LR(1)
Los estados son los propios items LR(1).
Las transiciones son de la forma:
Si X gVt tenemos una transicin
[A a X7, a] [A aX 7, a]
Si X G Vnt tenemos una transicin
[A a X7, a] [A aX 7, a]
y adems e-transiciones
a X7, a] A [X 3, b]

X 3

y PRIM{'ya)

El estado inicial del AFD se obtiene ampliando la gramtica, como para

el caso de items LR(0), y poniendo como smbolo de preanlisis


[S' . S , #]
que significa que reconoceremos una cadena derivable de S seguida del
smbolo
TEMA 5. ANLISIS SINTCTICO ASCENDENTE

111

Algoritmo de anlisis sintctico LR(1)


Es bsicamente igual al algoritmo de anlisis SLR(l), excepto que usa
el simbolo de preanlisis en vez del conjunto de SIG.
Sea S el estado de la cima de la pila. Entonces:
Si el estado S contiene cualquier item de la forma [4 a X(3,
a]
con X terminal {X G Vt) y X es el siguiente terminal en la entrada,
entonces la accin es desplazar X a la pila. Como nuevo estado a
l
que pasa el analizador apilamos aquel que contenga un item de l
a
forma [4 aX (3, a\.
Si el estado S contiene un item de la forma [A a, a] y el siguient
e
token en la entrada es a, entonces la accin es reducir aplicando l
a
produccin A a. Sacamos 2|||| elementos de la pila y el
estado
que queda al descubierto debe contener un item de la forma [B
7 Aa 6], metemos el no-terminal A en la pila y como nuevo estado,
aquel que contenga el item de la forma [B jA cr, 6].
Si el simbolo en la entrada es tal que no se pueden realizar ningun
a
de las acciones anteriores entonces error.

Se dice que una gramtica es LR(1) si la aplicacin de las reglas anteriores


no son ambiguas. Es decir, una gramtica es LR(1) sii se cumple para cada
estado una de las siguientes condiciones:
([S'_ s.
,#])
P
ara cada item de la forma [4 a
S, #]
X3, S ' _ .
a\ qti S con X termi
N
. id, #]
id
[V__ id#] :=] nal, entonces no existe un item complet
S_ .V:=E,
V
id, :=]id .,#]
[V-_ . [S_
o [B
7*,X] en S. Sino
tendramos un conflicto desplaza-reduce.
/

No existen dos items completos de la forma [4 a,a\y [B


a] en 5. De lo contrario se producira un conflicto reduce-reduce.
La tabla de anlisis sintctico tiene el mismo aspecto que para el caso
SLR(l).
112

5.6. ANLISIS LR(1)

Supongamos la gramtica y calculemos el AFD de items LR(1)


S id I V:=E

Vid
E V I num

V
[S

[ S'_V := . E , #]
n
[E . V , # ]
[E . n, #]
[V.id, #]
id
V

V. :=E,#]

13

[E_V . , #]

[SV:= E.,#]

1[A_

15 (

18

[V_id.,#]
17

16

A.,#;
J
S' A,#]
[A_ (A),#]
n.,#)
n,#]

10

II

[En.,#]

12

( A), que
#)] apareca en el estado I2.
Se ha evitado el[A_
conflicto
[A_ n,)]
[A_ (A),)]

5.6.2

Anlisis LALR(l)

Una modificacin del mtodo LR(1), llamada mtodo LALR(l) man


tiene el poder del LR(k) y preserva la eficiencia del SLR(l). El anlisis
LALR(l) se basa en la observacin de que en muchos casos el tamao
grande del AFD de items LR(1) se debe a la existencia de muchos esta
dos diferentes que tienen igual la primera componente, los items LR(0), y
difieren slo de la segunda componente, los smbolos de preanlisis.
Lo que haremos es identificarlos como un nico estado combinando los
TEMA 5. ANLISIS SINTCTICO ASCENDENTE
113

smbolos de preanlisis. Si el proceso est bien hecho, llegaremos a u


n
autmata como el de items LR(0), excepto que cada estado tiene smbolos
de preanlisis.

El algoritmo de anlisis LALR(l) es idntico al LR(1).


Por ejemplo para la gramtica para generar parntesis anidados:

{A)\a

El AFD de elementos LR(1) resultante despus de combinar estados es:


S

n
II

[ A _ ( A .) , # B) ]

10

14

[A_(A).,#)]
15

12

5.7

ANLISIS SINTCTICO POR PRECEDENCIA DE OPERA


DORES

Existe una clase especial de gramticas, las gramticas de operadores,


para las cuales se puede construir con facilidad a mano eficientes analiza
dores sintcticos. Se dice que una gramtica es de operadores si:
No contiene no-terminales adyacentes.
114

5.7. ANLISIS SINTCTICO POR PRECEDENCIA DE OPERADORES

No contiene

Ejemplo

e-

producciones.

EE + E\ EE \ (E) I id
El anlisis sintctico por precedencia de operadores es til para el anlisis
semntico ya que el valor de la expresin es un atributo sintetizado ( de
hijos a padres) que se calcula en forma ascendente, pero existe el problema
de la ambigedad. Para resolverlo introducimos precedencias entre los
terminales, que servirn para guiar la seleccin de la subcadena a reducir
(el mango).
Existen tres tipos de relaciones de precedencia que representaremos por
los smbolos:
a <b, significa que a cede la precedencia a b.
a = b, significa que a tiene la misma precedencia que b.
a> b, significa que a tiene mayor precedencia que b.
La tabla de anlisis sintctico es una tabla con dos entradas. Las filas
indican el operador que ya est en la pila y las columnas indican el opera
dor en la entrada. Para construir la tabla de anlisis sintctico tendremos
en cuenta que:
Si 1, 02 son dos operadores tales que 9i tiene mayor precedencia que
62, hagse 9i > 92y O2 < Oi. Por ej: *>+, + <*.
Si 61,62 son dos operadores de igual precedencia entonces hagse:
6i> 62y 62> 61, si son asociativos por la izquierda, < 2 y 2 < 1,
si son asociativos por la derecha. Por ej: +>+,+ <+.
Respecto a los otros no terminales: id> 6y 6 <id \I6.
Respecto al final de cadena, < id y id > < 6 y 6 >
general, < a, a > Va G VtTEMA 5.

ANLISIS SINTCTICO ASCENDENTE

En
115

Veamos como las relaciones de precedencia nos van a servir para guiar

la seleccin de las cadenas a reducir. EL smbolo < va a marcar el extremo


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, l
a
cadena a reducir se puede encontrar mediante el siguiente proceso:
1 Examnese la cadena desde el principio hasta encontrar el >.
2 Despus examnese la cadena hacia atrs, saltando los = hasta encon
trar <.
3 El mango es todo lo que est a la izquierda del > y a la derecha
del
<.
Por ejemplo para la entrada

large

od

id

id

id ><1 id
<i id
< E -\- <iE * E >

Algoritmo de anlisis sintctico por precedencia de operadores


Entrada: Una cadena de componentes lxicos w y una tabla de relaciones
de precedencia.
Salida: Si w est bien formada, una estructura de rbol de anlisis sintctico
sino una indicacin de error.
Mtodo: Tenemos dos variables: a (un puntero al terminal ms cerca de la
cima de la pila) y b (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. ANLISIS SINTCTICO POR PRECEDENCIA DE OPERADORES

sino

sia<boa = b entonces
desplazar 6 a la pila
sino

jo

>

>

<

>
>

der

id

>

<

sia> b entonces
reducir, el mango est formado un extremo por
la cima de la pila y el otro se desapila hasta encontrar
un smbolo terminal s, tal que existe
*
un simbolo a por deba
id
#
(
)
de s, tal que a < s.
>
<
>
<
<
>
>
<
>
<
<
>
sino error
=
<
<
<
<
fnsi
error4()
> error 1()
>
> errorlQ
>
fnsi
>
<
>
<
<
>
fnsi
> error 1()
>
> error 1()
>
hasta terminar==verda
<
<
<
error2() <
error3()
o

Ejemplo

EE-\-E\EE \ (E) I EE \ id

Recuperacin de errores: Recuperacin a nivel de frase: al des


cubrir el error el analizador sintctico realiza una correccin local de la
entrada, para ello: inserta, elimina o sustituye un simbolo de la cadena de
entrada a partir del punto donde se ha encontrado el error por otro que le
permita continuar con el anlisis (por ejemplo: (, +, id).
TEMA 5. ANLISIS SINTCTICO ASCENDENTE

117

Procedimientos de error:
error1()

{
printf(''Falta

operador:

inserto

}
error2()

{
printf

Parntesis

no

equilibrado:

inserto

}
errorS()

{
printf(''Falta

expresin'');

}
error4()

{
printf

Parntesis

no

equilibrado:

inserto

5.8

RECUPERACIN DE ERRORES SINTCTICOS

te
o
e
l

PILA

ENTRADA

ACCION

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

desplazar

# < id
#E
#< E*
#< E* <(
#<E*<(<id

on
lo
co
u
je
l

#<E* <(<E
#<E* <(<E +

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

#<E*<(<E + < id
#<E* <(<E + E

)#

#< E* <(E
#< E* < (=E)

)#
#

)#

#<E*E

#E

pendiendo de la fase del compilador


e

Los programas pueden con


ner errores de muy divers

tipo. En gene
ral se trata de: errores d
desplazar
ortografa por no tener e
desplazar
cuidado suficiente al
desplazar
reducir
programar, errores por desc
ocer o no comprender bien
desplazar
desplazar
s requisitos for
reducir
males del lenguaje o por la
reducir
nfusin con otro lenguaje q
desplazar
e el programador
reducir
utiliza habitualmente (por e
reducir
mplo al usar a la vez Pasca
aceptar
y Modula-2). De
en la cual se detectan, los errores s
reducir

clasifican en:
lxicos: pueden ocasionarse por usar un carcter invlido, que no per
tenezca al vocabulario del lenguaje de programacin, al escribir mal
118

5.8. RECUPERACIN DE ERRORES SINTCTICOS

un identificador, palabra reservada u operador.


sintcticos: se producen cuando el analizador sintctico espera un
smbolo terminal en cierta posicin de la gramtica que no corres
ponde con l que se acaba de leer. Por ejemplo, en una expresin
aritmtica con parntesis no equilibrados.
semnticos: corresponden a la semntica del lenguaje de programa
cin la cual no est descrita en la gramtica. Por ejemplo: un ope
rador aplicado a un operando incompatible o uso de una variable no
declarada.
de ejecucin: son errores de ejecucin por ejemplo el uso de un ndice
en una matriz fuera del rango especificado, usar un puntero no inicializado o intentar una divisin por cero o la raz cuadrada de un nmero
negativo. Son detectados por el sistema de ejecucin cuando el pro
grama fuente se ha compilado con una determinada opcin en la que
se generan ciertas acciones automticamente para tratar estos casos.
Lo usual es que se informe del error y se detenga la ejecucin.
TEMA 5.

ANLISIS SINTCTICO ASCENDENTE

119

lgicos', especialmente en entornos de enseanza, un compilador de


be tambin informar de errores lgicos que pueden ser potenciales
errores como variables declaradas pero no usadas, instrucciones que
no son alcanzables, y operaciones aritmticas sin significado, como
la suma de un valor cero a una variable.

La mayor parte de la deteccin de errores en un compilador se centra


en la fase de anlisis sintctico. La razn es porque muchos errores son de

naturaleza sintctica. En esta seccin se presentan algunas tcnicas bsicas


para recuperarse de errores sintcticos y su implantacin en los diferentes
mtodos de anlisis sintctico estudiados.
La mayoria de las especificaciones de los lenguajes de programacin no
describen cmo debe responder un compilador a los errores; la respuesta
se deja al diseador del compilador. Un buen gestor de errores:
Debe informar de la presencia de errores con claridad y exactitud, de
manera que permita al programador encontrar y corregir fcilmente
los errores en su programa.
Se debe recuperar de cada error con la suficiente rapidez y sin perder
demasiada informacin de la entrada para detectar errores posteriores.
No debe retrasar de manera significativa la compilacin de programas
correctos.
El gestor de errores debe imprimir la lnea y la columna donde se h
a
detectado el error. Tambin se debe incluir un mensaje de diagnstico su
"
ficientemente informativo, por ejemplo
se espera punto y coma en esa
posicin". En la mayora de los casos no es conveniente que el proce

so de anlisis sintctico se detenga despus de encontrar el primer error,


ya que podran existir ms errores en la entrada. Adems, puesto que l
a
compilacin de un programa puede tardar varios minutos, el programador
espera que la compilacin detecte todos los errores posibles en el mismo
120

5.8. RECUPERACIN DE ERRORES SINTCTICOS

momento. Se debe entonces implantar una recuperacin del error, donde


el analizador sintctico intenta volver l mismo a un estado consistente en
el que el procesamiento de la entrada pueda continuar.

Los mtodos LL y L R detectan un error lo antes posible, se dice que


tienen la propiedad del prefijo viable, lo cual quiere decir que detectan el
error nada ms ver un prefijo de la entrada que no es un prefijo de ninguna
cadena del lenguaje. En los analizadores LR los errores sintcticos se de
tectan cuando a partir del estado que actualmente se encuentra en la cima
de la pila no existe ninguna transicin definida con el carcter actual de en
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 recuperacin
de errores se lleva a cabo modificando la pila y/o la entrada de forma que
el analizador puede llegar a un estado adecuado para poder continuar con
el anlisis de la entrada. En los analizadores sintcticos LL los errores de
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 preanlisis y
el no-terminal de la cima de la pila nos lleva a una entrada de la tabla de
anlisis sintctico que est vacia.
Hay que hace notar que cualquier 'reparacin' efectuada por el compi
lador tiene el fin nico de continuar la bsqueda de otros errores, no de
corregir el cdigo fuente.

5.8.1

Estrategias de recuperacin de errores sintcticos

Aunque hay muchas estrategias que se pueden emplear para la recu


peracin de errores, ninguna de ellas ha demostrado ser universal (que
sirva para todos los lenguajes de programacin y mtodos de anlisis).
El proceso de recuperacin siempre debe basarse en hiptesis (estrategias
heursticas) acerca sobre el tipo de errores ms comunes y esto hace que
siempre dependa del lenguaje. Sin embargo, algunos mtodos tienen am
plia aplicabilidad.
TEMA 5. ANLISIS SINTCTICO ASCENDENTE

121

1 Recuperacin de emergencia (o en modo de pnico): al detectar un

error, el analizador desecha smbolos en la entrada hasta que encuen


tra uno perteneciente a un conjunto de componentes lxicos de sin
cronizacin. Estos componentes de sincronizacin son generalmente
delimitadores de sentencia como el punto y coma, la palabra end de
final de bloque o cualquier palabra clave que pueda ser inicio de una
proposicin nueva. Es el mtodo ms sencillo de implantar y puede
ser usado por la mayoria de los mtodos de anlisis sintctico, pero
slo reconoce un error por proposicin, unidad sintctica. Esto no
es necesariamente una desventaja ya que no es probable que ocurran
varios errores en la misma proposicin. Es tarea del diseador del
compilador elegir un conjunto adecuado de componentes de sincroni
zacin.
2 Recuperacin a nivel de frase: al descubrir el error el analizad
or
sintctico realiza una correccin local de la entrada, para ello: in

serta, elimina o sustituye un simbolo de la cadena de entrada a partir


del punto donde se ha encontrado el error por otro que le permita con
tinuar con el anlisis (por ejemplo: insertar un punto y coma faltante
al final de una sentencia). Es el diseador del compilador l que debe
elegir que tipo de modificacin se debe realizar en cada caso.
3 Recuperacin mediante producciones de error (o expansin de l
a
gramtica): si se tiene una buena idea de los errores ms comunes que
se pueden encontrar, se puede aumentar la gramtica del lenguaje con
producciones que generan las construcciones errneas, 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 deteccin. Se usa entonces esta gramtica amplia
da para construir el analizador sintctico.
4 Recuperacin mediante correccin global: dada una cadena de entra

da con errores, x, y una gramtica se trata de encontrar otra cadena, y,


correcta tal que el nmero de inserciones, supresiones y sustituciones
para transformar x en y sea el mnimo posible. Estos mtodos so
n
5.8. RECUPERACIN DE ERRORES SINTCTICOS

122

demasiado costosos y su uso queda restringido a entornos experimen


tales.
La recuperacin en modo de pnico se utiliza normalmente en anali
zadores escritos 'a mano', como el analizador recursivo descendente predictivo, mientras que la recuperacin mediante producciones de error se
utilizan en analizadores generados automticamente. Por ejemplo: Bison
y Yacc. Los mtodos de recuperacin a nivel de frase son los menos usados
y los de correccin global slo se usan en proyectos de investigacin.
Los tres primeros mtodos son mtodos 'ad hoc' que no se pueden ex
trapolar a gramticas de otros lenguajes. La idea es que cuando el analiza
dor encuentra un error en la cadena de entrada llama a una rutina de manejo
especfico de ese error. Los diseadores son libres de decidir las acciones
ms oportunas para llevar a cabo en cada situacin. Se puede conseguir
una recuperacin de errores bastante buena, siempre que los errores que se
presentan encajen en alguna de las categoras de errores que los creadores
del compilador han anticipado. Esto es difcil de anticipar en la prctica.
Otra desventaja, es que debemos codificar rutinas adecuadas para las en
tradas de la tabla lo cual implica un riguroso conocimiento de la tabla de
anlisis sintctico y se adapta con dificultad a cambios que se realicen en
la gramtica, ya que implicara la modificacin de la tabla.

5.8.2

Recuperacin en modo de pnico en analizadores LR

En caso de que se produzca un error se desechan smbolos de la pila

hasta encontrar un estado s con un valor de irM para un determinado noterminal A. Entonces se desechan cero o ms smbolos de la entrada hasta
encontrar un smbolo que pueda seguir legalmente a A. De esta forma el
analizador intenta aislar la frase que tiene el error. En el momento de la
deteccin del error parte de la cadena ya se ha metido en la pila y el res
E E+E .
E
to queda en la entrada. Por tanto, el analizadorE echa
marcha atrs saca
E.+E
E
E E . *E

TEMA 5. ANLISIS SINTCTICO ASCENDENTE


123

12(
13

E+ . E
E+E
E' . E
E . E*E
E . E+E
E (E)
.
num
E E . E*E
E (E)
teni E . num

smbolos de la pila hasta donde empez a recocer la cadena que


E E*E .
a el
E E . +E
error, es decir, encontrar un estado, A (estado Ealdescubierto),
que conten
E . *E

ga un valor para la funcin ir y desecha simbolos en la entrada


hasta
#
Regla
encontrar u
n simbolo a que pueda seguir a A.
S'
1 EE + E
Veamos
2 EE*E un ejemplo para la gramtica para generar ex
ritmticas:
presiones a 3 E(E)
4 E num
E

E .
E . +E
E . *E

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

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

-(E.)
.E . +E
,E . *E

num

+-I4

I
num

Figura 5.1: Autmata de elementos LR

(E).J

num
E num j
->

# estado

num

d3

1
2

d5

d3

aceptar
d2

r4

r4

6
r4

r4

d3

d2

d3

d2

d5Entrada d9 Accin
rl d5
rl
rl
7 num * num num
# desplazar
r2 r2
r2
r2
8
* num num
# reducir
9
r3 r3
r3
r3
* num num
# desplazar
num num # desplazar

Pila
0
Onum3
OEl
0E1*5

E
1

d2
d4

d4

Mensaje

0E1*5E8

error, saco smbolos de pila, desplazar espero +,*,),#


reducir

OEl

aceptar

0El*5num3

num #

Tabla de anlisis sintctico:


Veamos ahora cual sera el contenido de la pila y el estado de la entra
da
al reconocer la cadena num * num num.
He reconocido num + num.
124
5.8. RECUPERACIN DE ERRORES SINTCTICOS

Tabla 5.2: Tabla de anlisis sintctico

Tabla 5.3: Recuperacin en modo de pnico: Anlisis sintctico para la entrada


num

num

5.8.3

frase e
La
rase s
ada ent

num

# estado

num

d3

el

el

d2

e2

el

e3

d4

d5

e3

e2

d3

el

el

d2

e2

aceptar
el

r4

r4

r4

r4

r4

r4

d3

el

el

d2

e2

el

d3

el

el

d2

e2

el

e3

d4

d5

e3

d9

e4

e implanta examinando c

rl

rl

d5

rl

rl

rl

rada

Recuperacin a nivel de
n analizadores LR
recuperacin a nivel de f

r2
r2 r2 r2 r2
r2
8
de erro
r en la tabla de anlisis si
9
r3
r3
r3
r3
r3
r3
ntctic
o y decidiendo, basndos
e en el uso
del lenguaje, cual es el procedimiento de recuperacin ms apropiado. El
proceso de recuperacin puede implicar la modificacin de los estados de
la pila y/o la cadena de entrada.

Hay que evitar que no se produzcan lazos infinitos, esto se garantiza si


siempre al menos un smbolo de la entrada es eliminado o desplazado a la
pila o aplicando una reduccin en la pila si se ha alcanzado el final de un
TEMA 5. ANLISIS SINTCTICO ASCENDENTE
125

mango.
el: esta rutina se llama desde los estados 0,2,4,5 que esperan el co

mienzo de un operando, es decir,

id,

(. En vez de eso se ha enco

n
trado un +,*,#. En este caso se introduce un num ficticio en la pila y se
cubre con el estado 3. Emtase el mensaje ' 'Falta operando''.
n

e2: esta rutina se llama desde los estados 0,1,2,4,5 al encontrar u


parntesis derecho. En este caso se elimina el parntesis derecho.
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 + fictic

io
en la pila y se cubre con el estado 4.

Emtase el mensaje ''Fai

ta
operador''.

e4: esta rutina se llama desde el estado 6, se espera un operador o un


parntesis derecho y se encuentra con un #,. En este caso se introduce
un ) ficticio en la pila y se cubre con el estado 9. Emtase el mensaj
e
'"Falta

parntesis

derecho

)''.

La tabla de anlisis sintctico queda ahora de la forma:

Pila

Entrada

Accin

num+)#

OnumS

+)#

desplazar
reducir regla

OEl

+)#

desplazar

OEl+4
0El+4num3

)#
#

error, elimina)
error, mete operando, reducir

0E1+4E7

reducir

OEl

aceptar

Mensaje

'"Parntesis
''Falta

no

equilibrado''

operando''

Tabla 5.4: Tabla de anlisis sintctico


126

5.8. RECUPERACIN DE ERRORES SINTCTICOS

IMPORTANTE: Se ha sustituido las entradas de error en estados que


indican una reduccin por la reduccin correspondiente, esto lo nico que
har es que se retrase la deteccin hasta haber hecho las reducciones, pero
el error ser siempre detectado antes de que tenga lugar cualquier movi
miento de desplazamiento.
Veamos el ejemplo con la entrada id + ) #

Tabla 5.5: Anlisis sintctico para la entrada

num

+) #

5.8.4

Recuperacin mediante producciones de error en analizadores


LR

Este mtodo se basa en la incorporacin en la gramtica del lenguaje lo


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
nal especial, x, que indica al algoritmo de anlisis dnde se desea realizar
una recuperacin de error. Por ejemplo, dada la gramtica para generar
expresiones aritmticas podemos introducir las siguientes producciones de
error:
E

E
I

X + X

TEMA 5. ANLISIS SIN


127

Regla
1 S'
2 EE + E
3 E num
4 EX

TCTICO ASCENDENTE

Estas pr
oducciones se tratan como las otras a la h
ora de con
struir el
autmata d
e anlisis LR. Mientras no se detecte ningn e
rror en la en
trada,
no se activarn ya que al ser x un smbolo ficticio no puede aparecer en la
cadena de entrada de forma natural y nunca dar una transicin en condi
ciones normales. En el momento en que se detecta un error el mtodo hace
lo siguiente:
1 Si el estado que se encuentra en la cima de la pila tiene una transicin
en X entonces se introduce en la entrada delante del smbolo conflictivo y se continua con el anlisis como si nada hubiera ocurrido.
2 Si por el contrario x no es un smbolo vlido en el estado de la cima,
entonces se elimina el smbolo actual de la entrada, se sustituye por x
y se eliminan de la pila tantos estados y smbolos como sea necesario

hasta encontrar uno en el que s sea vlido el carcter x o hasta vaciar


la pila, en este caso el mtodo falla y no es capaz de recuperarse del
error que se ha encontrado.
Veamos como se aplicara el mtodo al caso sencillo de una gramtica
nmeros
que genera sumas #deestado
+ naturales
E
num X
#
0
E

E
I

num

I X

d2

d3

d4

r3

aceptar
r3

r4

r4

d2

d3

en la que se ha introducido
de error genrica. Constru
r2 una produccin
r2
5
yamos el autmata de elementos LR y la tabla de anlisis asociada.

Pila
0

num++num#

0num2

++num#

OEl

++num#

OBI+4
128

Entrada Accin

+num#

desplazar
reducir regla 3
desplazar
error

Tabla de anlisis sintctico:

5.8. RECUPERACION DE ERRORES SINTACTICOS

Figura 5.2: Autmata de elementos LR

Pila

Entrada

OEl+4
X+num#
TablaOE1+4x3
5.6: Tabla de anlisis
+num#
0E1+4E5
+num#

Accin
desplazar
sintctico
reducir regla 4
reducir regla 2

A continuacin veremos ejemplos que ilustran el comportamiento del


OEl
+num# desplazar
algoritmo en dos situaciones diferentes.
OEl+4

0El+4num2

X como smbolo ficticio


0E1+4E5
OEl

num#

desplazar
reducir regla 3

reducir regla 2

aceptar

Vamos a estudiar de qu forma reacciona el analizador sintctico ante


la cadena errnea n + +n#. Veamos la evolucin de la pila, la entrada y
la accin que se lleva a cabo en cada momento:

Pila
0

EntraAccin
da
num num+num# desplazar
num+num# error

No exi 0num2
ste ninguna transicin vlida co
n el carcter + en el estado 4 por
tanto se declara un error, el analizador introduce el smbolo ficticio x en la
entrada y como el estado 4 tiene una transicin para ese carcter, se lleva
TEMA 5. ANLISIS SINTCTICO ASCENDENTE
129

a cabo un desplazamiento al estado 3 y el anlisis continua como si nad


a

hubiera pasado:

Tabla 5.7: Anlisis sintctico para la entrada num + + num#

El analizador se ha recuperado del error introduciendo en la cadena de

entrada el simbolo ficticio x? de forma que la expresin que realment


e
se ha reconocido ha sido num+;+num. Ahora la pregunta es: Qu e
s x?
Tenemos que sustituirlo por un smbolo de la gramtica adecuado en esa
posicin. En este caso el nico que es posible es num, de forma
que
la cadena una vez recuperada es num+num+num, Se ha corregido el error. S
e
podria haber sustituido tambin por num+num, pero siempre se suele sustituir
por el smbolo que resulte ms simple en el contexto de la regla que
ha
introducido x en la entrada.
X 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.

No existe ninguna transicin a partir del estado 2 con el carcter num y


130
5.8. RECUP

Pila
0

Entrada

Accin

ERACIN DE ERRORES SINTCTICOS

desplazar
reducir regla 4

tampoco ninguna para x- En est


+num#
a situac 0x3
in se sustituye el carcter confl
icOEl
+num# desplazar
tivo de
la entrada por x Y se eliminan s
OEl+4
num# desplazar
mbolo
0El+4num2
# reducir regla 3 s de la pila hasta encontrar un
0E1+4E5
# reducir regla 2 que admita una transicin con
estado
OEl
# aceptar
este s
mbolo de error. En este caso
sera necesario
hasta que ellaestado
en la cima. A partir
quedase
Tabla 5.8: desapilar
Anlisis sintctico
entradaO num
num + num#
para
de entonces la evolucin del analizador sera:
X+num#

Hemos reconocido x + num.


la cadenaobtener
de entrada
num num + num#. de error
Supongamos
5.8.5
Heursticas
buenas
para
producciones
Tal y como hemos visto la eficiencia del mtodo depende en gran me
dida de la adecuada eleccin de las reglas de error y del punto en donde
se coloca el smbolo ficticio x- Desgraciadamente no existen reglas de uso
general que podamos aplicar en todas las situaciones. Las reglas se defi

nen en base a la experiencia introduciendo reglas heursticas basadas en los


errores ms comunes y que funcionan de forma razonable en la mayora de
los casos. A continuacin se enumeran algunos consejos que se pueden
tener en cuenta:
1 Obtener una gramtica sin producciones de error lo ms compacta
posible teniendo una idea intuitiva clara de los elementos del lenguaje.
2 A partir de la gramtica anterior disee un analizador sintctico y re
copile una coleccin de programas con errores sintcticos y obtenga
TEMA 5. ANLISIS SINTCTICO ASCENDENTE

131

una clasificacin de los errores que han aparecido y con qu frecuen


cia.

3 Una vez clasificados los errores en funcin de su frecuencia, establ


e
cer una cota inferior, de forma que tan slo introduciremos produ
c
ciones de error para tratar de forma especfica aquellos errores que s
e
presentan con una frecuencia superior a la fijada. La forma de trat
ar
estos errores es:
ica.

Si el error ocurre con mucha fi'ecuencia de forma sistemt


Por ejemplo en Pascal:

olvidar el en una declaracin de u

n
procedimiento o escribir detrs del end del programa princi
pal
un punto y coma ; en vez del punto ..

Lo mejor es ent

onces
introducir acciones concretas para su tratamiento, por ejemplo:
bloque_ppal

BEGIN

lista_inst

END

puntoJDloque_ppal

puntoJDloque_ppal

; yyerror(

' 'Se

esperaba

un

' .'
y

se

en
contr

un

';')

Aunque puede parecer una tcnica un poco burda lo cierto es qu


e
muchos errores frecuentes se pueden tratar de una forma
muy
cmoda y sencilla con este mtodo.
Si el error es frecuente pero no puede describirse como la
omi
sin o la adicin de simbolos incorrectos, sino que se trata re
al
mente de un conjunto errores que se suelen presentar en una p
o
sicin especfica de la entrada sin que ninguno de ellos se de c
on
mayor frecuencia que los otros, entonces se utiliza una produ
c
cin de error con el smbolo x colocado en el punto confiicti
vo,

axj donde el prefijo a y el sufijo (3 son cadenas corr

ec
tas. Por ejemplo, en una gramtica para generar expresiones
se
suele producir un error con bastante frecuencia que consiste en l
a
omisin de un operador o uso de un operador no existente en
el
lenguaje, entonces una produccin adecuada de error sera:
E

4 No intentar introducir reglas de recuperacin especfica para los erro

res que no superen cierta frecuencia de corte mnima establec


ida.
132

5.8. RECUPERACIN DE ERRORES SINTCTICOS

Estos errores se tratan con las reglas de forma genrica, llamadas


'trgatelo-todo' (catch-all). En general, los lenguajes constan de subestructuras sintcticas delimitadas por ciertos smbolos de la gramtica.
Por ejemplo: un bloque de instrucciones empieza con el smbolo
end. De forma general una regl
begin y termina con el smbolo
a
'trgatelo-todo' es una regla de la forma A 1X2 donde A es el noterminal que describe la estructura a la que queremos asociar el trata
miento de errores y i y 2 son los terminales respectivos smbolos de
inicio y final.

5.8.6

Ejemplo

A continuacin veamos un ejemplo sencillo para ilustrar la metodo


loga. Supongamos un lenguaje para una pequea calculadora que genera
instrucciones del tipo:
print

+2

y:=3
X:= y

+ [y=0 71:4]

Tenemos slo dos instrucciones: para imprimir y para asignar. Las ex


presiones son las aritmticas elementales y consta de un operador condicio
nal. La primera tarea es disear una gramtica que genere dicho lenguaje:
p

PRINT

E-E

E I
E|E

ID
=

ASIG

E|(E)

[E?E:E]

A continuacin se realiza un estudio sobre los posibles errores ms co


munes obtenindose los resultados:
1 Se omiti la palabra

print

(25%).

2 Se confundi el signo = con la asignacin := (15%).


TEMA 5.

ANLISIS SINTCTICO ASCENDENTE

133

3 Se olvid cerrar el parntesis en las expresiones (20%).


4 Se olvid escribir un operador o se utiliz uno incorrecto (20%).
5 Se escribi

(?b:c)

en vez de

(5%)).

[a?b:c]

6 Se olvid cerrar un corchete (5%)).


7 El resto fueron errores variados.

La gramtica ampliada queda para este ejemplo:


p

p
I

PRINT

ID ASIG E
ID = E { yyerror(''Confundi ell
E
E

yyerror(''Olvid el

{
+

PRINT

con

el

'');}

yyerror(''Olvid

X E

]
el

yyerror(''Error en

)
el

operador

''); }

Una vez introducid

as
estas reglas debemos completarlas con las reglas 'trgatelo-todo' para con
templar el posible resto de errores. Tenemos tres estructuras bsicas: las

instrucciones, las subexpresiones entre parntesis y la expresin condicio


nal encerrada entre corchetes, que faltaban por tratar. Por tanto, aadimos
las reglas:

E ( X )
I

134

5.9

5.9. EJERCICIOS

EJERCICIOS
1 (0.25 ptos) La siguiente gramtica corresponde a algunas de las lis
tas vlidas en PROLOG. Se pide: (a) Construir la tabla de anlisis
SLR(l). (b) Eliminar los posibles conflictos que aparecen, conside
rando que el operador, es asociativo por la derecha.
Lista [ ] I [ Termino ]
Termino Termino , Termino | Lista

id

2 (0.25 ptos) Dada la siguiente gramtica que genera bloques de cdigo


que pueden contener declaraciones y sentencias. Se pide: (a) Cons
truir la coleccin de elementos LR(1). (b) Construir la tabla de anlisis
sintctico LALR(l). (c) Obtener la traza del anlisis LALR(l) para
la cadena de entrada: begin d; d; s; s end (a) Construir la colecB begin D ; S end
Dd I D ;d
S s I S ; s

cin de elementos LR(1). (b) Construir la tabla de anlisis sintctico


LALR(l). (c) Obtener la traza del anlisis LALR(l) para la cadena
de entrada: begin d; d; s; s end
3 (0.25 ptos) Dada la siguiente gramtica

S if E S

I if E S else S | id
E E and E | E or E | id | ( E )

(a) Construir la tabla de anlisis sintctico SLR(l). (b) En el caso


de que haya conflictos elegir la accin adecuada para que el operador
disyuncin or tenga menor prioridad que el operador conjuncin and,
y que ambos tengan asociatividad por la derecha; y que toda parte
del else de una sentencia condicional debe estar asociada al if ms
prximo.
TEMA 5. ANLISIS SINTCTICO ASCENDENTE

135

4 (0.25 ptos) Demostrar que la siguiente gramtica no es LR(1). E


s
LR(k) para algn k?
SXYa
Xa I
Yc

Yab
e

5 (0.25 ptos) Construir la tabla de precedencias de operadores para la


siguiente gramtica de operadores de forma que la parte del else est
asociada al if ms cercano.
S if C then S
CO

| if C then S

else S

id

Indica el contenido de la pila, la entrada y la accin a realizar para la


entrada if O then id else id.
6 (0.25 ptos) Considerar la siguiente gramtica. Se pide: (a) Construir
el AFD de items LR(0). (b) Construir la tabla de anlisis sintctico
SLR(l). (c) Mostrar el contenido de la pila, la entrada y la acci
n
para la cadena s; s; s. (d) Es esta gramtica LR(0)? Sino, describ
e
el tipo de conflicto.
stmteq stmt_seq ; stmt | stmt
stmt s