Está en la página 1de 9

Universidad Nacional del Santa

Curso: Teora de Compiladores

TRATAMIENTO DE ERRORES INTRODUCCION


Los errores encontrados en las distintas fases de anlisis se envan a un mdulo denominado manejo de errores. En el caso ms sencillo puede ser un subprograma al que se le invoca envindole el cdigo de error, y que se encarga de escribir un mensaje con el error correspondiente, y el nmero de lnea donde se ha producido, as como de cortar el proceso de traduccin. Si se desea construir un tratamiento de errores ms completo, por ejemplo detectando todos los errores del programa fuente, el mdulo se complica dado que los analizadores deben proseguir su trabajo con falta de datos. A continuacin se muestra un fragmento de cdigo de un mtodo de la clase Errores escrito en C++, para el tratamiento de errores sintcticos. En el caso que se presenta cada vez que se encuentra un error el compilador se detiene, y finaliza el proceso.

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.

Docente: Ing. Mirko Manrique Ronceros

~1~

Universidad Nacional del Santa

Curso: Teora de Compiladores

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

Docente: Ing. Mirko Manrique Ronceros

~2~

Universidad Nacional del Santa

Curso: Teora de Compiladores

TRATAMIENTO DE LOS ERRORES LEXICOS


Un traductor debe adoptar alguna estrategia para detectar, informar y recuperarse para seguir analizando hasta el final. Las respuestas ante el error pueden ser: Inaceptables: Provocadas por fallos del traductor, entrada en lazos infinitos, producir resultados errneos, y detectar slo el primer error y detenerse. Aceptables: Evitarla avalancha de errores (mala recuperacin) y, aunque ms complejo, informar y reparar el error de forma automtica. La conducta de un Analizador de Lxico es el de un Autmata finito o scanner. Deteccin del error: El analizador de Lxico detecta un error cuando no existe transicin desde el estado que se encuentra con el smbolo de la entrada. El smbolo en la entrada no es el esperado. Los errores lxicos se detectan cuando el analizador lxico intenta reconocer componentes lxicos y la cadena de caracteres de la entrada no encaja con ningn patrn. Son situaciones en las que usa un carcter invalido (@,$,",>,...), que no pertenece al vocabulario del lenguaje de programacin, al escribir mal un identificador, palabra reservada u operador. Errores lxicos tpicos son: 1. Nombre ilegales de identificadores: un nombre contiene caracteres invlidos. 2. Nmeros incorrectos: Un numero contiene caracteres invlidos o no est formado correctamente, por ejemplo 3,14 en vez de 3.14 o 0.3.14. 3. Errores de ortografa en palabras reservadas: caracteres omitidos, adicionales o cambiados de sitio, por ejemplo la palabra while en vez de hwile. 4. Fin de archivo: se detecta un fin de archivo a la mitad de un componente lxico. Los errores lxicos se deben a descuidos del programador. En general, la recuperacin de errores lxicos es sencilla y siempre se traduce en la generacin de un error de sintaxis que ser detectado ms tarde por el analizador sintctico cuando el analizador lxico devuelve un componente lxico que el analizador sintctico no espera en esa posicin. Los mtodos de recuperacin de errores lxicos se basan bien en saltarse caracteres en la entrada hasta que un patrn se ha podido reconocer; o bien usar otros mtodos ms sofisticados que incluyen la insercin, borrado, sustitucin de un carcter en la entrada o intercambio de dos caracteres consecutivos. Una buena estrategia para la recuperacin de errores lxicos:

Docente: Ing. Mirko Manrique Ronceros

~3~

Universidad Nacional del Santa

Curso: Teora de Compiladores

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.

TRATAMIENTO DE LOS ERRORES SINTACTICOS


Gran parte de la deteccin y recuperacin se centra en el AS. Muchos errores de naturaleza sintctica Recuperacin: Al producirse un error el compilador debe ser capaz de informar del error y seguir compilando. (Ideal) El manejo de errores de sintaxis es el ms complicado desde el punto de vista de la creacin de compiladores. Nos interesa que cuando el compilador encuentre un error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador sintctico debe tener como objetivos: Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localizacin. Recuperarse del error, para poder seguir examinando la entrada. No ralentizar significativamente la compilacin. Un buen compilador debe hacerse siempre teniendo tambin en mente los errores que se pueden producir; con ello se consigue: Simplificar la estructura del compilador. Mejorar la respuesta ante los errores. Tenemos varias estrategias para corregir errores, una vez detectados:

Docente: Ing. Mirko Manrique Ronceros

~4~

Universidad Nacional del Santa Ignorar el problema (Panicmode)

Curso: Teora de Compiladores

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.

Docente: Ing. Mirko Manrique Ronceros

~5~

Universidad Nacional del Santa

Curso: Teora de Compiladores

TRATAMIENTO ERRORES SEMANTICOS


COMPROBACIN DE TIPOS 1. Aspectos generales Un lenguaje con comprobacin fuerte de tipos es capaz de garantizar que los programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se detectarn siempre en tiempo de compilacin. Como mnimo, ante un error, un comprobador de tipos debe informar de la naturaleza y posicin del error y recuperarse para continuar con la comprobacin del resto del programa a analizar. Veamos algunas de las operaciones a tener en cuenta en una comprobacin de tipos: Conversin de tipos: A veces es necesario transformar el tipo de una expresin para utilizar correctamente un operador o para pasar de forma adecuada un parmetro a una funcin. Coercin: Es una conversin de tipos que realiza de forma implcita el propio compilador. Si es el programador el que realiza la conversin se tratar entonces de una conversin explcita. Sobrecarga de operadores: La sobrecarga se resuelve determinando el tipo de cada una de las expresiones intervinientes en la sobrecarga. Funciones polimrficas: Son aquellas que trabajan con argumentos cuyo tipo puede cambiaren distintas llamadas a la funcin.

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.

Docente: Ing. Mirko Manrique Ronceros

~6~

Universidad Nacional del Santa Sea la gramtica:

Curso: Teora de Compiladores

Primer paso: Asignacin de tipo

Docente: Ing. Mirko Manrique Ronceros

~7~

Universidad Nacional del Santa

Curso: Teora de Compiladores

Segundo paso: Comprobacin de tipo en expresiones

Tercer paso: Comprobacin de tipo en sentencias

Docente: Ing. Mirko Manrique Ronceros

~8~

Universidad Nacional del Santa 3. Otras comprobaciones semnticos semnticas y

Curso: Teora de Compiladores recuperacin de errores

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.

Docente: Ing. Mirko Manrique Ronceros

~9~

También podría gustarte