Segmentation fault [Résolu] [lex & Yacc] - C - Programmation
Marsh Posté le 21-12-2007 à 11:38:21
Et bien compile en debug (gcc -g) et lance ton exécutable avec gdb :
gdb a.out
> run
Quand ça plante, essaye la commande bt pour voir la pile d'appel.
vw
Marsh Posté le 21-12-2007 à 13:28:38
Bonjour
voilà ce que j'obtiens,
Code :
|
le problème c'est que n'ayant jamais débugger, ni utiliser lex & yacc en même temps je comprends pas ce que le message d'erreur dans eof veut dire.
Marsh Posté le 21-12-2007 à 13:54:57
Ca veut dire que le plantage a lieu dans la procédure main, au moment ou elle appelle feof() (ligne 42)
yyin n'est pas initialisé.
vw
Marsh Posté le 21-12-2007 à 14:39:37
oui effectivement ça marche quand j'enlève la boucle, par contre je peux parser qu'une seule phrase.
finalement en remplaçant le main du .y par
Code :
|
ça fonctionne
par contre je sais pas si c'est valide.
en tout cas merci pour ton aide.
Marsh Posté le 21-12-2007 à 17:15:53
oki,
donc comme j'ai vu que yyin est *FILE, je me suis dit qu'au lieu de lui affecter stdin, j'allais lui affecter un fichier que j'ai moi même rempli (au lieu d'avoir à taper tout à la ligne de commande)
j'obtiens dont ça à la place du main
Code :
|
voilà le fichier text
Code :
|
et quand j'execute :
Code :
|
effectivement il ne prend en compte que la première phrase.
pourtant en éxécutant avec gdb j'ai pas d'erreur :
Code :
|
maintenant le programme sans utiliser de fichier (on tape à la ligne de commande) :
son main :
Code :
|
et là on parse bien toutes les phrases entrées.
Code :
|
Comment faire pour parser tout le fichier
Marsh Posté le 21-12-2007 à 23:23:38
si j'ai bien compris le code, à chaque fois que j'ai un point suivi d'un retour à la ligne lex retourne la valeur 0 à yyparse qui sait qu'il doit parser une nouvelle ligne
donc en faisant
Code :
|
ça marche il parse toutes les lignes, par contre quand il arrive à la dernière ligne il la traite, puis affiche un syntax error, comme si il avait essayer de traiter la fin de fichier et n'avait pas trouvé sa règle dans la grammaire. Purrée je sèche là.
Marsh Posté le 23-12-2007 à 10:43:59
Il faut que "lex" retourne un tocken FINDEFICHIER (tu l'appelles comme tu veux) indiquant la fin de fichier et dans "yacc" il faut que ta grammaire prennes en compte ce tocken.
Marsh Posté le 20-12-2007 à 13:23:16
Bonjour,
Je suis entrain de me familiariser avec lex et yacc, en lisant un bouquin dessus, j'ai à faire l'exercise suivant.
1) sauvegarder des mots dans une liste chainee en fonction de leur type (verbe, nom...)
exemple
taper ^verb love : le lexer chercher si le verbe existe déjà, sinon il l'ajoute en début de la liste chainee avec son type VERBE.
2) après avoir mémoriser des verbes, des sujets, des pronoms, je dois taper une phrase genre exhortae needs help et le parser doit me dire si c'est une phrase simple ou composée ou si il y a erreur.
je compile, fait l'édition de lien... et lorsque je lance mon ./a.out j'ai une segmentation fault, j'ai tout revu mais j'arrive pas à voir ou est le problème.
voilà le .lex
et voilà le .y
si quelqu'un pouvait me filer un coup de main, merci
Message édité par exhortae le 29-12-2007 à 18:05:22