Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Un compilador es un sistema que en la mayoría de los casos tiene que manejar una
entrada incorrecta. Sobre todo en las primeras etapas de la creación de un programa, es
probable que el compilador se utilizará para efectuar las características que debería
proporcionar un buen sistema de edición dirigido por la sintaxis, es decir, para determinar
si las variables han sido declaradas antes de usarla, o si faltan corchetes o algo así. Por lo
tanto, el manejo de errores es parte importante de un compilador y el escritor del
compilador siempre debe tener esto presente durante su diseño.
Hay que señalar que los posibles errores ya deben estar considerados al diseñar un
lenguaje de programación. Por ejemplo, considerar si cada proposición del lenguaje de
programación comienza con una palabra clave diferente (excepto la proposición de
asignación, por supuesto). Sin embargo, es indispensable lo siguiente:
Clasificación de Errores
Los errores invisibles en un programa son aquellos que no puede detectar el compilador,
ya que no son el resultado de un uso incorrecto del lenguaje de programación, sino de
decisiones erróneas durante el proceso de especificación o de la mala formulación de
algoritmos. Por ejemplo, si se escribe
a : = b + c ; en lugar de a : = b * c ;
el error no podrá ser detectado por el compilador ni por el sistema de ejecución. Estos
errores lógicos no afectan la validez del programa en cuanto a su corrección sintáctica.
Son objeto de técnicas formales de verificación de programas que no se consideran aquí.
Para conocer más sobre la verificación de programas, consulte, por ejemplo, [LOEC 87].
Los errores visibles, a diferencia de los errores lógico, pueden ser detectados por el
compilador o al menos por el sistema de ejecución. Estos errores se pueden caracterizar
de la siguiente manera:
1. Errores de ortografía y
2. Errores que ocurren por omitir requisitos formales del lenguaje de
programación.
Clasificación de Ocurrencias
Por lo regular, los errores visibles o detectables por el compilador se dividen en tres
clases, dependiendo de la fase del compilador en el cual se detectan:
1. Errores Léxicos;
2. Errores Sintácticos;
3. Errores Semánticos;
Por ejemplo, un error léxico puede ocasionarse por usar un carácter inválido (uno que no
pertenezca al vocabulario del lenguaje de programación) o por tratar de reconocer una
constante que produce un desbordamiento.
Además de estas tres clases de errores, hay otros que serán detectados por el sistema de
ejecución porque el compilador ha proporcionado el código generado con ciertas acciones
para estos casos.
1. Un Error de Ejecución
Clasificación Estadística
1. Errores de puntuación,
2. Errores de operadores y operandos,
3. Errores de palabras clave y
4. Otros tipos de errores.
Las secuencias de caracteres como 12AB pueden ocurrir si falta un operador (el caso
menos probable) o cuando se han tecleado mal ciertos caracteres. Es imposible que el
analizador léxico pueda decidir si esta secuencia es un identificador ilegal o u número
ilegal. En tales casos, el analizador léxico puede saltarse la cadena completa o intentar
dividir las secuencias ilegales en secuencias legales más cortas. Independientemente de
cuál sea la decisión , la consecuencia será un error de sintaxis.
Un caso similar a la falta de comillas que cierran en una cadena, es la falta de un símbolo
de terminación de comentario. Como por lo regular está permitido que los comentario
abarquen varias líneas, no podrá detectarse la falta del símbolo que cierra el comentario
hasta que el analizador léxico llegue al final del archivo o al símbolo de fin de otro
comentario (si no se permiten comentarios anidados).
Si se sabe que el siguiente componente léxico debe ser una palabra reservada, es posible
corregir una palabra reservada mal escrita. Esto se hace mediante funciones de
corrección de errores, bien conocidas en los sistemas de lenguajes naturales, o
simplemente aplicando una función de distancia métrica entre la secuencia de entrada y el
conjunto de palabras reservadas.
Los errores de sintaxis se detectan cuando el analizador sintáctico espera un símbolo que
no concuerda con el símbolo que está analizando, a . En los analizadores sintácticos LL,
los errores de sintaxis se detectan cuando a y el no terminal que están en la cima de la
pila nos llevan a un índice de una posición vacía de la tabla de análisis sintáctico. En los
analizadores sintácticos LR, los errores de sintaxis se detectan cuando hay un índice a
una posición vacía de la tabla, o sea, cuando no se especifica ninguna transición al
analizar á en el estado actual (véase Cap. 4). Sin embargo, si se emplea una gramática
aumentada con producciones de error adicionales, no sólo se detectarán errores por
medio de los índices a posiciones vacías de la tabla de análisis sintáctico.
Errores Semánticos
Los errores que puede detectar el analizador sintáctico son aquellos que violan las reglas
de una gramática independiente del contexto. Ya hemos mencionado que algunas de las
características de un lenguaje de programación no pueden enunciarse con reglas
independientes del contexto, ya que dependen de él; por ejemplo, la restricción de que los
identificadores deben declararse previamente. Por lo tanto, los principales errores
semánticos son:
1. Identificadores no definidos;
2. Operadores y operandos incompatibles.
Sin embargo, la mayoría de los errores semánticos pueden ser detectados mediante la
revisión de la tabla de símbolos, suponiendo un tipo que se base en el contexto donde
ocurra o un tipo universal que permita al identificador ser un operando de cualquier
operador del lenguaje. Al hacerlo, evitamos la producción de un mensaje de error cada
vez que se use la variable no definida. Si el tipo de un operando no concuerda con los
requisitos de tipo del operador, también es conveniente reemplazar el operando con una
variable ficticia de tipo universal.
Recuperación de Errores PL/0
Recuperación de Emergencia
Por ello, además de generar un mensaje de error, hay que ir saltándose la entrada hasta
llegar a un símbolo de sincronización. Esto implica que cada procedimiento de un
analizador sintáctico descendente recursivo debe conocer cuáles son los símbolos
INTEGER);
BEJÍN
Error (n);
END
END Prueba;
VAR MULoDIV:símbolos;
VAR i: INTEGER;
BEGÍN (*Factor*)
...
END
END Factor;
BEGÍN (*Término*)
...
END
END Término;
BEGÍN (*Expresión*)
...
END Expresión;
Expansión de Gramática
Como ya mencionamos, es un hecho bien conocido que los errores de puntuación son
muy comunes. Por ejemplo, consideremos las constantes PL/0 que se separan por
comas; un error frecuente en el cual podríamos pensar sería el uso de un punto y coma
en lugar de la coma. Sabiendo esto, la estructura sintáctica de las declaraciones de
constantes puede modificarse de manera que se permita usar coma y punto y coma,
como se muestra en la figura 6.4.
Leer_Símbolo;
REPEAT
Declaración_const;
Leer_Símbolo; Declaración_const
END;
END;
Ler_Símbolo;
REPEAT
Declaración_var;
Leer_Símbolo; Declaración_var
END;
END;
En forma análoga, puede permitirse la omisión del punto y coma entre dos proposiciones.
Esto muestra en el fragmento de programa de la figura 6.7, donde ‘síminicioprop’ es el
conjunto de símbolos iniciales de la proposiciones.
Leer_Símbolo;
REPEAT
Leer_Símbolo;
END
Leer_símbollo
END;
REFERENCIA:
Alonso, L. A. (2019). 1.7 Manejo de Errores Semánticos. Studocu. Recuperado de:
https://www.studocu.com/es-mx/document/instituto-tecnologico-de-
oaxaca/lenguajes-y-automatas-ii/apuntes/1-7-manejo-de-errores-
semanticos/8456915/view