Beruflich Dokumente
Kultur Dokumente
1.
Introducci
on
En esta pr
actica el alumno aprendera a resolver conflictos y a incorporar
la recuperaci
on de errores en modo panico al analizador LALR(1) generado
por Bison.
Para el trabajo de esta pr
actica puede resultar de mucha utilidad la informaci
on que proporciona Bison sobre el automata LALR(1) que genera.
Al ejecutar Bison con la opci
on -v se genera toda la informacion del analizador LALR(1) en un fichero de texto cuyo nombre por defecto tendra la
extension .out. En este archivo se encuentran:
1. Las reglas de la gram
atica.
2. Los posibles conflictos.
3. El aut
omata LALR(1): Estados, elementos LR(1), acciones en cada
estado,. . .
2.
2.1.
Depuraci
on y resoluci
on de conflictos
Comportamiento por defecto
Frecuentemente la gram
atica que especifica un lenguaje no es LALR(1)
lo que significa que la tabla del analizador que construye Bison contiene conflictos. Esto es particularmente importante cuando se trabaja con gramaticas
ambiguas.
Por ejemplo, si se compila con Bison la especificacion sintactica siguiente:
%token FINLINEA ENTERO MAS POR
%%
1
s: expresion FINLINEA
;
expresion: expresion MAS expresion
| expresion POR expresion
| ENTERO
;
%%
se obtendr
a el siguiente mensaje:
$ ... conflictos: 4 desplazamiento(s)/ reducci
on(ones)
Los conflictos de este ejemplo surgen porque la gramatica es ambigua.
La situaci
on donde sera valido un desplazamiento o una reduccion se
denomina un conflicto desplazamiento/reducci
on. Bison esta dise
nado para
resolver estos conflictos eligiendo el desplazamiento, a menos que se le indique lo contrario. Se produce un conflicto de reducci
on/reducci
on si hay
dos o m
as reglas que pueden aplicarse a la misma secuencia de entrada. Por
defecto Bison resuelve los conflictos reduccion/reduccion eligiendo la regla
que aparece primero en la gramatica.
Cuando la elecci
on por defecto de Bison ante un conflicto no resulta
adecuada, se puede usar la precedencia y asociatividad de los smbolos y el
orden de las reglas para indicar a Bison como debe resolver los conflictos.
2.2.
3.
Recuperaci
on de errores
El analizador sint
actico generado por Bison informa de los errores sintacticos llamando a la funci
on yyerror(), que debe ser escrita por el programador. Esta funci
on es llamada cada vez que se encuentra un error y recibe
como argumento una cadena (normalmente el mensaje de error que se desea
mostrar).
Una implementaci
on muy simple de la funcion yyerror podra ser:
void yyerror (char *s)
{
fprintf (stderr, " %s \n", s);
}
Cuando se compila un programa con errores, es deseable que con una
u
nica compilaci
on se muestren todos los errores que contiene. Por esta razon
no es aceptable que el an
alisis finalice ante el primer error del programa
fuente.
3
Es posible definir c
omo recuperarse de un error sintactico escribiendo
Poner pocas reglas con el token error puede provocar que el analizador
se salte demasiados smbolos del programa fuente antes de recuperarse del
error. Pero abusar de los tokens error puede inducir a mostrar mas errores
de los que realmente contiene el programa fuente. Por tanto, la inclusion de
reglas con estos tokens debe hacerse cuidadosamente.
4.
Ejercicios
1. Considera la siguiente gram
atica que reconoce expresiones matematicas
sencillas
S LE $
LE LE ; E
| E
E E + E
| E E
| E E
| E/E
| (E)
| cte
| ctr
donde cte representa una constante entera sin signo y ctr una constante
real sin signo.
a) Construye un analizador lexico sintactico para la gramatica anterior.
b) Resuelve todos los conflictos del analizador usando precedencia y
asociatividad.
2. A
nade a la gram
atica del ejercicio anterior alguna/s regla/s para el
tratamiento del token error que permita que el nuevo analizador
se recupere en modo p
anico ante errores en la entrada. Aseg
urate de
que el analizador resultante detecta los dos errores que contiene la
siguiente cadena: 3 + 5.12 * (12 + -5) + ((5.23 + 2) -*3).