Recuperación de Errores en Listas

Aunque no existe un método exacto para decidir como ubicar las reglas de recuperación de errores, en general, los sımbolos de error deben ubicarse intentado satisfacer las siguientes reglas:

En el caso particular de las listas, se recomienda seguir el siguiente esquema:




Tabla: Recuperación de errores en listas
Construcción EBNF yapp
secuencia opcional x:{y} x : /* null */
    | x y { $_[0]->YYErrok; }
    | x error
secuencia x:y{y} x : y
    | xy { $_[0]->YYErrok; }
    | error
    | x error
lista x:y{Ty} x : y
    | x T y { $_[0]->YYErrok; }
    | error
    | x error
    | x error y { $_[0]->YYErrok; }
    | x T error




Ejercicio 35.16.1   Compruebe el funcionamiento de la metodología para la recuperación de errores en listas presentada en la tabla 35.2 estudie el siguiente programa yapp siguiendo la traza de estados, generando entradas con todos los tipos de error posibles. ¿Cómo se recupera el analizador en caso de existencia de un segundo error? ¿Que ocurre si dos errores consecutivos están muy próximos? El programa corresponde al tercer caso de la tabla 35.2, el caso x:y{Ty} con x = list, T = ',' e y = NUMBER:
%token NUMBER
%%
command 
  : 
  | command list '\n' { $_[0]->YYErrok; } 
  ;

list 
    : NUMBER            { put($1); }
    | list ',' NUMBER   { put($3); $_[0]->YYErrok; }
    | error             { err(1); }
    | list error        { err(2); }
    | list error NUMBER { err(3); put($3); $_[0]->YYErrok; }
    | list ',' error    { err(4); }
    ;
    
%%    
sub put { my $x = shift; printf("%2.1lf\n",$x); }
sub err { my $code = shift; printf("err %d\n",$code); }
 ...

Casiano Rodríguez León
2013-04-23