Programmes en C



next up previous contents index
Next: Bibliographie Up: Analyse Syntaxique Previous: Evaluation

Programmes en C

/* - */

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();