Manejo de errores en compiladores (lenguajes y autómatas II)

jessicasanmtn 8 views 21 slides Oct 20, 2025
Slide 1
Slide 1 of 21
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21

About This Presentation

Manejo de errores en compiladores (lenguajes y autómatas II)


Slide Content

Unidad 1 Análisis semántico 1.7 Manejo de errores semánticos

¿Qué son los errores semánticos? Los errores semánticos son problemas en un programa de computadora que no se relacionan directamente con la sintaxis del código, pero afectan su significado o lógica . Estos errores ocurren cuando las instrucciones del programa son lógicamente incorrectas o no cumplen con las reglas y expectativas de la semántica del lenguaje de programación .

Manejo de errores semánticos

Tipos de errores semánticos Escribir mal un identificador, palabra clave u operador mal escrito. Una expresión aritmética con paréntesis no equilibrados Operaciones con tipos de datos no compatibles Llamada a función infinitamente recursiva Otros ejemplos de errores semánticos: Variables usadas no declaradas Variable declarada no usada Referencia a una posición de un arreglo fuera de sus límites Trabajo: Investigar ejemplos de cada tipo de error: Descripción y código.

Errores léxicos Caracteres inválidos : No pertenecen al conjunto de caracteres permitidos por el lenguaje de programación (por ej. tamaño, antigüedad ) Palabras clave mal escritas : Se parecen a una palabra clave del lenguaje de programación, pero está mal escrita o mal formateada (ej. tipo booleen ). Cadenas de caracteres no terminadas : No están correctamente terminadas con el delimitador de cadena correspondiente (ej. “hola mundo ). Comentarios mal formateados : No siguen el formato o la sintaxis correctos según las reglas del lenguaje de programación (ej. /* comentario ** ). Operadores desconocidos : No coinciden con ningún operador válido en el lenguaje de programación (ej. Operadores +++ ).

Errores sintácticos Ocurre cuando una declaración o expresión no sigue la estructura gramatical correcta del lenguaje de programación. Por ejemplo, una declaración de variable que falta un punto y coma al final, o una expresión mal formada. Uso incorrecto de operadores : Ocurre cuando se utilizan operadores de manera incorrecta o en contextos donde no son válidos según las reglas de precedencia y asociatividad del lenguaje de programación. Falta de tokens : Ocurre cuando el parser espera encontrar un token específico en una ubicación determinada del código fuente, pero no lo encuentra.  

Errores sintácticos Tokens inesperados : Ocurren cuando se encuentra un token que no debería estar presente en una determinada ubicación del código fuente según la gramática del lenguaje de programación.   Conflictos de ambigüedad : Ocurren cuando la gramática del lenguaje de programación es ambigua y el parser no puede determinar la estructura sintáctica de una manera única. Por ejemplo, para la expresión y las siguientes reglas de producción:   E E + E E - E num num num E E - E E + E num num num

Errores sintácticos Reglas de precedencia y asociatividad : Ocurren cuando la aplicación incorrecta de reglas de precedencia y asociatividad conduce a interpretaciones incorrectas de la estructura sintáctica del código fuente.  

Errores semánticos Tipos de datos incompatibles : Se intenta realizar operaciones con tipos de datos que no son compatibles entre sí. Ej. sumar una cadena de texto a un número . Declaraciones y uso de variables incorrectos : Se intenta utilizar una variable que no ha sido declarada previamente, o cuando se utiliza una variable en un contexto que no es válido para su tipo . Asignaciones no válidas : Se intenta asignar un valor a una variable de un tipo incompatible . Ej. Asignar un valor entero a una variable de tipo booleano .

Errores semánticos Uso incorrecto de funciones o procedimientos : Número incorrecto de argumentos, o los tipos de los argumentos no coinciden con los tipos esperados por la función o procedimiento. Errores de ámbito : Se intenta acceder a una variable o función desde un ámbito donde no está definida . Ej. Acceder a una variable local desde fuera de su función . Conflicto de nombres : Hay varias entidades en el programa (variables, funciones, etc.) con el mismo nombre en el mismo ámbito . Esto puede llevar a ambigüedades y errores de referencia . Errores de flujo de control : Problemas con la lógica del flujo de control del programa, como bucles infinitos o condiciones que nunca se cumplen o siempre se cumplen .

Recuperación de errores Léxicos

Omisión de caracteres: Omitir el carácter o la secuencia de caracteres que causó el error y continuar el análisis desde el siguiente punto en el código fuente. Esto permite que el analizador léxico continúe escaneando el código en busca de tokens válidos. Inserción de tokens : Insertar un token especial para representar el error y permitir que el proceso de análisis continúe. Por ejemplo, podría insertar un token de error especial para marcar un carácter no reconocido y continuar el análisis a partir de ahí. Desplazamiento de posición: Ajustar la posición del puntero de lectura en el código fuente para saltar el carácter o la secuencia de caracteres que causaron el error. Esto permite que el análisis continúe desde una posición válida en el código.

Marcadores de posición: Utilizar marcadores de posición para registrar la ubicación del error en el código fuente y permitir que el desarrollador del programa pueda identificar y corregir el problema más fácilmente. Generación de mensajes de error: El analizador léxico debe generar un mensaje de error descriptivo que indique la naturaleza del problema y proporcione información útil sobre su ubicación en el código fuente. Esto facilita la corrección del error por parte del desarrollador del programa.

Recuperación de errores Sintácticos

Recuperación basada en tokens de sincronización : Identificar tokens de sincronización en la gramática del lenguaje y utilizarlos para determinar dónde reiniciar el análisis después de encontrar un error. Los tokens de sincronización indican el comienzo de una nueva estructura sintáctica o un punto de referencia en el código fuente. Por ejemplo, en muchos lenguajes de programación, los tokens de sincronización incluyen paréntesis, corchetes y llaves. Recuperación basada en palabras clave : Buscar palabras clave o tokens específicos que marcan el comienzo de una nueva estructura sintáctica o una unidad lógica en el código fuente. Por ejemplo, en un lenguaje de programación que utiliza palabras clave como " if ", " else ", " while ", etc., el analizador puede buscar estas palabras clave para determinar dónde reiniciar el análisis después de un error.

Recuperación basada en reglas de gramática de contexto limitado : Utilizan reglas de gramática de contexto limitado para determinar cómo recuperarse después de un error. Estas reglas permiten al analizador inferir el contexto sintáctico actual y tomar decisiones sobre cómo continuar el análisis. Regla : Código :  

Regla: Código : Posible estrategia : Buscar un token que indique el final de la estructura condicional, como " else " o " endif ". Agregar un token " endif " o " else ", dependiendo de lo que sugiera la gramática. Permite continuar el análisis sintáctico sin detenerse completamente en el primer error encontrado.  

Recuperación de errores Semánticos

Detener el análisis : El analizador semántico puede detenerse después de detectar el primer error semántico, ya que un solo error puede hacer que el análisis adicional sea poco confiable. Esto se aplica principalmente en compiladores que se centran en la calidad del código. Ignorar errores locales : Ignorar error y continuar analizando el resto del código. Esto se utiliza cuando los errores locales no afectan la capacidad del programa para seguir ejecutándose. Recuperación basada en contextos : Utilizar el contexto circundante e interpretar el significado del código. Por ejemplo, si se detecta un error de tipos, el analizador puede intentar inferir el tipo correcto basándose en el contexto de uso de la variable.

Corrección automática de errores : Corregir automáticamente los errores semánticos utilizando técnicas de análisis estático(*) o heurísticas. Esto puede incluir la inferencia de tipos faltantes, la corrección de nombres de variables mal escritos o la inserción de conversiones implícitas. Generación de mensajes de error significativos : Generar mensajes de error claros y significativos que ayuden al programador a entender la naturaleza del problema y cómo corregirlo. Estos mensajes deben incluir información sobre la ubicación del error en el código fuente y una descripción precisa del error. (*) Métodos computacionales que examinan el código fuente de un programa sin necesidad de ejecutarlo, se centran en comprender la estructura y el significado del código para identificar posibles errores semánticos o problemas de diseño.

Revisión de código manual : En algunos casos, los errores semánticos pueden ser difíciles de detectar automáticamente y pueden requerir una revisión manual del código por parte del programador. Los compiladores pueden proporcionar herramientas para facilitar esta revisión, como resaltado de sintaxis y navegación entre errores. Recompilación incremental : Sólo se vuelven a compilar las partes del código que han cambiado desde la última compilación exitosa. Esto puede acelerar el proceso de corrección de errores semánticos al reducir el tiempo necesario para volver a probar el código modificado.