Changes between Version 10 and Version 11 of CaoCourseTme3


Ignore:
Timestamp:
Feb 17, 2007, 1:38:51 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme3

    v10 v11  
    1313
    1414Vous allez développer un analyseur lexical (scanner), puis un analyseur syntaxique (parser)
    15 pour le sous-ensemble de la grammaire du  langage VHDL utilisé  par la chaîne de CAO Alliance
     15pour le sous-ensemble du  langage VHDL utilisé  par la chaîne de CAO Alliance
    1616pour décrire la vue structurelle (format ''.vst''). La structure de donnée construite en mémoire est
    1717la structure de données ''lofig'' présentée en cours.
     
    3131On 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.
    3232
    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.
     33Dans ce TME3, on se limitera à l'analyse grammaticale du format''.vst''. La construction effective
     34de la structure de données ''lofig'' sera réalisée dans le TME4.
     35
     36Commencez par créez un répertoire ''tme3''. Il est recommandé de créer un sous-répertoire
     37pour chacune des étapes de ce TME, et à recopier vos fichiers d'un répertoire dans le suivant,
     38de façon à conserver les résultats intermédiaires.
     39
     40= Etape 1 : Analyseur lexical =
     41
     42L'outil ''''flex''' est un générateur d'analyseur lexical. Il prend en entrée un fichier ''vst.l''
     43contenant la définition des "token" à reconnaître, et génère en sortie un fichier ''vst.yy.c''
     44qui contient le code C de l'analyseur lexical, et en particulier la fonction yylex().
     45 
    4346On appelle ''token'' une suite de caractères lus dans le fichier texte qu'on cherche à analyser,
    4447et 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 expressions
    46 régulières du format ''.vst''.
     48Le but de cette première étape est d'écrire le fichier ''vst.l'' qui définit les expressions
     49régulières correspondant à tous les "tokens" utilisés par format ''.vst''.
    4750
    4851On rappelle qu'en VHDL, les lettres majuscules et minuscules ne sont pas différenciées.
     
    5558  1. Etablir la règle permettant d'absorber les caractères d'espace et les caractères de tabulation.
    5659
    57 On donne ci-dessous une partie du fichier ''vst.l'' que vous devez écrire.
     60On donne ci-dessous une partie du fichier ''vst.l'' que vous devez écrire. Comme vous pouvez le constater,
     61ce fichier se termine par la définition du programme main() qui fait appel à la fonction yylex().
     62La variable globale yyin est un pointeur sur le fichier à analyser.
    5863{{{
    5964%{
    6065#include <string.h>
    6166#include <stdio.h>
    62 int yylineno = 1; /* compteur de numero de ligne */
     67int yylineno = 1;             /* compteur de numero de ligne utilisé pour les messages d'erreur */
     68#define YY_NO_UNPUT   /*
    6369%}
    64 définitions de macro
    65 %%
    66 [ \t]           { /* Rien de rien */ }
    67 \n              {yylineno++;}
     70
     71%%
     72[ \t]              { /* Rien de rien */ }
     73\n                {yylineno++;}
    6874regle1          {printf("TOKEN1: %s\n", yytext);}
    6975regle2          {printf("TOKEN2: %s\n", yytext);}
    7076regle3          {printf("TOKEN3: %s\n", yytext);}
    7177%%
    72 int main(void)
     78
     79int main(int argc, char *argv[])
    7380{
    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;
    7695}
    7796}}}
    78 Modifiez ce fichier en introduisant les règles manquantes, et définissez les commandes d'affichage
    79 qui permettent d'afficher la chaîne de caractères correspondant à chaque token reconnu.
     97Modifiez ce fichier en introduisant les règles correspondant aux différents "token" à reconnaître,
     98et définissez les commandes d'affichage qui permettent d'afficher la chaîne de caractères correspondant à chaque token reconnu.
    8099
    81100La compilation du fichier ''vst.l'' s'effectue comme suit, à charge pour vous d'intégrer cela dans un Makefile:
     
    84103gcc -Wall -Werror -o scanner vst.yy.c -lfl
    85104}}}
    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.
    89105
    90106= Etape 2 : Modification de l'analyseur lexical =
     
    103119  * 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.
    104120
    105 = Etape 3 : Ecriture d'un premier analyseur syntaxique =
     121= Etape 3 : Analyseur syntaxique =
    106122
    107123L'outil '''bison''' est un générateur d'analyseur syntaxique.