Test 3 Réseaux de Petri
Test 3 Réseaux de Petri
Test 3 Réseaux de Petri
I. Structures algorithmiques
• Les seuls caractères présents sont les opérateur (+, -, *, /), des lettres et des parenthèses.
• Toute expression commence par ‘(‘ et se termine par ‘)’.
Règles :
1) Une parenthèse ‘(‘ peut être suivie de : ‘(‘, une lettre, ‘)’.
2) Une lettre peut être suivie de : un opérateur, ‘)’.
3) Une parenthèse ‘)’ peut être suivie de : ‘)’, un opérateur, la fin de la chaîne.
4) Un opérateur peut être suivi de : ‘(‘, une lettre.
()
(a)
(a+b)
(a+(b))
(a+(b+c))
(a
(a+)
(a+b
(a+b))
a+b
+b-(b/c)
Indications :
Etat initial
Etat initial
C C
Traitement Traitement
si sinon
Traitement
Etat initial
Etat initial
Traitement
Test Test
C C C C
Traitement
P=5 P = 20 P =10
Stock de pièces
de 5 F
S10 = ∅ S10 ≠ ∅
II.
III. 1)
Etat initial
Expression
refusée ! Q = '('
Stock de '('
A!
Erreur
Etat 1)
Q = '('
Q = ')' A!
Q = lettre et
S ≠∅
A! A!
Etat 2)
Q = ')'
Q = op et
S ≠∅
A!
A!
Etat 4)
Q = lettre Q = '('
A! A!
Etat 3)
Q = ')'
Q = op et Q = E O S
S ≠∅
A! A!
Expression
acceptée !
III. 2)
#include <stdio.h>
#define CHAINEMAX 50
main() {
// Declarations
char chaine[CHAINEMAX];
int a;
int etat;
int nb_par;
int res;
// Saisie chaine
// Initialisation
a=0;
nb_par=0;
etat=0;
res=0;
// Analyse
printf("\nDebut analyse...\n");
while (etat!=9) {
switch (etat) {
// Etat initial
case 0: {
if (chaine[a]=='(') {
nb_par++;
etat=1;
} else {
res=1;
etat=5;
}
break;
}
case 1: {
if (chaine[a]=='(') {
nb_par++;
etat=1;
} else if ((chaine[a]==')') && (nb_par>0)) {
nb_par--;
etat=3;
} else if ((chaine[a]>='a') && (chaine[a]<='z')) {
etat=2;
} else {
res=2;
etat=5;
}
break;
}
case 2: {
if ((chaine[a]==')') && (nb_par>0)) {
nb_par--;
etat=3;
} else if ((chaine[a]=='+') || (chaine[a]=='-') ||
(chaine[a]=='*') || (chaine[a]=='/')) {
etat=4;
} else {
res=3;
etat=5;
}
break;
}
case 3: {
if ((chaine[a]==')') && (nb_par>0)) {
nb_par--;
etat=3;
} else if ((chaine[a]=='+') || (chaine[a]=='-') ||
(chaine[a]=='*') || (chaine[a]=='/')) {
etat=4;
} else if (chaine[a]=='\0') {
res=0;
etat=9;
} else {
res=4;
etat=5;
}
break;
}
case 4: {
if (chaine[a]=='(') {
nb_par++;
etat=1;
} else if ((chaine[a]>='a') && (chaine[a]<='z')) {
etat=2;
} else {
res=5;
etat=5;
}
break;
}
// Etat 5 (erreur)
case 5: {
printf("ERREUR a la position %d ! ",a);
switch(res) {
case 1: printf("'(' attendue\n");break;
case 2: printf("lettre ou '(' ou ')' attendue ou pb de parenthe-
se\n");break;
case 3: printf("operateur ou ')' attendu(e) ou pb de parenthe-
se\n");break;
case 4: printf("operateur ou ')' ou EOS attendu(e) ou pb de pa-
renthese\n");break;
case 5: printf("lettre ou ')' attendue\n");break;
}
etat=9;
}
a++;
// Resultat