manejo de errores de programa yacc
Cuando el analizador lee una corriente de entrada, es posible que dicha corriente de entrada no coincida con las reglas del archivo de gramática.
El analizador detecta el problema lo antes posible. Si hay una subrutina de manejo de errores en el archivo de gramática, el analizador puede permitir la entrada de los datos de nuevo, ignorando los datos incorrectos o iniciando una acción de limpieza y recuperación. Cuando el analizador encuentra un error, por ejemplo, es posible que tenga que reclamar almacenamiento de árbol de análisis, suprimir o modificar entradas de tabla de símbolos y establecer conmutadores para evitar generar más salida.
Cuando se produce un error, el analizador se detiene a menos que proporcione subrutinas de manejo de errores. Para continuar procesando la entrada para encontrar más errores, reinicie el analizador en un punto de la corriente de entrada donde el analizador puede intentar reconocer más entrada. Una forma de reiniciar el analizador cuando se produce un error es descartar algunas de las señales que siguen al error. A continuación, intente reiniciar el analizador en ese punto de la corriente de entrada.
El mandato yacc utiliza un nombre de señal especial, error, para el manejo de errores. Coloque esta señal en el archivo de reglas en los lugares en los que se puede producir un error de entrada para que pueda proporcionar una subrutina de recuperación. Si se produce un error de entrada en esta posición, el analizador ejecuta la acción para la señal error , en lugar de la acción normal.
| Macros | Descripción |
|---|---|
| ERROR | Hace que el analizador inicie el manejo de errores |
| AAABORT | Hace que el analizador vuelva con un valor de 1 |
| AAACEPTAR | Hace que el analizador vuelva con un valor de 0 |
| AARECUPERANDO () | Devuelve un valor de 1 si se ha detectado un error de sintaxis y el analizador todavía no se ha recuperado completamente |
Para evitar que un único error genere muchos mensajes de error, el analizador permanece en estado de error hasta que procesa tres señales después de un error. Si se produce otro error mientras el analizador está en estado de error, el analizador descarta la señal de entrada y no genera un mensaje.
stat : error ';'le dice al analizador que cuando hay un error, debe ignorar la señal y todas las señales siguientes hasta que encuentre el siguiente punto y coma. Todas las señales después del error y antes del siguiente punto y coma se descartan. Después de encontrar el punto y coma, el analizador reduce esta regla y realiza cualquier acción de limpieza asociada con ella.
Proporcionar corrección de errores
input : error '\n'
{
printf(" Reenter last line: " );
}
input
{
$$ = $4;
}
;yyerrok;Cuando el analizador encuentra esta sentencia, deja el estado de error y empieza a procesarse normalmente. A continuación, el ejemplo de recuperación de errores se convierte en:
input : error '\n'
{
yyerrok;
printf(" Reenter last line: " );
}
input
{
$$ = $4;
}
;Borrar la señal de búsqueda anticipada
yyclearin ;