Bonjour,
J'essaie de créer un parser avec flex/bison et je rencontre deux erreurs curieuses.
1) Le programme se plante violemment avec un message "*** glibc detected *** ./parser: free(): invalid pointer: 0x08cd5770 ***", suivi de tout un tas d'infos plus ou moins inutiles (Backtrace et Memory map).
Dans le fichier analysé par le parser, la ligne qui engendre le problème se termine par un nombre entier. Si j'ajoute un espace immédiatement derrière le nombre, le programme se déroule normalement. C'est d'autant plus curieux, parce que le fichier comporte des tas d'autres lignes qui se terminent par un nombre, mais pour celles-ci l'absence d'espace derrière ne semble pas constituer de problème.
2) Mon parser est (normalement) insensible aux caractères de fin de ligne. Le fichier analysé est un fichier texte au format "dos", donc avec CRLF comme indicateur de fin de ligne. Si je convertis le fichier au format "unix", donc avec juste LF comme caractère de fin de ligne, le problème disparait !!!
Voici un extrait de mon fichier de définition des lexèmes :
Code :
- entier [-]?[0-9]+
- entier_CR [-]?[0-9]+"\r"
- blanc [ \t]
- saut_de_ligne "\n"
- %%
- "\r" { }
- {saut_de_ligne} { }
- {entier} { std::stringstream ss; ss << yytext; ss >> yylval.v_entier; return lex_entier; }
- {entier_CR} { REJECT; }
|
Je précise que les lignes 2 et 12 n'existaient pas initialement, et que le motif "saut_de_ligne" était initialement l'expression régulière "\r?\n". Mais quoi que je modifie, cela n'a pas l'air de changer grand chose au résultat...
Est-ce que cela vous inspire quelque chose ?
Merci d'avance !
Message édité par shaoyin le 24-06-2011 à 16:00:44