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"; } }
Partager