Despertando a Lestat
He despertado a Lestat para ampliar y mejorar sus funciones. Es una dura tarea retomar un programa que se ha dejado reposar demasiado tiempo. Con paciencia y perseverancia estoy intentando volver a entenderlo como el día que lo dejé aunque esto tiene su precio. Una de las facturas que me ha pasado Lestat por este abandono ha sido un bug que me ha costado un poco encontrarlo. Estoy falta de reflejos pero en mi favor tengo que decir que el bug tenía un sentido del humor muy sutil. Aquí lo cuento para que juzgue el lector: Una de las funciones que le he añadido a Lestat es un fichero de configuración para darle más flexibilidad en la ejecución. Para ello he definido una gramática que permita describir la configuración y la he analizado con lex/bison. Además de la definición del léxico de la gramática puse una expresión regular para descartar caracteres en blanco, tabulaciones y saltos de línea de esta manera [\ \t\n]*
y un default para gestionar errores léxicos que ejecutaba lo siguiente: fprintf(stderr, "Error lexico en linea %d. Mira a ver si \'%s\' es el culpable.\n", yylineno, yytext); fprintf(stderr,"Lestat le desea mejor suerte la proxima vez \n");
Al ejecutar el analizador del fichero de configuración obtenía un resultado incomprensible: ' es el culpable.inea 1. Mira a ver si ' Lestat le desea mejor suerte la próxima vez
Primero sospeché que la función fprintf tenía un error en los parámetros y que el stack estaba corrupto. Lo miré con tanta fijeza como incredulidad. Tras muchas trazas y muchas vueltas encontré la explicación: El fichero de configuración lo había escrito en Windows por lo que el salto de línea era (\r\n) en vez de carácter de salto de línea (\n) que utiliza unix. El análisis léxico detectaba el carácter como error léxico y se ejecutaba la sentencia: fprintf(stderr, "Error lexico en linea %d. Mira a ver si \'%s\' es el culpable.\n", yylineno, yytext);
yytext contenía un que hacía que cuando se había escrito Error lexico en linea 1. Mira a ver si '
Se volviera al inicio de la línea para escribir lo restante: es el culpable.inea 1. Mira a ver si’
La solución al problema era tan sencilla como poner la expresión regular [\ \t\r\n]*
para filtrar blancos, tabulaciones y salto de línea. Estas son las cosas que pasan en la programación y que nos hacen perder mucho tiempo