MANEJO DE ERRORES SINTACTICOS

11

Click here to load reader

description

Manejo de Errores 1. Ignorar el problema (Panic mode ) 2. Recuperación a nivel de frase 3. Reglas de producción adicionales para el control de errores 4. Corrección Global

Transcript of MANEJO DE ERRORES SINTACTICOS

Page 1: MANEJO DE ERRORES SINTACTICOS

MANEJO DE ERRORES

Organización de Lenguajes y Compiladores 1

Aura Cifuentes (lucita287)

Page 2: MANEJO DE ERRORES SINTACTICOS

Ignorar el problema (Panic mode ):

� Consiste en ignorar el resto de la entrada hasta llegar a una condición de seguridad. Una condición tal se produce cuando nos encontramos un token especial (por ejemplo un ‘;’ o un ‘END’).

� A partir de este punto se sigue analizando normalmente

Page 3: MANEJO DE ERRORES SINTACTICOS

Ignorar el problema (Panic mode):

Un ejemplo de Panic Mode sería desechar los simbolosimplicados en el error y salir del error al encontrar punto y coma.

Public void metodo1(int a, int b){

a= a+b-t;a= a+b-t;

if (a > b ){

b= b+t

b= b-1;

}

}

Page 4: MANEJO DE ERRORES SINTACTICOS

Ignorar el problema (Panic mode):

� Para un lenguaje que reconoce WHILE, FOR, OPERACIONES, IF , PRINTF definición de variables, para recuperarse al venir otra instrucción.

if (a> b) then {b=b-1 Xwhile (b>a) {

DETECCIÓN DEL ERRORwhile (b>a) {

printf ( “HOLA”);a:= a +1;

}if (a == 10) printf (“FIN”);

}

Page 5: MANEJO DE ERRORES SINTACTICOS

Ignorar el problema (Panic mode):

S ::= SLInstrucion;

SLInstrucion :: = SLInstrucion Instruccion

| Instruccion;

Instruccion ::= IF CONDICIONTHEN NINSTRUCCION

|FOR CONDFOR NINSTRUCCION|FOR CONDFOR NINSTRUCCION

| printf openCTSTRING closeC puntocoma

| iden igual E puntocoma

| error;

NINSTRUCCION ::= openCor SLInstrucion closeCor

| Instruccion;

Page 6: MANEJO DE ERRORES SINTACTICOS

Ignorar el problema (Panic mode):

Instruccion ::= IF CONDICIONTHEN NINSTRUCCIONLuego esta misma producción redujo por:NINSTRUCCION ::= openCor SLInstrucion closeCorSLInstrucion produjo una lista de Instrucciones pero encontró error al

El error se produjo en este NO TERMINAL

SLInstrucion produjo una lista de Instrucciones pero encontró error al estar en esta producción:

Instruccion ::= iden igual E puntocomaAhí se recupero al encontrar la terminal while, pero se perdió la instrucción b=b-1. En el caso de no encontrar otra instrucción (obtener el terminal }) no se lograra recuperar del IF.

EL ESTADO error PARA ESTE CASO SE USA PARA POSICIONES CRITICAS

Page 7: MANEJO DE ERRORES SINTACTICOS

Recuperación a nivel de frase:

� Intenta recuperar el error una vez descubierto. En el caso anterior, por ejemplo, podría haber sido lo suficientemente inteligente como para insertar el token ‘;’ . Hay que tener cuidado con este método, pues puede dar lugar a recuperaciones infinitas.

Page 8: MANEJO DE ERRORES SINTACTICOS

Recuperación a nivel de frase:Para este tipo de error, podemos prever que IF CONDICIONINSTRUCCIONES por lo que podemos eliminar la palabra while y componer nuestra gramatica.

Public void metodo1(int a, int b){a= a+b-t;If while (a > b ){If while (a > b ){b= b+t;b= b-1;

}}

SENTENCIA := IF CONDICION INSTRUCCIONES| IF error CONDICION INSTRUCCIONES

Page 9: MANEJO DE ERRORES SINTACTICOS

Reglas de producción adicionales para el

control de errores:

� La gramática se puede aumentar con las reglas que reconocen los errores más comunes.

Para este ejemplo podemos imaginar, este posible error y agregar acciones a la gramática para solucionarlo.

Page 10: MANEJO DE ERRORES SINTACTICOS

Reglas de producción adicionales para el

control de errores:

a= a+b-t;

if (a > b ){

b= b+t

b= b-1;

}}

}

Posible_error := Sent1 Sent2;

Sent1 := sentencia;

Sent2 = sentencia PuntoComa;

Page 11: MANEJO DE ERRORES SINTACTICOS

Corrección Global

� Dada una secuencia completa de tokens a ser reconocida, si hay algún error por el que no se puede reconocer, consiste en encontrar la secuencia completa más parecida que sí se pueda reconocer.

� Es decir, el analizador sintáctico le pide toda la secuencia de tokens al léxico, y lo que hace es devolver lo más de tokens al léxico, y lo que hace es devolver lo más parecido a la cadena de entrada pero sin errores, así como el árbol que lo reconoce.