MANEJO DE ERRORES SINTACTICOS
Click here to load reader
description
Transcript of MANEJO DE ERRORES SINTACTICOS
MANEJO DE ERRORES
Organización de Lenguajes y Compiladores 1
Aura Cifuentes (lucita287)
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
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;
}
}
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”);
}
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;
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
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.
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
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.
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;
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.