1 Université de Nice-Sophia Antipolis Licence d Informatique - 3e année U.E. Analyses (semestre 6) 2005 2006 Examen de contrôle continu du jeudi 9 mars 2006 Durée : 2 heures Tous documents autorisés 1 Grammaire LL(1) Grammaire Extrait Axiome = Statement N = { Statement, Formal, Type, Expression T = { =, ident Statement Formal = Expression ident = Expression Expression Formal Type ident Type ident Expression ident Questions : 1. Est-ce que la grammaire Extrait est LL(1)? Justifiez votre réponse. Il faut que les ensembles directeurs soient disjoints deux à deux. Il n y a que le non-terminal Statement concerné. PREM(Formal = Expression SUIV(Statement)) = {ident PREM(ident = Expression SUIV(Statement)) = {ident PREM(Expression SUIV(Statement)) = {ident Les ensembles ne sont pas du tout disjoints, donc la grammaire Extrait n est pas LL(1). 2. Donnez-en une version qui soit LL(1), en le justifiant bien entendu. Grammaire ExtraitBis Axiome = Statement N = { Statement, endstatement T = { =, ident Statement i d e n t endstatement endstatement ident = ident = ident Cette fois-ci, les ensembles directeurs sont disjoints deux à deux. Il n y a que le non-terminal endstatement concerné. PREM(ident = Expression SUIV(endStatement)) = {ident PREM(= Expression SUIV(endStatement)) = {= PREM(SUIV(endStatement)) = {
2 2 Analyse lexicale Voici un extrait d une grammaire pour la syntaxe de Prolog-II. Les crochets indiquent le facultatif, les accolades la répétition (0 ou plusieurs fois), les guillemets certains terminaux. programme { r è g l e r è g l e terme " >" { but " ; " but terme terme termesimple [ ". " terme ] termesimple constante i d e n t i f i c a t e u r p r é d i c a t " <" " >" tuple " ( " terme " ) " p r é d i c a t i d e n t i f i c a t e u r " ( " terme { ", " terme " ) " tuple " <" terme { ", " terme " >" constante i d e n t i f i c a t e u r e n t i e r i d e n t i f i c a t e u r mot [" " mot ] mot l e t t r e { l e t t r e e n t i e r c h i f f r e { c h i f f r e Question : Extrayez de la grammaire ci-dessus les lexèmes du langage, et écrivez le fichier à donner à FLEX, afin que la fonction yylex produite renvoie le lexème adéquat sous forme d entier. Cette fonction est conçue pour être appelée depuis un analyseur syntaxique, qui considère la fin de fichier comme la fin de chaîne à analyser. Tout autre fichier susceptible dêtre inclus pour un bon fonctionnement du programme final (qui n est pas à écrire) est bien entendu à donner aussi. 1. Fichier à donner à FLEX. %{ #include " PrologToken. h " % %% " >" return FLECHE; " ; " return PT_VIRGULE; ". " return POINT; " < " return INF; " > " return SUP; " ( " return PARG; " ) " return PARD; ", " return VIRGULE; [a-z]+([-][a-z]+)? return IDENT; [0-9]+ return ENTIER; <<EOF>> return FDF; [ \t\n] ;. fprintf(stderr, " e r r e u r l e x i c a l e \ n " ); %% 2. Fichier à inclure PrologToken.h #ifndef _PROLOGTOKEN_H_ #define _PROLOGTOKEN_H_ #define FLECHE 1 #define PT_VIRGULE 2
3 #define POINT 3 #define INF 4 #define SUP 5 #define PARG 6 #define PARD 7 #define VIRGULE 8 #define IDENT 9 #define ENTIER 10 #define FDF 0 #endif... 3 Suppression de la récursivité à gauche Axiome = A N = { A, B, C T = { a, b, c, d, e A B b C e B A a C A c Grammaire Toy Questions : 1. Donnez deux phrases appartenant au langage engendré par la grammaire Toy, d une longueur minimale de 4 et passant par les deux choix de l axiome. dbab dbce 2. Appliquez l algorithme donné dans le mémento pour supprimer la récursivité gauche (indirecte!) de la grammaire Toy. On numérote les non-terminaux : A 1 A 2 b A 3 e A 2 A 1 a A 3 A 1 c i = 1 i = 2, j = 1 On remplace A 2 A 1 a
4 par A 2 A 2 b a A 3 e a et on enlève la récursivité directe cette fois : A 2 A 3 e a B 1 B 1 B 1 b a B 1 i = 3, j = 1 On remplace par A 3 A 1 c A 3 A 2 b c A 3 e c et on enlève la récursivité directe cette fois : A 3 A 2 b c B 2 B 2 B 2 e c B 2 i = 3, j = 2 On remplace par A 3 A 2 b c B 2 B 2 A 3 A 3 e a B 1 b c B 2 B 1 b c B 2 B 2 et on enlève la récursivité directe cette fois : A 3 d B 1 b c B 2 B 3 B 2 B 3 B 3 e a B 1 b c B 2 B 3 La grammaire non récursive est donc : A 1 A 2 b A 3 e A 2 A 3 e a B 1 B 1 A 3 d B 1 b c B 2 B 3 B 2 B 3 B 1 b a B 1 B 2 e c B 2 B 3 e a B 1 b c B 2 B 3
5 4 Analyse en descente récursive Voici un programme écrit en C (mais peu importe). La procédure avancer permet de lire un nouveau lexème, et la procédure verifieretavancer permet de tester si le lexème courant est celui passé en paramètre PUIS de lire un nouveau lexème. La variable lexemecourant contient, comme son nom l indique, la valeur du lexème en cours. void program (void) { verifieretavancer(debut); code(); verifieretavancer(fin); void code (void) { switch (lexemecourant) { case ENTIER: case NOM: case IMPRIME: case LIT: instlist(); void instlist (void) { instruction(); if (lexemecourant == POINT_VIRGULE) { instlist(); void instruction (void) { switch (lexemecourant) { case ENTIER: /* déclaration */ verifieretavancer(nom); case NOM: /* affectation */ verifieretavancer(deux_points_egal); verifieretavancer(entier); case IMPRIME: /* écriture */ verifieretavancer(parenthese_gauche); verifieretavancer(entier); verifieretavancer(parenthese_droite); case LIT: /* lecture */ verifieretavancer(parenthese_gauche); verifieretavancer(nom); verifieretavancer(parenthese_droite); int main (int argc, char *argv[]) {
6 program(); /* on teste la fin de chaine */ if (lexemecourant == FDF) fprintf(stdout, " mot du langage \ n " ); else fprintf(stdout, " mot n appartenant pas au langage " ); return -1; Donnez la grammaire algébrique (donc le quadruplet) correspondant à cet analy- Question : seur. Grammaire Alkol006 Axiome = program N = { program, code, instlist, instruction T = { début, fin, entier, nom, imprime, lit, ;, :=, (, ) program début code f i n code ν i n s t L i s t i n s t L i s t i n s t r u c t i o n i n s t r u c t i o n ; i n s t L i s t i n s t r u c t i o n e n t i e r nom nom := e n t i e r imprime ( e n t i e r ) l i t ( nom ) En fait, la production qui permet de dériver instruction en le vide ne devrait pas être là, mais j ai oublié de mettre un default dans le switch avec un message d erreur.... 5 Automate LL(2) Axiome = A N = { A, B, C T = { x, y, z A B x C y B z C z Grammaire ToyBis Question : Grâce à l algorithme de construction d un automate LL(k) du mémento, donnez l automate LL(2) de la grammaire ToyBis. q 0 = [S A ; { ] q 0 z x q 1 q 2 z x q 0 z y q 1 q 3 z y
7 q 1 = [S A ; { ] q 1 ν q 2 = [A B x ; { ] q 2 z x q 4 q 5 z x q 3 = [A C y ; { ] q 3 z y q 6 q 7 z y q 4 = [A B x ; { ] q 4 x q 8 q 5 = [B z ; { x ] q 5 z q 9 q 6 = [A C y ; { ] q 6 y q 10 q 7 = [C z ; { y ] q 7 z q 11 q 8 = [A B x ; { ] q 8 ν q 9 = [B z ; { x ] q 9 ν q 10 = [A C y ; { ] q 10 ν q 11 = [C z ; { y ] q 11 ν...