Bonjour à tous,
J'essaie d'écrire un programme qui consiste à lire un fichier source où chaque ligne correspond à une instruction, puis à exécuter ces instructions ligne par ligne. Les instructions dans le fichier source sont du type ICONST, SCONST, SOUT, POP, DUP…. Elles agissent sur une pile qui est vide initialement.
Après avoir défini une fonction qui vérifie que la syntaxe du fichier source est correcte, j'ai défini une fonction récursive 'executer' qui exécute une seule ligne. Elle est récursive parce que dans le fichier source, il peut y avoir des instructions de branchement dont l'exécution est censée déplacer la position actuelle d'exécution à une autre ligne du fichier source et exécuter l'instruction se trouvant à cette ligne.
J''ai enfin défini une fonction 'executerProgrammeSource' qui exécute tout le fichier source en appelant la fonction executer.
Voici la tête de mes deux fonctions :
Quand je teste mon programme sur un fichier source consistant à afficher trois fois le mot 'hello', j'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #LesCommandes : liste contenant des listes 'commande' de taille 1 ou 2 selon si l'instruction commande[0] admet un paramètre ou pas def executer(commande,pile,LesCommandes): if len(commande)==1: #si commande contient une instruction sans paramètre (commande=['Nom_Instruction']) if commande[0] in Liste_des_Instructions_Arithmetiques: InstructionsArithmetiques(pile,commande[0]) elif commande[0]=='SIN': clavier=str(input()) InstructionSIN(pile,clavier) elif commande[0] in InstructionsSansParametres: Dico_InstructionsSansParametres[commande[0]](pile) else: #commande contient une instruction agissant sur un paramètre (commande=['Nom_instruction',paramètre]) if commande[0] in Liste_des_Instructions_de_Branchement: if commande[0]=='BRANCH': InstructionBRANCH(LesCommandes,commande) #modifie la position de 'commande' dans la liste 'LesCommandes' executer(commande,pile,LesCommandes) else: Dico_InstructionsDeBranchement[commande[0]](LesCommandes,commande,pile[len(pile)-1]) #idem executer(commande,pile,LesCommandes) elif commande[0] in InstructionsAgissantSurDesINT+InstructionsAgissantSurDesSTR: Dico_InstructionsParametres[commande[0]](pile,commande[1]) def executerProgrammeSource(LesCommandes): pile=[] commande=LesCommandes[0] while commande != ['STOP']: executer(commande,pile,LesCommandes) commande=LesCommandes[LesCommandes.index(commande)+1] else: return None
avec une fenêtre de mon ordinateur qui dit que "Python suit unexpectedly. Click Reopen to open the application again. Click Report to ….."
Code : Sélectionner tout - Visualiser dans une fenêtre à part Segmentation fault: 11
Est ce qu'il est possible de contrer cette erreur ?
Bien à vous.
Partager