Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sesion V 3U Tratamiento de Errores
Sesion V 3U Tratamiento de Errores
Una de las funciones ms importantes de un compilador es su respuesta a los errores en un programa fuente. Los errores pueden ser detectados durante casi cualquier fase de la compilacin. Estos errores estticos (o de tiempo de compilacin) deben ser notificados por un compilador, y es importante que el compilador sea capaz de generar mensajes de error significativos y reanudar la compilacin despus de cada error. Cada fase de un compilador necesitar una clase ligeramente diferente de manejo de errores. Y, por lo tanto, un manejador de errores debe contener operaciones diferentes, cada una apropiada para una fase y situacin especfica. Es recomendable estudiar las tcnicas de manejo de errores por cada fase.
~1~
Una definicin de lenguaje por lo general requerir no solamente que los errores estticos sean detectados por un compilador, sino tambin ciertos errores de ejecucin. Esto requiere que un compilador genere cdigo extra, el cual realizar pruebas de ejecucin apropiadas para garantizar que todos esos errores provocarn un evento apropiado durante la ejecucin. El ms simple de tales eventos ser detener la ejecucin del programa. Sin embargo, a menudo esto no es adecuado, y una definicin de lenguaje puede requerir la presencia de mecanismos para el manejo de excepciones. stos pueden complicar sustancialmente la administracin de un sistema de ejecucin, especialmente si un programa puede continuar ejecutndose desde el punto donde ocurri el error. Ejemplo VAR ch : CHAR; (* Un identificador no se puede utilizar si *) ent: INTEGER; (* previamente no se ha definido. *) ... ch := ent + 1; (* En Pascal no es vlido, en C s. *) Anlisis Lxico: Devuelve la secuencia de tokens: id asig id suma numero ptocoma Anlisis Sintctico: Orden de los tokens vlido Anlisis Semntico: Tipo de variables asignadas incorrecta
TIPOS DE ERRORES
Tipos de errores que suelen ocurrir (dependiendo de la fase): Lxicos: No concuerda con ninguna ER. Ejemplo: escribir mal una palabra clave Sintcticos: La estructura que se ha seguido no es correcta. Ejemplo: expresin con parntesis no emparejados Semnticos: La estructura est bien pero hay errores de significado Ejemplo: operador y operandos incompatibles. Lgicos: Los comete el programador Ejemplo: una llamada infinitamente recursiva Algunos errores se pueden detectar en compilacin otros solo en ejecucin. El tratamiento de errores es una parte importante que se suele descuidar
~2~
~3~
Si en el momento de detectar el error ya hemos pasado por algn estado final ejecutamos la accin correspondiente al ltimo estado final visitado con el lexema formado hasta que salimos de l; el resto de caracteres ledos se devuelven al flujo de entrada y se vuelve al estado inicial; Si no hemos pasado por ningn estado final, advertimos que el carcter encontrado no se esperaba, lo eliminamos y proseguimos con el anlisis. Construccin de un analizador lxico Los analizadores lxicos pueden construirse: Usando generadores de analizadores lxicos: Es la forma ms sencilla pero el cdigo generado por el analizador lxico es ms difcil de mantener y puede resultar menos eficiente. Escribiendo el analizador lxico en un lenguaje de alto nivel: Permite obtener analizadores lxicos con ms esfuerzo que con el mtodo anterior pero ms eficientes y sencillos de mantener.
~4~
Consiste en ignorar el resto de la entrada hasta llegar a una condicin de seguridad. Una condicin tal se produce cuando nos encontramos un token especial (por ejemplo un ; o un END). A partir de este punto se sigue analizando normalmente.
Recuperacin a nivel de frase Intenta recuperar el error una vez descubierto. En el caso anterior, por ejemplo, podra haber sido lo suficientemente inteligente como para insertar el token ;. Hay que tener cuidado con este mtodo, pues puede dar lugar a recuperaciones infinitas. Reglas de produccin adicionales para el control de errores La gramtica se puede aumentar con las reglas que reconocen los errores ms comunes. En el caso anterior, se podra haber puesto algo como: sent_errne a sent_sin_acabar sentencia_acabada ; sentencia_acabada sentencia ; sent_sin_acabar sentencia Lo cual nos da mayor control en ciertas circunstancias Correccin Global Dada una secuencia completa de tokens a ser reconocida, si hay algn error por el que no se puede reconocer, consiste en encontrar la secuencia completa ms parecida que s se pueda reconocer. Es decir, el analizador sintctico le pide toda la secuencia de tokens al lxico, y lo que hace es devolver lo ms parecido a la cadena de entrada pero sin errores, as como el rbol que lo reconoce.
~5~
2. Especificacin de un comprobador de tipos bsico Bsicamente se debern realizar dos tareas: a) Asignacin de tipos: en las declaraciones. b) Evaluacin y comprobacin de tipos: En las expresiones y en las funciones, as como en las sentencias.
~6~
~7~
~8~
Dentro de las comprobaciones estticas (en el momento de la compilacin), tenemos la deteccin e informacin de errores como: Comprobaciones de tipos: operadores aplicados a operandos incompatibles, asignacin de tipos incompatibles, llamadas a funciones con tipos no adecuados, etc. Comprobaciones de flujo de control: las sentencias que hacen que el flujo de control abandone una construccin debe tener alg un lugar a donde transmitir el control. Por ejemplo: Unbreak debe estar dentro de una proposicin while, for o switch en C. Comprobaciones de unicidad: situaciones en las que solo se puede definir un objeto una vez exactamente. Por ejemplo: Un identificador, las etiquetas case dentro de un switch. Solo nos hemos centrado en las comprobaciones de tipo. Las otras son en cierto modo rutinarias y se pueden realizar fcilmente insertando acciones intercaladas en el cdigo para realizarlas, por eje. Cuando se introduce un identificador en la Tabla de Smbolos.
~9~