Changes between Initial Version and Version 1 of CaoCourseTme3


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

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme3

    v1 v1  
     1{{{
     2#!html
     3<h1> TME3 : Réalisation d'un parser de fichiers pour le format ".vst "</h1>
     4}}}
     5[[PageOutline]]
     6
     7= 1. Objectifs =
     8
     9L'objectif de ce TME est de vous familiariser avec les outils '''flex''' et '''bison''',
     10qui sont des outils de la distribution GNU permettant de générer automatiquement des
     11''scanners'' (un scanner est un analyseur lexical) et des ''parsers'' (un parser est un analyseur
     12syntaxique) pour différents formats de fichiers.
     13
     14Vous allez donc développer un ''parser'' pour le sous-ensemble de la grammaire du
     15langage 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''
     17pré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
     21{{{
     22~encadr/cao/tme3/vst+.
     23}}}
     24
     25Le sous-ensemble de VHDL visé permet de décrire des composants possédant des ports
     26d'entrée/sortie, des signaux, et d'instancier ces composants en les connectants par les signaux.
     27On 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
     31On rappelle qu'on appelle \texttt{token} une suite de caractËres lus dans
     32le fichier qu'on cherche ‡ analyser, et correspondant ‡ une
     33expression rÈguliËre : mot-clef, identificateur, etc...
     34Vous devez Ècrire le fichier \texttt{vst.l} dÈfinissant les expressions
     35rÈguliËres correspondant au format .vst.
     36
     37On rappelle qu'en VHDL, les lettres majuscules et minuscules ne sont pas
     38diffÈrenciÈes.
     39Cherchez dans le manuel de \texttt{flex} une maniËre simple de
     40produire un \emph{scanner} qui ne fasse pas la diffÈrence entre
     41majuscules 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
     69On donne ci-dessous une partie du fichier \texttt{vst.l} que vous devez Ècrire.
     70Modifiez ce fichier en introduisant les rËgles que nous vous avons demandÈ d'Ètablir, et
     71dÈfinissez les commandes d'affichage qui permettent d'afficher la chaÓne de
     72caractËres correspondant ‡ chaque token reconnu.
     73
     74%\small
     75%\scriptsize
     76\begin{verbatim}
     77%{
     78#include <string.h>
     79#include <stdio.h>
     80int yylineno = 1; /* compteur de numero de ligne */
     81%}
     82dÈfinitions de macro
     83%%
     84[ \t]           { /* Rien de rien */ }
     85\n              {yylineno++;}
     86regle1          {printf("TOKEN1: %s\n", yytext);}
     87regle2          {printf("TOKEN2: %s\n", yytext);}
     88reglen          {printf("TOKEN3: %s\n", yytext);}
     89%%
     90int main(void)
     91{
     92   yylex();
     93   return 0;
     94}
     95\end{verbatim}
     96\normalsize
     97
     98Nous 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}
     104flex -t vst.l > vst.yy.c
     105gcc -Wall -Werror -o scanner vst.yy.c -lfl
     106\end{verbatim}
     107\normalsize
     108
     109\texttt{lex} dÈclare une macro non utilisÈe dans le cas prÈsent,
     110et il y a donc un avertissement justifiÈ au moment de la compilation.
     111Pour Èviter cela, il faut dÈfinir dans le prologue du fichier
     112vst.l la macro \texttt{YY\_NO\_UNPUT}.
     113
     114\section*{Etape 2 : modification du \emph{scanner}}
     115
     116On cherche maintenant ‡ modifier le scanner pour qu'il affiche non plus
     117la chaÓne de caractËres associÈe ‡ chaque token, mais un entier
     118reprÈsentant le type du token reconnu.
     119
     120Pour 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
     127supÈrieures ‡ 255 pour les token correspondant ‡ une chaÓne de plusieurs caractËres,
     128de faÁon ‡ pouvoir directement utiliser le code ascii du caractËre dans le cas
     129d'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}~;
     133%\small
     134\begin{verbatim}
     135entity   {return T_ENTITY;}
     136\end{verbatim}
     137\normalsize
     138
     139\item Modifier le \texttt{main} pour qu'il affiche le type des tokens reconnus.
     140      Nous rappellons que \texttt{yylex} retourne 0 lorsque la fin de fichier est lue~;
     141
     142\end{enumerate}
     143
     144\section*{Etape 3 : dÈbut de l'Ècriture du \emph{parser}}
     145
     146Il faut maintenant dÈfinir dans le fichier \texttt{vst.y} les rËgles de la grammaire
     147correspondant au format .vst. Ces rËgles s'appuient sur les token reconnus par flex.
     148Dans ce TME, il ne sera pas question d'analyse sÈmantique ni mÍme
     149d'actions ‡ effectuer lorsqu'une rËgle est activÈe.
     150On se bornera donc ‡ effectuer l'analyse de syntaxe en s'assurant que les structures
     151grammaticales dÈfinies permettent effectivement d'analyser le fichier exemple.vst.
     152
     153Cette Ètape vise ‡ analyser le fichier \texttt{signal.ex}, qui ne constitue qu'une
     154partie du fichier \texttt{exemple.vst}. On cherche principalement ‡ traiter
     155le problËme des rËgles permettant de reconnaÓtre un nombre variable d'arguments
     156(une liste de signaux dans notre cas).
     157
     158\begin{enumerate}
     159\itemsep=-.5ex
     160
     161\item dÈfinir les rËgles de grammaire correspondant ‡ la dÈclaration des signaux VHDL
     162      en analysant le contenu du fichier \texttt{signal.ex} qui vous est fourni,
     163      et implanter ces rËgles dans le fichier vst.y.~;
     164
     165\item Dans le fichier vst.y, complÈter la dÈclaration des diffÈrents
     166      token utilisÈs par le parser.
     167      On dÈclarera tous les token susceptibles d'Ítre reconnus par
     168      le scanner.~;
     169
     170\item Comme nous n'allons pas effectuer d'actions pour ces
     171      rËgles, nous utiliserons le mode \emph{debug} de bison
     172      pour vÈrifier que l'analyse se passe bien.
     173      Pour activer ce mode, il faut utiliser l'option \texttt{-t} de
     174      bison et positionner la variable \texttt{yydebug} ‡ une
     175      valeur autre que zÈro dans la fonction main()~;
     176\item Il faut par ailleurs que \texttt{bison} fournisse la liste des
     177      \emph{tokens} ‡ \texttt{flex}. Pour cela, il faut utiliser l'option
     178      \texttt{-d}, pour demander ‡ bison de gÈnËrer un fichier \texttt{vst.tab.h}
     179      contenant ces dÈfinitions.
     180      Il faut donc modifier le fichier vst.l pour qure le fichier
     181      \texttt{vst.tab.h} soit inclus dans le fichier vst.l et supprimer les dÈfinitions
     182      de token existant par ailleurs dans vst.l.
     183\item il faut Ègalement modifier la fonction \texttt{main}, qui est maintenant dÈfinie
     184      dans le fichier vst.y, et doit appeller la fonction \texttt{yyparse()}.
     185\end{enumerate}
     186
     187Voici une Èbauche du fichier \texttt{vst.y} que vous devez modifier et complÈter:
     188
     189%\scriptsize
     190\begin{verbatim}
     191%{
     192#include <string.h>
     193#include <stdio.h>
     194
     195extern int      yylex(void);
     196extern int      yylineno;
     197extern FILE     *yyin;
     198
     199int yyerror(char *s)
     200{
     201   fprintf(stderr, "%s line %d\n", s, yylineno);
     202   return 1;
     203}
     204%}
     205
     206%token ...
     207
     208%%
     209prod : regle TOKEN
     210     | ...
     211     ;
     212%%
     213
     214int main(int argc, char *argv[])
     215{
     216   if(argc != 2) {
     217        printf(usage : %s filename\n", argv[0]);
     218        exit(1);
     219   }
     220   yyin = fopen(argv[1],"r");
     221   if(!yyin) {
     222        printf(cannot open file : %s\n", argv[1]);
     223        exit(1);
     224   }
     225   yydebug = 1;
     226   yyparse();
     227   return 0;
     228}
     229\end{verbatim}
     230\normalsize
     231
     232Nous rappellons que la compilation s'effectue grosso-modo ainsi,
     233‡ charge pour vous d'intÈgrer cela dans le \texttt{Makefile} dÈj‡ constituÈ
     234pour \texttt{lex}.
     235Nous vous rappellons que la compilation de \texttt{lex} doit dÈpendre du
     236fichier d'entÍte gÈnÈrÈ par \texttt{yacc}.
     237
     238%\small
     239%\scriptsize
     240\begin{verbatim}
     241bison -t -d vst.y
     242gcc -Wall -Werror -o parser vst.tab.c vst.yy.c -lfl
     243\end{verbatim}
     244\normalsize
     245
     246\section*{Etape 4 : suite et fin de l'Ècriture du \emph{parser}}
     247
     248L'idÈe est de construire le \emph{parser} de maniËre incrÈmentale.
     249La syntaxe de la dÈclaration des signaux ayant ÈtÈ dÈfinie, vous allez,
     250dans cet ordre~:
     251\begin{enumerate}
     252\itemsep=-.5ex
     253\item dÈfinir les rËgles de dÈclaration des ports en partant
     254      de l'exemple \texttt{port.ex} qui vous est fourni~;
     255\item dÈfinir les rËgles de dÈclaration du composant en partant
     256      de l'exemple \texttt{component.ex} qui vous est fourni~;
     257\item dÈfinir les rËgles de dÈclaration de l'entitÈ en partant
     258      de l'exemple \texttt{entity.ex} qui vous est fourni~;
     259\item dÈfinir toutes les rËgles nÈcessaires ‡ la lecture du fichier
     260      \texttt{exemple.vst}.
     261\end{enumerate}
     262
     263Vous pouvez faire des validations intermÈdiaires simplement en dÈclarant
     264un nouveau symbole de dÈpart gr‚ce ‡
     265%\small
     266\begin{verbatim}
     267%start regle
     268\end{verbatim}
     269\normalsize
     270
     271Vous pouvez considÈrer que le TME est terminÈ lorsque le parser construit
     272‡ partir des deux fichiers vst.l et vst.y est capable de lire et de reconnaitre
     273la totalitÈ du fichier exemple.vst.
     274
     275\small
     276\subsubsection*{signal.ex}
     277\begin{multicols}{2}
     278\begin{verbatim}
     279signal opc    : bit;
     280signal read   : bit;
     281signal lock   : bit;
     282signal a      : bit;
     283signal d      : bit;
     284signal ack    : bit;
     285signal tout   : bit;
     286signal it_0   : bit;
     287signal req0   : bit;
     288signal req1   : bit;
     289signal gnt0   : bit;
     290signal gnt1   : bit;
     291signal sel1   : bit;
     292signal sel2   : bit;
     293signal sel3   : bit;
     294signal sel4   : bit;
     295signal sel5   : bit;
     296signal sel6   : bit;
     297signal sel7   : bit;
     298signal sel8   : bit;
     299signal sel9   : bit;
     300signal snoopdo: bit;
     301\end{verbatim}
     302\end{multicols}
     303\subsubsection*{port.ex}
     304\begin{multicols}{2}
     305\begin{verbatim}
     306   port (
     307      clk    : in bit;
     308      resetn : in bit;
     309      ireq   : out bit;
     310      ignt   : in bit;
     311      dreq   : out bit;
     312      dgnt   : in bit;
     313      opc    : out bit;
     314      lock   : out bit;
     315      read   : inout bit;
     316      a      : inout bit;
     317      d      : inout bit;
     318      ack    : in bit;
     319      tout   : in bit;
     320      it_0   : in bit;
     321      it_1   : in bit;
     322      it_2   : in bit;
     323      it_3   : in bit;
     324      it_4   : in bit;
     325      it_5   : in bit;
     326      snoopdo: in bit
     327   );
     328\end{verbatim}
     329\end{multicols}
     330\subsubsection*{component.ex}
     331\begin{multicols}{2}
     332\begin{verbatim}
     333component PIR3000
     334   port (
     335      clk    : in bit;
     336      resetn : in bit;
     337      ireq   : out bit;
     338      ignt   : in bit;
     339      dreq   : out bit;
     340      dgnt   : in bit;
     341      opc    : out bit;
     342      lock   : out bit;
     343      read   : inout bit;
     344      a      : inout bit;
     345      d      : inout bit;
     346      ack    : in bit;
     347      tout   : in bit;
     348      it_0   : in bit;
     349      it_1   : in bit;
     350      it_2   : in bit;
     351      it_3   : in bit;
     352      it_4   : in bit;
     353      it_5   : in bit;
     354      snoopdo: in bit
     355   );
     356end component;
     357\end{verbatim}
     358\end{multicols}
     359\subsubsection*{entity.ex}
     360\begin{verbatim}
     361entity EXEMPLE is
     362   port (
     363      clk    : in bit;
     364      resetn : in bit
     365   );
     366end exemple;
     367\end{verbatim}
     368\scriptsize
     369\newpage
     370\subsubsection*{expemple.vst}
     371\begin{multicols}{2}
     372\begin{verbatim}
     373end exemple;
     374entity EXEMPLE is
     375   port (
     376      clk    : in bit;
     377      resetn : in bit
     378   );
     379end exemple;
     380
     381architecture structural of system is
     382component PIR3000
     383   port (
     384      clk    : in bit;
     385      resetn : in bit;
     386      ireq   : out bit;
     387      ignt   : in bit;
     388      dreq   : out bit;
     389      dgnt   : in bit;
     390      opc    : out bit;
     391      lock   : out bit;
     392      read   : inout bit;
     393      a      : inout bit;
     394      d      : inout bit;
     395      ack    : in bit;
     396      tout   : in bit;
     397      it_0   : in bit;
     398      it_1   : in bit;
     399      it_2   : in bit;
     400      it_3   : in bit;
     401      it_4   : in bit;
     402      it_5   : in bit;
     403      snoopdo: in bit
     404   );
     405end component;
     406
     407component PIRAM
     408   port (
     409      clk    : in    bit;
     410      resetn : in    bit;
     411      sel    : in    bit;
     412      opc    : in    bit;
     413      read   : in    bit;
     414      a      : in    bit;
     415      d      : inout bit;
     416      ack    : out   bit;
     417      tout   : in    bit
     418   );
     419end component;
     420
     421component PITTY
     422   port (
     423      clk    : in bit;
     424      resetn : in bit;
     425      sel    : in bit;
     426      opc    : in bit;
     427      read   : in bit;
     428      a      : in bit;
     429      d      : inout bit;
     430      ack    : out bit;
     431      tout   : in bit
     432   );
     433end component;
     434
     435component PIBCU
     436    port (
     437       clk     : in bit;
     438       req0    : in bit;
     439       req1    : in bit;
     440       gnt0    : out bit;
     441       gnt1    : out bit;
     442       sel1    : out bit;
     443       sel2    : out bit;
     444       sel3    : out bit;
     445       sel4    : out bit;
     446       sel5    : out bit;
     447       sel6    : out bit;
     448       sel7    : out bit;
     449       sel8    : out bit;
     450       sel9    : out bit;
     451       snoopdo : out bit;
     452       resetn  : in bit;
     453       opc     : in bit;
     454       read    : in bit;
     455       lock    : in bit;
     456       a       : in bit;
     457       d       : inout bit;
     458       ack     : inout bit;
     459       tout    : out bit;
     460       it      : out bit
     461    );
     462end component;
     463
     464signal opc    : bit;
     465signal read   : bit;
     466signal lock   : bit;
     467signal a      : bit;
     468signal d      : bit;
     469signal ack    : bit;
     470signal tout   : bit;
     471
     472signal it_0   : bit;
     473signal it_1   : bit;
     474signal it_2   : bit;
     475signal it_3   : bit;
     476signal it_4   : bit;
     477signal it_5   : bit;
     478
     479signal req0   : bit;
     480signal req1   : bit;
     481
     482signal gnt0   : bit;
     483signal gnt1   : bit;
     484
     485signal sel1   : bit;
     486signal sel2   : bit;
     487signal sel3   : bit;
     488signal sel4   : bit;
     489signal sel5   : bit;
     490signal sel6   : bit;
     491signal sel7   : bit;
     492signal sel8   : bit;
     493signal sel9   : bit;
     494signal snoopdo: bit;
     495
     496begin
     497
     498   r3000 : Pir3000
     499   port map (
     500      clk     => clk,
     501      resetn  => resetn,
     502      ireq    => req0,
     503      ignt    => gnt0,
     504      dreq    => req1,
     505      dgnt    => gnt1,
     506      opc     => opc,
     507      lock    => lock,
     508      read    => read,
     509      a       => a,
     510      d       => d,
     511      ack     => ack,
     512      tout    => tout,
     513      snoopdo => snoopdo,
     514      it_0    => it_0,
     515      it_1    => it_1,
     516      it_2    => it_2,
     517      it_3    => it_3,
     518      it_4    => it_4,
     519      it_5    => it_5
     520   );
     521
     522   rst : piram
     523   port map (
     524      clk    => clk,
     525      resetn => resetn,
     526      sel    => sel1,
     527      opc    => opc,
     528      read   => read,
     529      a      => a,
     530      d      => d,
     531      ack    => ack,
     532      tout   => tout
     533   );
     534
     535   exc : piram
     536   port map (
     537      clk    => clk,
     538      resetn => resetn,
     539      sel    => sel2,
     540      opc    => opc,
     541      read   => read,
     542      a      => a,
     543      d      => d,
     544      ack    => ack,
     545      tout   => tout
     546   );
     547
     548   bcu : pibcu
     549   port map (
     550      clk    => clk,
     551      req0   => req0,
     552      req1   => req1,
     553
     554      gnt0   => gnt0,
     555      gnt1   => gnt1,
     556     
     557      sel1   => sel1,
     558      sel2   => sel2,
     559      sel3   => sel3,
     560      sel4   => sel4,
     561      sel5   => sel5,
     562      sel6   => sel6,
     563      sel7   => sel7,
     564      sel8   => sel8,
     565      sel9   => sel9,
     566
     567      resetn => resetn,
     568      opc    => opc,
     569      read   => read,
     570      lock   => lock,
     571      a      => a,
     572      d      => d,
     573      ack    => ack,
     574      tout   => tout,
     575      snoopdo=> snoopdo,
     576      it     => it_1
     577   );
     578
     579   ins : piram
     580   port map (
     581      clk    => clk,
     582      resetn => resetn,
     583      sel    => sel3,
     584      opc    => opc,
     585      read   => read,
     586      a      => a,
     587      d      => d,
     588      ack    => ack,
     589      tout   => tout
     590   );
     591
     592   dat : piram
     593   port map (
     594      clk    => clk,
     595      resetn => resetn,
     596      sel    => sel4,
     597      opc    => opc,
     598      read   => read,
     599      a      => a,
     600      d      => d,
     601      ack    => ack,
     602      tout   => tout
     603   );
     604     
     605   tty : pitty
     606   port map (
     607      clk    => clk,
     608      resetn => resetn,
     609      sel    => sel5,
     610      opc    => opc,
     611      read   => read,
     612      a      => a,
     613      d      => d,
     614      ack    => ack,
     615      tout   => tout
     616   );
     617
     618   ttz : pitty
     619   port map (
     620      clk    => clk,
     621      resetn => resetn,
     622      sel    => sel9,
     623      opc    => opc,
     624      read   => read,
     625      a      => a,
     626      d      => d,
     627      ack    => ack,
     628      tout   => tout
     629   );
     630   
     631end structural;
     632\end{verbatim}
     633\end{multicols}
     634
     635\end{document}
     636
     637