Diseño del compilador: recuperación de errores

Un analizador debería poder detectar e informar cualquier error en el programa. Se espera que cuando se encuentra un error, el analizador debería poder manejarlo y continuar analizando el resto de la entrada. En general, se espera que el analizador compruebe si hay errores, pero se pueden encontrar errores en varias etapas del proceso de compilación. Un programa puede tener los siguientes tipos de errores en varias etapas:

  • Lexical : nombre de algún identificador escrito incorrectamente

  • Syntactical : falta un punto y coma o un paréntesis desequilibrado

  • Semantical : asignación de valor incompatible

  • Logical : código no accesible, bucle infinito

Hay cuatro estrategias comunes de recuperación de errores que se pueden implementar en el analizador para tratar los errores en el código.

Modo de pánico

Cuando un analizador encuentra un error en cualquier parte de la declaración, ignora el resto de la declaración al no procesar la entrada de la entrada errónea al delimitador, como el punto y coma. Esta es la forma más fácil de recuperación de errores y también evita que el analizador desarrolle bucles infinitos.

Modo declaración

Cuando un analizador encuentra un error, intenta tomar medidas correctivas para que el resto de las entradas de la instrucción permitan al analizador analizar adelante. Por ejemplo, insertar un punto y coma que falta, reemplazar una coma con un punto y coma, etc. Los diseñadores del analizador deben tener cuidado aquí porque una corrección incorrecta puede conducir a un bucle infinito.

Producciones de error

Los diseñadores de compiladores conocen algunos errores comunes que pueden ocurrir en el código. Además, los diseñadores pueden crear gramática aumentada para ser utilizada, como producciones que generan construcciones erróneas cuando se encuentran estos errores.

Corrección global

El analizador considera el programa en cuestión como un todo y trata de averiguar qué se pretende que haga el programa e intenta encontrar una coincidencia más cercana para él, que no tenga errores. Cuando se alimenta una entrada (declaración) X errónea, se crea un árbol de análisis para la declaración Y sin errores más cercana. Esto puede permitir que el analizador realice cambios mínimos en el código fuente, pero debido a la complejidad (tiempo y espacio) de esta estrategia, aún no se ha aplicado en la práctica.

Árboles de sintaxis abstracta

Las representaciones del árbol de análisis no son fáciles de analizar por el compilador, ya que contienen más detalles de los que realmente se necesitan. Tome el siguiente árbol de análisis como ejemplo:

Si se observa de cerca, encontramos que la mayoría de los nodos hoja son hijos únicos de sus nodos padres. Esta información se puede eliminar antes de pasarla a la siguiente fase. Al ocultar información adicional, podemos obtener un árbol como se muestra a continuación:

El árbol abstracto se puede representar como:

Los AST son estructuras de datos importantes en un compilador con la menor cantidad de información innecesaria. Los AST son más compactos que un árbol de análisis y pueden ser utilizados fácilmente por un compilador.