Changes between Version 10 and Version 11 of CaoCourseTme3
- Timestamp:
- Feb 17, 2007, 1:38:51 PM (18 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
CaoCourseTme3
v10 v11 13 13 14 14 Vous allez développer un analyseur lexical (scanner), puis un analyseur syntaxique (parser) 15 pour le sous-ensemble d e la grammaire du langage VHDL utilisé par la chaîne de CAO Alliance15 pour le sous-ensemble du langage VHDL utilisé par la chaîne de CAO Alliance 16 16 pour décrire la vue structurelle (format ''.vst''). La structure de donnée construite en mémoire est 17 17 la structure de données ''lofig'' présentée en cours. … … 31 31 On fait l'hypothèse que tous les signaux sont de type bit, et il n'est donc pas demandé de traiter les vecteurs de bits. 32 32 33 Dans ce TME, il ne sera pas question d'analyse sémantique ni même 34 d'actions à effectuer lorsqu'une règle est activée. 35 On se borne donc à effectuer l'analyse de syntaxe en s'assurant que les structures 36 grammaticales définies permettent effectivement d'analyser le fichier ''exemple.vst''. 37 38 = Etape 1 : Ecriture de l'analyseur lexical = 39 40 L'outil ''''flex''' est un générateur d'analyseur lexical. Il prend en entrée un fichier vst.l 41 contenant la définition des "token" à reconnaître, et génère en sortie un fichier vst.yy.c 42 qui contient le code C de l'analyseur lexical. 33 Dans ce TME3, on se limitera à l'analyse grammaticale du format''.vst''. La construction effective 34 de la structure de données ''lofig'' sera réalisée dans le TME4. 35 36 Commencez par créez un répertoire ''tme3''. Il est recommandé de créer un sous-répertoire 37 pour chacune des étapes de ce TME, et à recopier vos fichiers d'un répertoire dans le suivant, 38 de façon à conserver les résultats intermédiaires. 39 40 = Etape 1 : Analyseur lexical = 41 42 L'outil ''''flex''' est un générateur d'analyseur lexical. Il prend en entrée un fichier ''vst.l'' 43 contenant la définition des "token" à reconnaître, et génère en sortie un fichier ''vst.yy.c'' 44 qui contient le code C de l'analyseur lexical, et en particulier la fonction yylex(). 45 43 46 On appelle ''token'' une suite de caractères lus dans le fichier texte qu'on cherche à analyser, 44 47 et correspondant à une expression régulière : mot-clef, identificateur, etc... 45 Le but de cette première étape est d'écrire le fichier ''vst.l'' définissant les expressions46 régulières duformat ''.vst''.48 Le but de cette première étape est d'écrire le fichier ''vst.l'' qui définit les expressions 49 régulières correspondant à tous les "tokens" utilisés par format ''.vst''. 47 50 48 51 On rappelle qu'en VHDL, les lettres majuscules et minuscules ne sont pas différenciées. … … 55 58 1. Etablir la règle permettant d'absorber les caractères d'espace et les caractères de tabulation. 56 59 57 On donne ci-dessous une partie du fichier ''vst.l'' que vous devez écrire. 60 On donne ci-dessous une partie du fichier ''vst.l'' que vous devez écrire. Comme vous pouvez le constater, 61 ce fichier se termine par la définition du programme main() qui fait appel à la fonction yylex(). 62 La variable globale yyin est un pointeur sur le fichier à analyser. 58 63 {{{ 59 64 %{ 60 65 #include <string.h> 61 66 #include <stdio.h> 62 int yylineno = 1; /* compteur de numero de ligne */ 67 int yylineno = 1; /* compteur de numero de ligne utilisé pour les messages d'erreur */ 68 #define YY_NO_UNPUT /* 63 69 %} 64 définitions de macro 65 %% 66 [ \t] { /* Rien de rien */ }67 \n {yylineno++;}70 71 %% 72 [ \t] { /* Rien de rien */ } 73 \n {yylineno++;} 68 74 regle1 {printf("TOKEN1: %s\n", yytext);} 69 75 regle2 {printf("TOKEN2: %s\n", yytext);} 70 76 regle3 {printf("TOKEN3: %s\n", yytext);} 71 77 %% 72 int main(void) 78 79 int main(int argc, char *argv[]) 73 80 { 74 yylex(); 75 return 0; 81 if(argc != 2) { 82 printf("\n******* usage : %s filename \n", argv[0]); 83 exit(1); 84 } 85 86 yyin = fopen(argv[1], "r"); 87 88 if(!yyin) { 89 printf("\n******* cannot open file : %s \n", argv[1]); 90 exit(1); 91 } 92 93 yylex(); 94 return 0; 76 95 } 77 96 }}} 78 Modifiez ce fichier en introduisant les règles manquantes, et définissez les commandes d'affichage79 qui permettent d'afficher la chaîne de caractères correspondant à chaque token reconnu.97 Modifiez ce fichier en introduisant les règles correspondant aux différents "token" à reconnaître, 98 et définissez les commandes d'affichage qui permettent d'afficher la chaîne de caractères correspondant à chaque token reconnu. 80 99 81 100 La compilation du fichier ''vst.l'' s'effectue comme suit, à charge pour vous d'intégrer cela dans un Makefile: … … 84 103 gcc -Wall -Werror -o scanner vst.yy.c -lfl 85 104 }}} 86 87 '''flex''' déclare une macro non utilisée dans le cas présent, ce qui déclenche un avertissement justifié au moment de la compilation.88 Pour éviter cela, il faut définir dans le prologue du fichier ''vst.l'' la macro YY_NO_UNPUT.89 105 90 106 = Etape 2 : Modification de l'analyseur lexical = … … 103 119 * Modifier la fonction main() pour qu'elle affiche le type des tokens reconnus. On rappelle que ''yylex'' retourne 0 lorsque la fin de fichier est lue. 104 120 105 = Etape 3 : Ecriture d'un premier analyseur syntaxique =121 = Etape 3 : Analyseur syntaxique = 106 122 107 123 L'outil '''bison''' est un générateur d'analyseur syntaxique.