Bonjour,
J'essaye de faire un analyseur syntaxique pour des expressions mathematique. Histoire de m'habituer un peu à la manipulation des liste chainee.
J'ai considéré que:
1. Une Expression est composee d'une liste chainee d'entité lexicale (une entité etant un nombre ou un operateur)
2. Une Expression possede une valeur qui sera calculée apres
3. Une Expression est formée par une chaine de caractères

J'ai un soucis avec ma liste chainee.
La fonction de lecture de la chaine semble satisfaisante, mais j'ai un soucis au niveau du clear.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
 
typedef struct Entite
{
	string valeur;	// valeur de l'entite actuelle
	Entite * avant;	// entite positionnee avant celle-ci
	Entite * apres;	// entite positionnee apres celle-ci
}Entite;
 
 
//-- Une expression mathematique est une liste chainee
// d'entites ou d'unites lexicales.
class Expression
{
public:
 
private:
	string valeur;		//valeur de l'expression
	string nom;			// nom de l'expression
	string chaine;		// chaine de caracteres correspondant a l'expression
	Entite tete;		// expression decomposee en entites
 
public:
	Expression(string lpchaine);		//initialise les elements
	virtual ~Expression();	//vide l'entite
	//-- Creer une structure expression a partir d'une chaine de caracteres
	//-- si la chaine ne respecte pas la grammaire ou le vocabulaire,la structure ne peut
	//-- etre creee
	//-- retourne 0 en cas de succes		
	int Create(); 
 
	// met a zero la liste chainee des entites lexicales
	void ClearTete();
 
	//retourne la chaine de l'expression
	string Getchaine();
 
	void ViewEntite();
private:
	int Resolve();
}; 
 
//-- vide la liste chainee des entitees
void ClearEntite(Entite * lpTete)
{
	try
	{
		Entite * tmp1;
		tmp1 = lpTete;
		Entite * tmp2 =0;
		while(tmp1 !=0)
		{
			tmp2 = tmp1->apres;
			delete []tmp1;   //Access Violation Ici
			tmp1 = tmp2;
		}
	}
	catch(...)
	{
		cout<<"\nErreur Ici: ClearEntite()\n";
	}
}
 
void ViewEntite(Entite * lpTete)
{
	try
	{
		Entite * tmp1;
		tmp1 = lpTete;
		Entite * tmp2 =0;
		while(tmp1 !=0)
		{
			tmp2 = tmp1->apres;
			cout<<"\n entite:"<<tmp1->valeur;  //pas d'acces violation et lecture correcte
			tmp1 = tmp2;
		}
	}
	catch(...)
	{
		cout<<"\nErreur Ici: ViewEntite()\n";
	}
}