/* - */
Arbre Terme();
Arbre Facteur();
Arbre Expression()
{
Arbre a, b;
a = Terme();
if (f[i] == '+') {
i++;
b = Expression();
return NouvelArbre('+', a, b);
}
else return a;
}
Arbre Terme()
{
Arbre a, b;
a = Facteur();
if (f[i] == '*') {
i++;
b = (Arbre) Terme();
return NouvelArbre('*', a, b);
}
else return a;
}
Arbre Facteur()
{
Arbre a;
if (f[i] == '(') {
i++;
a = Expression();
if (f[i] == ')') {
i++;
return a;
}
else Erreur(i);
}
else if (f[i] == 'a') {
i++;
a = NouvelArbre ('a', NULL, NULL);
return a;
}
else Erreur(i);
}
/* - */
int AnalyseRecursive (Mot f, Mot u)
{
int i, pos;
char x, y;
Mot v;
int b;
pos = 1;
b = 0;
while (f[pos] == u[pos])
++pos;
if (f[pos] == '$' && u[pos] == '+') {
printf("analyse re'ussie \n");
b = 1;
}
else if (Auxiliaire(y)) {
i = 1;
while ( (!b) && (i <= nbregle[y -'A'])) {
v = Remplacer (u, regle[y-'A'][i], pos);
b = AnalyseRecursive (v, f);
if (b)
printf ("regle %d du nonterminal %c \n", i, y);
else i++;
}
}
return b;
}
Arbre ArbSyntPref() /* - */
{
Arbre a, b, c;
char x;
if (f[pos] == 'a') {
a = NouvelArbre( 'a', NULL, NULL);
pos++;
}
else if (f[pos] == '(') && ((f[pos + 1] == '+') ||
(f[pos + 1] == '*')) {
x = f[pos + 1];
pos = pos +2;
b = ArbSyntPref();
c = ArbSyntPref();
a = NouvelArbre(x, b, c);
if (f[pos] == ')' ) pos++;
else Erreur(pos);
}
else Erreur(pos);
}
int Evaluer(Arbre x) /* - */
{
if (x -> valeur == 'a' )
return x -> valeur;
else if (x -> valeur == '+' )
return (Evaluer(x -> filsG) + Evaluer (x -> filsD));
else if (x -> valeur == '-' )
return( Evaluer(x -> filsG) - Evaluer (x -> filsD));
else if (x^.valeur == '*')
return (Evaluer(x -> filsG) * Evaluer (x -> filsD));
else Erreur();