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.

Las macros siguientes se pueden colocar en acciones yacc para ayudar en el manejo de errores:
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.

Por ejemplo, una regla con el formato siguiente:
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

También puede permitir que la persona que entre la corriente de entrada en un entorno interactivo corrija los errores de entrada entrando de nuevo una línea en la corriente de datos. El ejemplo siguiente muestra una forma de hacerlo.
input : error '\n'
        {
          printf(" Reenter last line: " );
         }
         input
       {
         $$ = $4;
       }
       ;
Sin embargo, en este ejemplo, el analizador permanece en el estado de error para tres señales de entrada después del error. Si la línea corregida contiene un error en las tres primeras señales, el analizador suprime las señales y no genera un mensaje. Para permitir esta condición, utilice la siguiente sentencia yacc :
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

La señal de búsqueda anticipada es la siguiente señal que examina el analizador. Cuando se produce un error, la señal de búsqueda anticipada se convierte en la señal en la que se ha detectado el error. Sin embargo, si la acción de recuperación de error incluye código para encontrar el lugar correcto para iniciar de nuevo el proceso, dicho código también debe cambiar la señal de búsqueda anticipada. Para borrar la señal de búsqueda anticipada, incluya la sentencia siguiente en la acción de recuperación de errores:
yyclearin ;