Changes between Version 1 and Version 2 of CaoCourseTme3


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

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme3

    v1 v2  
    11{{{
    22#!html
    3 <h1> TME3 : Réalisation d'un parser de fichiers pour le format ".vst "</h1>
     3<h1> TME3 : Réalisation d'un analyser syntaxique  pour le format de fichier ''.vst''</h1>
    44}}}
    55[[PageOutline]]
    66
    7 = 1. Objectifs =
     7= Objectifs =
    88
    99L'objectif de ce TME est de vous familiariser avec les outils '''flex''' et '''bison''',
     
    1212syntaxique) pour différents formats de fichiers.
    1313
    14 Vous allez donc développer un ''parser'' pour le sous-ensemble de la grammaire du
    15 langage VHDL utilisé  par la chaîne de CAO Allianced pour décrire la vue structurelle
    16 (format ".vst"). La structure de donnée construite en mémoire est la structure de données ''lofig''
    17 présentée en cours.
    18 
    19 Nous ne vous donnons pas la grammaire du format ".vst" mais vous devrez
    20 la construire en analysant les fichiers d'exemples au format ".vst" qui sont disponibles dans le répertoire
     14Vous 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 Allianced
     16pour décrire la vue structurelle (format ".vst"). La structure de donnée construite en mémoire est
     17la structure de données ''lofig'' présentée en cours.
     18
     19Nous ne vous donnons pas la grammaire du format ''.vst'' mais vous devrez
     20la construire en analysant les fichiers d'exemples au format ''.vst'' qui sont disponibles dans le répertoire
    2121{{{
    2222~encadr/cao/tme3/vst+.
    2323}}}
    24 
    2524Le sous-ensemble de VHDL visé permet de décrire des composants possédant des ports
    2625d'entrée/sortie, des signaux, et d'instancier ces composants en les connectants par les signaux.
    27 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.
    28 
    29  1 : Ècriture du \emph{scanner}}
    30 
    31 On rappelle qu'on appelle \texttt{token} une suite de caractËres lus dans
    32 le fichier qu'on cherche ‡ analyser, et correspondant ‡ une
    33 expression rÈguliËre : mot-clef, identificateur, etc...
    34 Vous devez Ècrire le fichier \texttt{vst.l} dÈfinissant les expressions
    35 rÈguliËres correspondant au format .vst.
    36 
    37 On rappelle qu'en VHDL, les lettres majuscules et minuscules ne sont pas
    38 diffÈrenciÈes.
    39 Cherchez dans le manuel de \texttt{flex} une maniËre simple de
    40 produire un \emph{scanner} qui ne fasse pas la diffÈrence entre
    41 majuscules et minuscules.
    42 
    43 \begin{enumerate}
    44 \itemsep=-.5ex
    45 
    46 \item Ètablir la liste des mots clefs du format .vst, et en dÈduire les
    47       expressions rÈguliËres en langage \texttt{lex} permettant de
    48       les reconnaÓtre~;
    49 
    50 \item Ètablir la liste des opÈrateurs du langage et les rËgles
    51       permettant de les reconnaÓtre.
    52       On utilisera une classe pour les opÈrateurs
    53       possÈdant un seul caractËre~;
    54 
    55 \item un identificateur du VHDL commence par une lettre, suivie
    56       optionnellement d'autant de lettres, chiffres ou
    57       d'\emph{underscore}s que l'on veut, avec la contrainte que l'on
    58       ne doit pas avoir 2 \emph{underscore}s successifs.
    59       Etablir la rËgle de reconnaissance d'un identificateur~;
    60 
    61 \item un commentaire commence par \texttt{-\hspace{.2ex}-} et s'achËve en fin de
    62       ligne. Etablir la rËgle permettant d'absorber ces commentaires.
    63 
    64 \item Etablir la rËgle permettant d'absorber les caractËres d'espacement et les
    65       caractËres de tabulation.
    66 
    67 \end{enumerate}
    68 
    69 On donne ci-dessous une partie du fichier \texttt{vst.l} que vous devez Ècrire.
    70 Modifiez ce fichier en introduisant les rËgles que nous vous avons demandÈ d'Ètablir, et
    71 dÈfinissez les commandes d'affichage qui permettent d'afficher la chaÓne de
    72 caractËres correspondant ‡ chaque token reconnu.
    73 
    74 %\small
    75 %\scriptsize
    76 \begin{verbatim}
     26On 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.
     27
     28= Etape 1 : Ecriture de l'analyseur lexical =
     29
     30On appelle ''token'' une suite de caractères lus dans le fichier qu'on cherche à analyser,
     31et correspondant à une expression régulière : mot-clef, identificateur, etc...
     32Le but de cette première étape est d'écrire le fichier ''vst.l'' définissant les expressions
     33régulières du format ''.vst''.
     34
     35On rappelle qu'en VHDL, les lettres majuscules et minuscules ne sont pas différenciées.
     36Cherchez dans le manuel de '''flex''' une manière simple de générer un analyseur lexical
     37qui ne fasse pas la diffÈrence entre majuscules et minuscules.
     38  1. Etablir la liste des mots clefs du format ''.vst'', et en déduire les expressions régulières en langage '''flex''' permettant de les reconnaître.
     39  1. Etablir la liste des opérateurs du format ''.vst'', et écrire les règles en langage '''flex''' permettant de les reconnaître. On utilisera une classe pour les opérateurs possédant un seul caractère.
     40  1. Etablir la règle de reconnaissance d'un identificateur, sachant qu'un identificateur du VHDL commence toujours par une lettre, suivied'un nombre quelconque de lettres, chiffres ou ''underscore'', avec la contrainte que l'on ne doit pas avoir 2 ''underscore'' successifs.
     41  1. Etablir la règle permettant d'absorber les commentaires, sachant qu'un commentaire commence par "--" et s'achève en fin de ligne. 
     42  1. Etablir la règle permettant d'absorber les caractères d'espace et les caractères de tabulation.
     43
     44On donne ci-dessous une partie du fichier ''vst.l'' que vous devez écrire.
     45{{{
    7746%{
    7847#include <string.h>
     
    8049int yylineno = 1; /* compteur de numero de ligne */
    8150%}
    82 dÈfinitions de macro
     51définitions de macro
    8352%%
    8453[ \t]           { /* Rien de rien */ }
     
    8655regle1          {printf("TOKEN1: %s\n", yytext);}
    8756regle2          {printf("TOKEN2: %s\n", yytext);}
    88 reglen          {printf("TOKEN3: %s\n", yytext);}
     57regle3          {printf("TOKEN3: %s\n", yytext);}
    8958%%
    9059int main(void)
     
    9362   return 0;
    9463}
    95 \end{verbatim}
    96 \normalsize
    97 
    98 Nous rappellons que la compilation s'effectue grosso-modo ainsi,
    99 ‡ charge pour vous d'intÈgrer cela dans un \texttt{Makefile}.
    100 
    101 %\small
    102 %\scriptsize
    103 \begin{verbatim}
     64}}}
     65Modifiez ce fichier en introduisant les règles manquantes, et définissez les commandes d'affichage
     66qui permettent d'afficher la chaîne de caractères correspondant à chaque token reconnu.
     67
     68La compilation du fichier ''vst.l'' s'effectue comme suit, à charge pour vous d'intégrer cela dans un Makefile:
     69{{{
    10470flex -t vst.l > vst.yy.c
    10571gcc -Wall -Werror -o scanner vst.yy.c -lfl
    106 \end{verbatim}
    107 \normalsize
    108 
     72}}}
    10973\texttt{lex} dÈclare une macro non utilisÈe dans le cas prÈsent,
    11074et il y a donc un avertissement justifiÈ au moment de la compilation.
     
    11276vst.l la macro \texttt{YY\_NO\_UNPUT}.
    11377
    114 \section*{Etape 2 : modification du \emph{scanner}}
    115 
    116 On cherche maintenant ‡ modifier le scanner pour qu'il affiche non plus
    117 la chaÓne de caractËres associÈe ‡ chaque token, mais un entier
    118 reprÈsentant le type du token reconnu.
    119 
    120 Pour cela~:
    121 
    122 \begin{enumerate}
    123 \itemsep=-.5ex
    124 
    125 \item DÈfinir dans le prologue du fichier vst.l un type ÈnumÈrÈ qui associe
    126 ‡ chaque token un entier dÈfinissant son type. On utilise en gÈnÈral des valeurs
    127 supÈrieures ‡ 255 pour les token correspondant ‡ une chaÓne de plusieurs caractËres,
    128 de faÁon ‡ pouvoir directement utiliser le code ascii du caractËre dans le cas
    129 d'un token constituÈ d'un seul caractËre. ~;
    130 
    131 \item Modifier les actions associÈes aux rËgles afin qu'elles retournent
    132       le type du \emph{token}~;
     78= Etape 2 : modification de l'analyseur lexical =
     79
     80On cherche maintenant à modifier l'analyseur lexical pour qu'il affiche non plus
     81la chaîne de caractères associée à chaque token, mais un entier représentant le type du token reconnu.
     82
     83Pour cela:
     84
     85  * Définir dans le prologue du fichier ''vst.l'' un type énuméré qui associe à chaque token un entier définissant son type. On utilise en général des valeurs supérieures à 255 pour les token correspondant à une chaîne de plusieurs caractères, de façon à pouvoir directement utiliser le code ascii du caractère dans le cas d'un token constitué d'un seul caractère.
     86  * Modifier les actions associées aux règles afin qu'elles retournent le type du token.
    13387%\small
    13488\begin{verbatim}