Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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 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
nmeros e identificadores.
TEMA 5.
95
EE + E
EE
E
E id
E num
Para la entrada id + id + id
5.2
TIPOS DE CONFLICTOS
Qu accin realizar: desplazar o reduccir?
EE +
Para la entrada
23=8
2
ElEElidl num
E 32=9
3
E 29=512
82=64
desplazar
reducir
(a) rbol incorrecto
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
97
s
s
id
num
reducir S ~ > id
(a) rbol incorrecto
5.3
id
num
reducir V ~> id
(b) rbol correcto
GRAMTICAS LR
98
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)
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
su lado derecho.
Modo d
accin
ir a
S.
X.
So
De forma esquemtica un analizador
sintctico consta de:
X en
ai
en\
Programa
conductor
Salida
V,
accin[S >
]=d,r,error,aceptar
ir_a[ S m ' %
5.3. GRAMTICAS LR
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
101
5.3.1
[A 3i 2]
siendo A
102
103
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
))#
+ .n
E E'_E .E
V.
E . n
E
.E + n
n
,
14
(A)
(A)
E
n
II
10
12
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)
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
E . E + n
CTICO ASCENDENTE
reduce-reduce.
El aspecto de la tabla de anlisis sintctico cambia respecto al anlisis
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
109
Vid
E V I num
V
S
id .
id .
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
110
5.6.1
X 3
y PRIM{'ya)
111
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)
{A)\a
n
II
[ A _ ( A .) , # B) ]
10
14
[A_(A).,#)]
15
12
5.7
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.
En
115
Veamos como las relaciones de precedencia nos van a servir para guiar
large
od
id
id
id ><1 id
<i id
< E -\- <iE * E >
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
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
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
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
119
5.8.1
121
122
5.8.2
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
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
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
(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
OEl
aceptar
0El*5num3
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.
mango.
el: esta rutina se llama desde los estados 0,2,4,5 que esperan el co
id,
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
io
en la pila y se cubre con el estado 4.
ta
operador''.
parntesis
derecho
)''.
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''
num
+) #
5.8.4
E
I
X + X
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
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
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
0El+4num2
num#
desplazar
reducir regla 3
reducir regla 2
aceptar
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
hubiera pasado:
Pila
0
Entrada
Accin
desplazar
reducir regla 4
131
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
';')
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
5.8.6
Ejemplo
+2
y:=3
X:= y
+ [y=0 71:4]
E-E
E I
E|E
ID
=
ASIG
E|(E)
[E?E:E]
(25%).
133
(?b:c)
en vez de
(5%)).
[a?b:c]
p
I
ID ASIG E
ID = E { yyerror(''Confundi ell
E
E
yyerror(''Olvid el
{
+
con
el
'');}
yyerror(''Olvid
X E
]
el
yyerror(''Error en
)
el
operador
''); }
as
estas reglas debemos completarlas con las reglas 'trgatelo-todo' para con
templar el posible resto de errores. Tenemos tres estructuras bsicas: las
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
S if E S
I if E S else S | id
E E and E | E or E | id | ( E )
135
Yab
e
| if C then S
else S
id