Elements de correction du Partiel INF404 de Mars 2017 ======================================================= Q3. L'expression suivante comporte une erreur lexicale car "ttt" n'est pas un lexeme correct : if ttt then tt else ff L'expression suivante comporte une erreur syntaxique car il n'y a pas de "then" apres le "if" : if (tt) tt else ff Q4 + Q6. // on abrege lexeme_courant en LC void Rec_Exp (Ast *A) { Ast A1, A2, A3 ; switch (LC.nature) { case IF: avancer() ; Rec_Terme(&A1) ; if (LC.nature == THEN) { avancer() ; Rec_Terme(&A2) if (LC.nature == ELSE) { avancer() ; Rec_Terme(&A3) *A = creer_ite(A1, A2, A3) ; } else { Erreur() ; } } else { Erreur ; } ; break ; default: Rec_Terme (A) ; break ; } } void Rec_Terme(Ast *A) { Ast A1 ; switch (LC.nature) { case NOT: avancer() ; Rec_Facteur(&A1) ; *A = creer_negation(A1) ; break ; default: Rec_Facteur(A) ; break ; } void Rec_Facteur(Ast *A) { switch (LC.nature) { case TRUE: avancer() ; creer_vrai(A) ; break ; case FALSE: avancer() ; creer_faux(A) ; break ; case PARO: avancer() ; Rec_Facteur() ; if (LC.nature == PARF) avancer() ; Rec_Exp(A) ; else Erreur() ; break ; } } void analyser (char *nom_fichier, Ast *arbre) { demarrer (nom_fichier) ; Rec_Exp(arbre) ; if (LC.nature != FIN_SEQENCE) Erreur() ; } Q7. int evaluer(Ast A) { int e1, e2, e3 ; switch (A->nature) { case N_NOT: return !evaluer(A->centre) ; case N_ITE: e1 = evaluer(A->gauche) ; e2 = evaluer(A->centre) ; e3 = evaluer(A->droite) ; return (!e1 || e2) && (e1 || e3) ; case N_TRUE: return 1 ; case N_FALSE: return 0 ; } }