Sunteți pe pagina 1din 16

Recuperacin de Errores

Tratamiento de Errores. Procesadores de Lenguaje I

Rutinas de Manejo de Errores


Ocupan gran parte de los compiladores Objetivos
Informar con claridad, exactitud Recuperacin rpida
recuperacin no es correccin

No debe retrasar el procesamiento de programas sin errores No generar errores en cascada (ej. eliminar identificador)

Acciones posibles
Detectar errores Informar de los errores Recuperar de los errores Corregir errores

Necesidad actual de recuperacin?


Ms rpido re-compilar que leer siguiente error
2

Tratamiento de Errores. Procesadores de Lenguaje I

Tipos de Errores
Tipos de errores
Lxicos: escribir mal un identificador, nmero, Sintcticos: no poner un ; al final de una sentencia, estructura incorrecta Semnticos: multiplicar por una variable booleana Lgicos: bucle infinito

Herramientas para disminuir el nmero de errores ...


Lxicos
Si se utiliza alguna herramienta que complete palabras

Sintcticos
Si se utiliza algn editor basado en sintaxis (colores)

Semnticos
Busca funciones/clases e indica tipos especificados
3

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin Errores Sintcticos


Ejemplo 1: anlisis descendente Gramtica:
S::=a A S | b A A::=c A | d

Tabla:

N
S A

a aAS

b bA

c cA

d d

Entrada: a b ... Estado del anlisis cuando detecta el error:


Pila Entrada $S a b ... $SAa a b ... $SA b ... Error: Se ha encontrado una b, cuando se esperaba una c o d
Podra eliminarse
4

Tratamiento de Errores. Procesadores de Lenguaje I

Errores en Anlisis LR
Ejemplo 2: anlisis ascendente Gramtica 1. S::=A A 2. A::=x A 3. A::=y Entrada: xy
x 0 1 2 3 4 5 6 d3 d3 r3 r1 r2 r2 r2 d4 d4 r3 r3 d3
accin ir_a

y d4

$ acpt

S 1 5 6

A 2

6 7 8

Estado del anlisis cuando detecta el error: Se podra aadir un token y

Pila 0x3A6 0A2 0A2

Entrada $ $ $

Tratamiento de Errores. Procesadores de Lenguaje I

Estrategias de Recuperacin
No hay una estrategia de aceptacin universal
Abundan tcnicas heursticas y ad hoc

Principio general de recuperacin


Minimizar tokens eliminados/modificados Dejar el analizador listo para continuar procesando

Principales estrategias de recuperacin son:


Modo de pnico/alarma Nivel de frase Producciones de error Correccin Global
6

Tratamiento de Errores. Procesadores de Lenguaje I

Modo de Pnico
Caractersticas
Mtodo ms sencillo Lo pueden usar la mayora de los AS No entra en lazos infinitos Adecuado para lenguajes en los que son raros mltiples errores en la misma proposicin

Funcionamiento general
El AS desecha smbolos de la entrada, uno por uno, hasta encontrar un token de sincronizacin para continuar
Delimitadores (punto y coma, palabras clave como end)

Inconvenientes
Podran omitirse gran cantidad de smbolos sin analizar

Tratamiento de Errores. Procesadores de Lenguaje I

A nivel de frase
Caractersticas
Correcciones en la cadena de entrada

Funcionamiento
Descubierto el error se corrige (localmente) la entrada por un prefijo que permite continuar el AS
Sustituir una coma por un punto y coma, insertar un punto y coma, etc.

Inconvenientes
Dificultad para resolver situaciones en las que el error se produjo antes de la deteccin de ste Pueden producir lazos infinitos
Evitar insertar smbolos antes del smbolo actual en la entrada

Tratamiento de Errores. Procesadores de Lenguaje I

Producciones de error
Funcionamiento
Conocidos los errores ms comunes, se extiende la gramtica con producciones de error Reconocido el error, se dan diagnsticos precisos de la construccin errnea Ej.:
E->E op T | E->T E-> E T //falta operador T->id | num

Inconvenientes
Dificultad para ir ms all de los casos particulares ms frecuentes Generacin ambigedades
9

Tratamiento de Errores. Procesadores de Lenguaje I

Correccin Global
Caractersticas
Algoritmos que eligen una secuencia mnima de cambios para obtener una correccin global de menor costo Ej.: x=a(p+q(-b(r-s); -> a(p+q)-b(r-s); ifa=b then sum=0; -> if a =b then sum=0;

Inconvenientes
Tcnicas costosas en tiempo y espacio: mtricas de distancias, bsqueda, optimizacin,
10

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin en Analisis Descendente Predictivo


Deteccin del error
En un procedimiento, el token de preanlisis no es vlido en esa situacin

Recuperacin
Modo pnico
Si no encuentra token apropiado, buscar hasta tokens de sincronizacin Calcular los tokens de sincronizacin apropiados en cada situacin
Conjunto siguiente del no terminal Conjunto primero, despus

Eleccin que permita rpida recuperacin de los errores ms comunes

11

Recuperacin en Anlisis Descendente Predictivo. Ejemplo


Ejemplo:
S if B then S | write B | i := B B i = i | i <> i | true | false
Procedure S() { if (token== if) { scan(); B(); if (token== then) {scan();} else error(); S(); } else if (token==write) {scan(); B(); } else if (token== i) { scan(); if (token == asig) {scan();} else error(); B(); } else error() }

Tratamiento de Errores. Procesadores de Lenguaje I

PRIMERO(S)= {if, write, i} PRIMERO(B)= {i,true,false}

Procedure B() { if (token= i) { scan(); if (token in [igual, noigual]) scan(); else error(); if (token == i) then scan else error; } elseif (token in [true, false]) scan(); else error(); } Procedure Main() { S(); if (token!=$) error }

12

Recuperacin en Analisis Descendente Predictivo. Ejemplo


Ejemplo con modo pnico:
S if B then S | write B | i := B B i = i | i <> i | true | false
Procedure S(sync) { buscarSinc({if, write, i}, sync); if (not token in {if, write, i})return; if (token== if) { scan(); B({then}); if (token== then) scan(); S(sync); } else if (token==write) {scan(); B({$}); } else if (token== i) { scan(); if (token == asig) scan(); B({$}); } buscarSinc(sync, {}) }

Tratamiento de Errores. Procesadores de Lenguaje I

PRIMERO(S)= {if, write, i} PRIMERO(B)= {i,true, false} SIGUIENTE(S)= {$}

SIGUIENTE(B)= {then, $} Procedure B(sync) { buscarSinc({i, true, false}, sync); if (not token in {i, true, false}) return; if (token= i) { scan(); if (token in {igual, noigual}) scan(); Procedure buscarSinc if (token == i) scan(); } (PRIM,SIG) elseif (token in {true, false}) { scan(); if (not token in PRIM){ buscarSinc(sync, {}); mensajeError(); } avanzar(PRIM U SIG);} } Procedure Main() Procedure avanzar(A) { { S({$, if, write, i}); while not (token in A){ if (token!=$) error(); scan(); } } 13 }

Recuperacin en Analisis Descendente Predictivo. Ejemplo


Ej.:
if a:=b then writte false
Procedure S(sync) { buscarSinc({if, write, i}, sync); if (not token in {if, write, i})return; if (token== if) { scan(); B({then}); if (token== then) scan(); S(sync); } else if (token==write) {scan(); B({$}); } else if (token== i) { scan(); if (token == asig) scan(); B({$}); } buscarSinc(sync, {}) }

Tratamiento de Errores. Procesadores de Lenguaje I

PRIMERO(S)= {if, write, i} PRIMERO(B)= {i,true, false} SIGUIENTE(S)= {$} SIGUIENTE(B)= {then, $} Procedure B(sync) { buscarSinc({i, true, false}, sync); if (not token in {i, true, false}) return; if (token= i) { scan(); if (token in {igual, noigual}) scan(); Procedure buscarSinc if (token == i) scan(); } (PRIM,SIG) elseif (token in {true, false}) { scan(); if (not token in PRIM){ buscarSinc(sync, {}); mensajeError(); } avanzar(PRIM U SIG);} } Procedure Main() Procedure avanzar(A) { { S({$, if, write, i}); while not (token in A){ if (token!=$) error(); scan(); } } 14 }

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin en Analizador LL(1)


Deteccin del error
El terminal de la cima de la pila no concuerda con la entrada El no terminal A de la cima de la pila y el termina a de la entrada indexan la tabla de anlisis sintctico una entrada vaca, M[A,a]=

Recuperacin
Modo pnico
La eficacia de esta estrategia depende de la eleccin del conjunto de tokens de sincronizacin La eleccin debe ser tal que el AS se recupere rpidamente de los errores ms comunes
15

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin en AS LL(1)
Heursticas para modo pnico
Colocar todos los smbolos de SIGUIENTE(A) en el conjunto de sincronizacin de A Saltar tokens hasta encontrar uno en SIGUIENTE(A) y sacar A de la pila, es probable que el AS pueda seguir
Accin especial si se vaca la pila: poner S y saltar hasta PRIMERO(S)

Aadir los smbolos de PRIMERO(A) al conjunto de sincronizacin de A, el AS contina con A si aparece un token de PRIMERO(A) Aadir al conjunto de sincronizacin tokens de inicio de bloques de una jerarqua superior (bloques, sent, exp, ) 16 Si PRIMERO( ) d i i l

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LL(1)
Modo Pnico Ejemplo:
E E T T F TE +TE | FT *FT | (E) | id + N Primero Siguiente E {(,id} {),$} E {+,} T F * scan scan ext T {*,} {),$} {+,),$} {(,id} {+,),$} {(,id} {+,*),$} ( ) $

id E T F E scan T scan Fid

ETE scan TFT ext T ext

E+TE scan

ETE ext ext scan E E TFT ext F(E) ext ext ext T T
17

T*FT scan

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LL(1)
Ejemplo entrada:
)id*+id

id E T F E scan

* scan scan ext

ETE scan

E+TE scan

ETE ext ext scan E E

TFT ext T scan T Fid ext

TFT ext ext T*FT scan T T F(E) ext ext


18

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LL(1)
A nivel de frase
Se llenan las entradas en blanco de la tabla con llamadas a rutinas de error
Las rutinas insertan, cambian o eliminan smbolos de la entrada y emiten mensajes de error Pueden sacar elementos de la pila

Hay que asegurarse de que no se produzcan lazos infinitos


Las acciones de recuperacin deben consumir smbolos de la entrada o de la pila

19

Recuperacin Precedencia por Operador


Gramtica: E::= E+E | E*E | (E) | Id Tabla de precedencia:
) Id * + ( $ ( < < < < Id < < < < * > > > < < < + > > > > < < ) > > > > = $ > > > > =

Tratamiento de Errores. Procesadores de Lenguaje I

Insertar $ al principio y al final de la cadena de entrada Insertar las relaciones de precedencia en la cadena de entrada Mientras entrada$S$ hacer Recorrer entrada desde la izquierda hasta encontrar > Buscar a la izquierda, a partir de ese punto, el primer < Reducir el pivote que se encuentra en el medio, incluyendo no terminales adyacentes Reinsertar las relaciones de precedencia, ignorando los no terminales
20

Algoritmo

Recuperacin Precedencia por Operador

Tratamiento de Errores. Procesadores de Lenguaje I

Hay dos situaciones en las que un AS por precedencia descubre errores sintcticos:
Encontrado el pivote, no existe ninguna produccin que reducir
Para reducir hay que decidir que regla de produccin se asemeja ms al pivote

No se cumple ninguna relacin de precedencia entre el terminal de la pila y el de la entrada actual


Estrategia para continuar el anlisis Las entradas en blanco de la tabla de relacin de precedencia deben especificar rutinas de recuperacin de errores Para recuperarse hay que modificar la pila, la entrada o ambas Hay que prevenir los bucles infinitos
21

Recuperacin Precedencia por Operador


Problemas al reducir el pivote

Tratamiento de Errores. Procesadores de Lenguaje I

Para casos sencillos pueden enumerarse todos los casos de cada produccin. Ej.: aritmtica
si +,* se reduce y no hay no terminales a los lados: falta operando Si id se reduce y no hay no terminal a un lado: falta operador Si () se reduce si no terminal en medio: falta expresin

Para reducir hay que decidir que regla de produccin se asemeja ms al pivote Una posibilidad es modificarlo, eliminando o insertando smbolos hasta encontrar produccin ms parecida Ej.: A-> a E c encontrado: aac < a == a == c > modificar a aEc < a == c > a ilegal en lnea falta E en lnea

22

Recuperacin Precedencia por Operador

Tratamiento de Errores. Procesadores de Lenguaje I

No se cumple ninguna relacin de precedencia entre el terminal de la pila y el de la entrada actual


Las entradas en blanco de la tabla de relacin de precedencia deben especificar rutinas de recuperacin de errores Para recuperarse hay que modificar la pila, la entrada o ambas Hay que prevenir los bucles infinitos Ej.:E E+E | E-E | E*E | E/E | EE | (E) | -E | id

id id ( ) $ + *

) >

> > > < < > > > < < > > < > > >
23

< < == > < < < < < < > >

Recuperacin Precedencia por Operador


e1: // falta expresin
insertar id en la entrada : mostrar falta operando

Tratamiento de Errores. Procesadores de Lenguaje I

E E+E | E-E | E*E | E/E | EE | (E) | -E | id id id ( ) $ + * e3 < e3 < < < ( e3 < e3 < < < ) > == > e2 > > $ > e4 > e1 > > + > < > < > > * > < > < < >

e2: // las expresiones empiezan con parntesis de cierre


eliminar ) de la entrada :mostrar parntesis derecho no equilibrado

e3: // despus de id o ) aparece id o (


insertar + en la entrada : mostrar falta operador

e4: // las expresiones terminan en parntesis de apertura


extraer ( de la pila : mostrar falta parntesis derecho

Ej.: id + )

24

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LR(1)
Deteccin del error
Al consultar la tabla de acciones del AS y la entrada es de error
Deteccin ms rpida que otros analizadores: propiedad del prefijo viable

Nunca se hace un desplazamiento posterior al token errnea


LR cannico nunca hace una reduccin antes de anunciar un error SLR y LALR pueden realizar varias reducciones antes de anunciar un error, pero nunca desplazan un smbolo de la entrada errneo Mayor rapidez de deteccin al aumentar estados
25

Tratamiento de Errores. Procesadores de Lenguaje I

Deteccin errores AS LR(1)


Ej. SLR vs LR(1). Gramtica: A->(A)|a
E ( 0 1 2 3 4 5 d3 d2 d5 r1 r1 r2 d3
accin ir_a

E ( 0 1 2 d5 d2

accin

ir_a

a d2

$ acpt r2

A 1

a d3

$ acpt

A 1 4

d6 r2 d7

3 4 5 6 7 8 9 d9 r1 d5 d6 r2

8 r1

Comparar: (a$ a)$

26

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LR(1)
Recuperacin LR en modo pnico
Procedimiento heurstico que pretende:
Identificar una construccin en proceso de ser reconocida cuando aparece el error Determinar la posicin en la entrada para continuar

Algoritmo
Se examina la pila hasta encontrar un estado s con valor de ir_a no vaco: al menos para un smbolo no terminal A Se desechan smbolos de la entrada hasta encontrar un terminal a vlido para seguir al no terminal A (accin no vaca) Poner en la pila el estado de ir_a[s,A] y sigue el anlisis sintctico
27

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LR(1)
A nivel de frase
Se construyen procedimientos de recuperacin que modifiquen la pila y/o la entrada dependiendo del error Los procedimientos de recuperacin eliminarn o desplazarn al menos un smbolo de la entrada o reducirn la pila si la entrada ha sido procesada (evitar bucles infinitos) No extraer de la pila estados que alcancen un no terminal (estaremos extrayendo construcciones correctamente examinadas) Para evitar excesivos mensajes de error se puede extender, en los estados en los que las reducciones son siempre al mismo estado, la reduccin a las entradas en blanco (los errores se detectarn ahora al desplazar)
28

Tratamiento de Errores. Procesadores de Lenguaje I

Recuperacin AS LR(1)
A nivel de frase Ejemplo: id+)
E E+E|E*E|(E)|id
e1: se esperaba un operando id ( pero se encontr operador o final
introducir id en la pila y estado 3 mostrar falta operando accin ir_a

id 0 1 2 3 4 5 6 7 8 9 d3 e3 d3 r4 d3 d3 e3 r1 r2 r3

+ d4 r4

$ e1 acpt e1 r4 e1 e1 e4 r1 r2 r3

E 1 6 7 8

e1 e1 d2 e2 d5 e3 e2 r4 r4 r4 e1 e1 d2 e2 e1 e1 d2 e2 e1 e1 d2 e2 d4 r1 r2 r3 d5 e3 d9 d5 r2 r3 r1 r2 r3 r1 r2 r3

e2: encuentra un parntesis


eliminar ) de la entrada mostrar ) no equilibrado

e3: se esperaba un operador pero se encontr id )


introducir + en la pila y estado 4 mostrar falta operador introducir ) en la pila y estado 9 mostrar falta parntesis derecho

e4: se esperaba operador ) pero encontr el final de la entrada


29

Tratamiento de Errores. Procesadores de Lenguaje I

Conj. LR(0)
(

I2:

[E(E)] [EE+ E] [EE * E] [E (E)] [E Id]

( E )

e1
Id

e2

I6:

[E(E )] [EE+ E] [EE * E] [ EE+E] [EE+ E] [EE * E]

I9:

[E(E) ]

I0:

e1

[EE] [EE+ E] [EE * E] [E (E)] [E Id]

Id

I3: I4:

e3
E + * + E

e4

[EId]

I7:

[EE+E] [EE+ E] [EE * E] [E(E)] [EId] [EE *E] [EE+ E] [EE * E] [E(E)] [EId]

I8:

[EE *E ] [EE+ E] [EE* E]

I1:

[EE] [EE+ E] [EE* E]

e1
*

e3

I5:

e1

e1: e2: e3: e4:

esperaba operando o ( encuentra un parntesis ) esperaba operador esperaba) 30

Tratamiento de Errores. Procesadores de Lenguaje I

Conclusiones de Manejo de Errores


Aspecto complejo del diseo del compilador
Anlisis cuidadoso del lenguaje y posibles errores No hay una estrategia de aceptacin universal Abundan tcnicas heursticas y ad hoc

Principio general de recuperacin


Minimizar tokens eliminados/modificados Dejar el analizador listo para continuar procesando

Objetivos
Informar con claridad, exactitud y extensin Evitar errores en cascada y procesos infinitos

Analizadores LL y LR gran capacidad para estrategias en modo pnico y frase en funcin del contexto
31

S-ar putea să vă placă și