| INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO |

Introducción | Contenido | Bibliografía

Introducción
Contenido
UNIDAD I
UNIDAD II
UNIDAD III
UNIDAD IV
UNIDAD V Introducción 5.1 Estructura de un programa en YACC 5.2 Definición del tipo de la pila de YACC 5.3 Terminales y no terminales en YACC

5.4 Precedencia y asociatividad en YACC

5.5 Manejo de Errores en YACC

5.6 Desarrollo de una aplicación utilizando LEX y YACC

UNIDAD VI
UNIDAD VII
UNIDAD VIII
UNIDAD IX
PROBLEMARIO
Bibliografía

5.5 Manejo de Errores en YACC

> El manejo de errores es un área extremadamente difícil, y muchos de los problemas son de tipo semántico. Cuando se encuentra un error, por ejemplo puede ser necesario reclamar almacenamiento en árbol del parser, borrar o alterar entradas de tablas de símbolos, y, típicamente, poner switches para evitar generar más salidas.

> Rara vez es aceptable parar todo el proceso cuando se encuentra un error. Es más útil continuar explorando la entrada para localizar más errores sintácticos. Esto lleva al problema de tener que volver a iniciar el parser después de un error. Una clase general de algoritmos para llevar a cabo, implica desechar un grupo de tokens del literal de entrada, e intentar ajustar el parser de forma que puede continuar la entrada.

> Para permitir al usuario algún control sobre este proceso, yacc proporciona un dispositivo simple, pero razonablemente general. El nombre de token error está reservado para el manejo de errores. Este nombre se puede usar en reglas gramaticales; en efecto éste sugiere lugares donde se esperan los errores, y la recuperación puede tener lugar. El parser levanta su pila hasta que entra en un estado donde el token error es legal. Entonces se comporta como si el token error fuese el token de pre análisis en curso, y lleva a cabo la acción que se ha encontrado. El token de pre análisis se resetea entonces al token que ha producido el error. Si no se han especificado reglas de error especiales, el proceso se para cuando se detecta un error.

> Para evitar una cascada de mensajes de error, el parser, después de detectar un error, continúa en estado error hasta que se han leído e intercambiado con éxito tres tokens. Si se detecta un error cuando el parser está aún en estado de error. No se da ningún mensaje de error, y el token de entrada se borra silenciosamente.

> Como un ejemplo, una regla de la forma:

> stat : error

> Significaría, en efecto, que en un error sintáctico del parser intentará saltarse la sentencia en la cual se ha descubierto el error. Más precisamente, el parser explorará con anticipación buscando tres tokens que puedan legalmente seguir una sentencia y comenzar el proceso en el primero de éstos; si los principios de las sentencias no son suficientemente distintivos, puede crear un falso comienzo en medio de una sentencia y terminar informando de un segundo error donde de hecho no hay ningún error.

> Se pueden usar acciones con estas reglas de error especiales. Estas acciones pueden intentar reinicializar tablas, reclamar espacio para la tabla de símbolo, etc.

> Las reglas de error tales como la anterior son muy generales pero difíciles de controlar. Algo más fáciles son las reglas tales como:

> stat : error ‘;’

> Aquí, cuando hay un error, el parser intenta saltar sobre la sentencia, pero lo hará saltando al siguiente ‘;’. Todos los tokens después del error y antes del siguiente ‘;’ no se pueden intercambiar, y se desechan. Cuando se encuentra el ‘;’ dicha regla se reducirá, y se llevará a cabo cualquier acción de limpieza relacionada con ella.

> Otra forma de regla de error surge en aplicaciones interactivas donde puede ser deseable permitir que se vuelva a introducir una línea después de un error. Una regla de error posible podría ser:

> input : error ‘\n’ { printf (“ Reenter line: “);
> }input
> { $$ = $4; }

> Hay una dificultad potencial con esta idea; el parser tiene que procesar correctamente tres tokens de entrada antes de que haya sido resincronizado correctamente después del error. Si la línea que se ha vuelto a introducir contiene un error en los primeros dos tokens, el parser borra los tokens que producen el error, y no genera ningún mensaje; esto es claramente inaceptable. Por esta razón, hay un mecanismo que se puede usar para hacer que el parser crea que se ha recuperado totalmente de un error. La sentencia

> yyerrok;

> En una acción restablece el parser a su modo normal. El último ejemplo está mejor escrito de la siguiente manera:

> input : error ‘\’
> { yyerrork;
> printf (“Reenter last line: “ ) ;}
> input
> { $$ = $4; }
> ;

> Como se ha mencionado anteriormente, el token visto inmediatamente después del símbolo de error es el token de entrada en el cual fue descubierto el error. A veces, esto es inapropiado; por ejemplo, una acción de recuperación de error puede hacer propia la función de localizar el lugar correcto para continuar la entrada. En este caso, el token de pre análisis previo se debe borrar. La sentencia siguiente:

> yyclearin ;

> En una acción que tendrá este efecto. Por ejemplo, suponga que la acción después del error fuese llamar a alguna sofisticada rutina de re sincronización, proporcionada por el usuario que ha intentado avanzar la entrada al principio de la siguiente sentencia válida. Después de llamar a esta rutina, el siguiente token devuelto por yylex será probablemente el primer token de una sentencia legal; el token ilegal antiguo tiene que ser desechado y el estado de error reseteado. Esto se podría hacer por medio de una regla como:

> stat : error
> { resynch ();
> yyerrork;
> yyclearin ; }
> ;

> Estos mecanismos son realmente crudos, pero permiten una recuperación simple y bastante efectiva del analizador de muchos errores. Además, el usuario puede obtener control para tratar con las acciones de errores requeridas por otras porciones del programa.

> Atrás Siguiente

##### Introducción / Contenido / Unidad I / Unidad II / Unidad III / Unidad IV / Unidad V / Unidad VI / Unidad VII / Unidad VIII / Unidad IX / Problemario / Bibliografía

##### Inicio

##### Créditos

José Sánchez Juárez, Andrés Ortigoza Campos, Fabiola Ocampo Botello