Q1. Vocabulaire = O { } 0 1 2 3 4 5 6 7 8 9 , Q2. L n'est pas regulier car il permet des imbrications d'ensembles, les phrases correctes dovent avoir meme nonbre d'accolades ouvrantes et fermantes. Q3. c.f. figure Q4. phrase avec erreur lexicale ("a" n'est pas un lexeme valide) : { a } pharse avec erreur erreur syntaxique (non conforme a la grammaire) : 1 { } Q5. c.f. figure Q6. void analyser(char *nom_fichier) { demarrer (nom_fichier) ; rec_ens() ; if (! fin_sequence()) erreur() ; } void rec_ens() { switch (LC().nature) { case VIDE: avancer() ; break ; case ACCO: avancer() ; rec_liste_ens ; if (LC().nature == ACCF) avancer() else erreur() ; break ; default: erreur() ; } } void rec_liste_ens() { rec_elem () ; rec_suite_liste_ens() ; } void rec_suite_liste_ens() { switch (LC().nature) { case VIRG: avancer() ; rec_elem () ; rec_suite_liste_ens() ; break ; default: break ; } } void rec_elem () { switch (LC().nature) { case ENTIER: avancer() ; break ; default: rec_ens() ; } } Q7. int nbEntier(Ast A) { switch (A->nature) { case N_VIDE: return 0 ; break ; case N_VIRG: return A->gauche + A->droit; break ; case N_ENS: return A->gauche; break ; case N_ENTIER: return 1 ; break ; } } Q8. void analyser(char *nom_fichier, Ast *A) { demarrer (nom_fichier) ; rec_ens (A) ; if (! fin_sequence()) erreur() ; } void rec_ens(Ast *A) { Ast A1 ; switch (LC().nature) { case VIDE: avancer() ; A1 = creer_vide() ; *A = creer_ens (A1) ; break ; case ACCO: avancer() ; rec_liste_ens (&A1) ; *A = creer_ens (A1) ; if (LC().nature == ACCF) avancer() else erreur() ; break ; default: erreur() ; } } void rec_liste_ens(Ast *A) { Ast A1 ; rec_elem (&A1) ; rec_suite_liste_ens(A1, A) ; } void rec_suite_liste_ens( Ast A1, Ast *A) { Ast A2 ; switch (LC().nature) { case VIRG: avancer() ; rec_elem (&A2) ; A3 = creer_virg(A1, A2) ; rec_suite_liste_ens(A3, A) ; break ; default: *A = A1 ; break ; } } void rec_elem (Ast *A) { switch (LC().nature) { case ENTIER: avancer() ; *A = creer_entier() ; break ; default: rec_ens(A) ; }