2010-11-06 18 views
0

J'ai écrit un simple assembleur en utilisant flex et bison. Cela a fonctionné parfaitement jusqu'à ce que je fasse un petit changement. Était une règle supplémentaire inoffensive dans les spécifications lex et yacc. Après cela, il lance une faute de segmentation chaque fois que je l'exécute. J'ai essayé de tracer la source de cette faille seg mais il s'avère qu'il se produit avant que le principal dans le dossier de lex soit exécuté. Puis j'ai enlevé l'addition que j'ai faite et je l'ai recompilée, ça montre toujours la même erreur.faute de segmentation flex/bison avant main()

Qu'est-ce qui ne va pas ???

Je l'ai fait quelque chose comme ça

  • Table de recherche, Symbole Table, Code Générateur dans des fichiers séparés
  • Parser dans un fichier ".y" importer les fichiers mentionnés ci-dessus
  • Scanner lexicales dans un fichier ".L" importer le "* .tab.h" fichier
  • lié lex.yy.c et parser.tab.c pour faire un exécutable

Merci à l'avance

+0

savez-vous exactement où votre code se casse? Si vous pouviez donner la ligne exacte où le code se sépare, cela aiderait probablement. – rtpg

+0

Eh bien c'est ce que j'ai essayé de trouver, en plaçant printf() s à divers endroits, j'ai placé un avant l'appel à yyparse(), il n'a pas été imprimé! . On dirait que ça ne va même pas à main()! –

Répondre

3
$ cc -g whatever... 
$ gdb a.out 
(gdb) run 
<boom> 
(gdb)bt 

Et si la réponse est à ce point évident, sélectionnez l'ensemble de la séquence ci-dessus et mettre à jour votre question ci-dessus.

BTW, je suppose que vous avez changé la façon dont vous le construisez. Peut-être que vous devriez juste couper votre programme en bonjour, monde, et ensuite commencer à ajouter dans les autres composants un par un.

+0

Merci de m'avoir fait remarquer, j'ai été inconscient de cet excellent outil pendant si longtemps! –

1

Veuillez fournir plus d'informations telles que le backtrace GDB et le code des règles flex et bison correspondantes. Un conseil de débogage que j'ai est de mettre printf() instructions à l'intérieur de vos règles de flexion. Par exemple, supposons que vous vouliez que votre nouvelle règle corresponde à THISLOOP: LWU R2, 0(R3). Ensuite, dans flex, vous placerez printf() dans n'importe quelle règle correspondant à n'importe quelle règle de bison. Mais encore une fois, sans code, il est impossible de déboguer.

Questions connexes