Changes between Version 3 and Version 4 of CaoCourseTme3


Ignore:
Timestamp:
Feb 15, 2007, 6:29:08 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme3

    v3 v4  
    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 Allianced
    16 pour décrire la vue structurelle (format ".vst"). La structure de donnée construite en mémoire est
     15pour le sous-ensemble de la grammaire du  langage VHDL utilisé  par la chaîne de CAO Alliance
     16pour 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.
    1818
    1919Nous 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
     20la construire en analysant les deux fichiers d'exemple au format ''.vst''.
     21Le premier exemple [wiki:exemple.vst CaoCourseTme3Exemple] qui sont disponibles dans le répertoire
    2122{{{
    2223/users/enseig/encadr/cao/tme3/vst
     
    3536On rappelle qu'en VHDL, les lettres majuscules et minuscules ne sont pas différenciées.
    3637Cherchez dans le manuel de '''flex''' une manière simple de générer un analyseur lexical
    37 qui ne fasse pas la diffÈrence entre majuscules et minuscules.
     38qui ne fasse pas la différence entre majuscules et minuscules.
    3839  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.
    3940  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.
     
    7172gcc -Wall -Werror -o scanner vst.yy.c -lfl
    7273}}}
     74
    7375\texttt{lex} dÈclare une macro non utilisÈe dans le cas prÈsent,
    7476et il y a donc un avertissement justifiÈ au moment de la compilation.
     
    8486
    8587  * 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.
    87 %\small
    88 \begin{verbatim}
     88  * Modifier les actions associées aux règles afin qu'elles retournent le type du token. Par exemple :
     89{{{
    8990entity   {return T_ENTITY;}
    90 \end{verbatim}
    91 \normalsize
    92 
    93 \item Modifier le \texttt{main} pour qu'il affiche le type des tokens reconnus.
    94       Nous rappellons que \texttt{yylex} retourne 0 lorsque la fin de fichier est lue~;
    95 
    96 \end{enumerate}
    97 
    98 \section*{Etape 3 : dÈbut de l'Ècriture du \emph{parser}}
    99 
    100 Il faut maintenant dÈfinir dans le fichier \texttt{vst.y} les rËgles de la grammaire
    101 correspondant au format .vst. Ces rËgles s'appuient sur les token reconnus par flex.
    102 Dans ce TME, il ne sera pas question d'analyse sÈmantique ni mÍme
    103 d'actions ‡ effectuer lorsqu'une rËgle est activÈe.
    104 On se bornera donc ‡ effectuer l'analyse de syntaxe en s'assurant que les structures
    105 grammaticales dÈfinies permettent effectivement d'analyser le fichier exemple.vst.
    106 
    107 Cette Ètape vise ‡ analyser le fichier \texttt{signal.ex}, qui ne constitue qu'une
    108 partie du fichier \texttt{exemple.vst}. On cherche principalement ‡ traiter
    109 le problËme des rËgles permettant de reconnaÓtre un nombre variable d'arguments
     91}}}
     92  * 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.
     93
     94= Etape 3 : Ecriture d'un premier analyseur syntaxique =
     95
     96Il faut maintenant définir dans le fichier ''vst.y'' les règles de la grammaire
     97correspondant au format ''.vst''. Ce fichier "vst.y'' est utilisé par '''bison''' pour
     98générer la fonction .c constituant l'analyseur lexical.
     99Ces règles de grammaire sont des combinaisons de token reconnus par flex.
     100Dans ce TME, il ne sera pas question d'analyse sémantique ni même
     101d'actions à effectuer lorsqu'une règle est activée.
     102On se borne donc à effectuer l'analyse de syntaxe en s'assurant que les structures
     103grammaticales dÈfinies permettent effectivement d'analyser le fichier ''exemple.vst''.
     104
     105Cette étape vise à analyser le fichier ''signal.ex'', qui ne constitue qu'une
     106partie du fichier ''exemple.vst''. On cherche principalement à traiter
     107le problème général des règles permettant de reconnaître un nombre variable d'arguments
    110108(une liste de signaux dans notre cas).
    111109
    112 \begin{enumerate}
    113 \itemsep=-.5ex
    114 
    115 \item dÈfinir les rËgles de grammaire correspondant ‡ la dÈclaration des signaux VHDL
    116       en analysant le contenu du fichier \texttt{signal.ex} qui vous est fourni,
    117       et implanter ces rËgles dans le fichier vst.y.~;
    118 
    119 \item Dans le fichier vst.y, complÈter la dÈclaration des diffÈrents
    120       token utilisÈs par le parser.
    121       On dÈclarera tous les token susceptibles d'Ítre reconnus par
    122       le scanner.~;
    123 
    124 \item Comme nous n'allons pas effectuer d'actions pour ces
    125       rËgles, nous utiliserons le mode \emph{debug} de bison
    126       pour vÈrifier que l'analyse se passe bien.
    127       Pour activer ce mode, il faut utiliser l'option \texttt{-t} de
    128       bison et positionner la variable \texttt{yydebug} ‡ une
    129       valeur autre que zÈro dans la fonction main()~;
    130 \item Il faut par ailleurs que \texttt{bison} fournisse la liste des
    131       \emph{tokens} ‡ \texttt{flex}. Pour cela, il faut utiliser l'option
    132       \texttt{-d}, pour demander ‡ bison de gÈnËrer un fichier \texttt{vst.tab.h}
    133       contenant ces dÈfinitions.
    134       Il faut donc modifier le fichier vst.l pour qure le fichier
    135       \texttt{vst.tab.h} soit inclus dans le fichier vst.l et supprimer les dÈfinitions
    136       de token existant par ailleurs dans vst.l.
    137 \item il faut Ègalement modifier la fonction \texttt{main}, qui est maintenant dÈfinie
    138       dans le fichier vst.y, et doit appeller la fonction \texttt{yyparse()}.
    139 \end{enumerate}
    140 
    141 Voici une Èbauche du fichier \texttt{vst.y} que vous devez modifier et complÈter:
    142 
    143 %\scriptsize
    144 \begin{verbatim}
     110  1. Définir les règles de grammaire correspondant a la déclaration des signaux en analysant le contenu du fichier ''signal.ex'' qui vous est fourni, et implanter ces règles dans le fichier ''vst.y''.
     111  1. Dans le fichier ''vst.y'', compléter la déclaration des différents token utilisés par le parser susceptibles d'être reconnus par
     112      le scanner.
     113  1. Comme aucune action n'a été associée à chacune des règles de grammaire, vous utiliserez  le mode debug de '''bison''' pour vérifier que l'analyse se passe bien. Pour activer ce mode, il faut utiliser l'option -t sur la ligne de commande de '''bison''' et affecter une valeur non-nulle à la variable globale yydebug dans la fonction main().
     114  1. Il faut par ailleurs que '''bison''' fournisse à '''flex''' la liste des tokens qu'il utilise. Pour cela, il faut utiliser l'option -d dans la ligne de commande de '''bison''', pour lui demander de générer un fichier ''vst.tab.h' contenant ces définitions. Il faut également modifier le fichier ''vst.l'' pour inclure le fichier ''vst.tab.h'' soit inclus dans le fichier ''vst.l'' et supprimer les définitions  de token existantes dans ''vst.l''.
     115  1. Il faut enfin modifier la fonction main(), qui est maintenant définie dans le fichier ''vst.y'', et doit appeller la fonction yyparse().
     116
     117Voici une ébauche du fichier ''vst.y'' que vous devez modifier et compléter:
     118{{{
    145119%{
    146120#include <string.h>
     
    181155   return 0;
    182156}
    183 \end{verbatim}
    184 \normalsize
    185 
    186 Nous rappellons que la compilation s'effectue grosso-modo ainsi,
    187 ‡ charge pour vous d'intÈgrer cela dans le \texttt{Makefile} dÈj‡ constituÈ
    188 pour \texttt{lex}.
    189 Nous vous rappellons que la compilation de \texttt{lex} doit dÈpendre du
    190 fichier d'entÍte gÈnÈrÈ par \texttt{yacc}.
    191 
    192 %\small
    193 %\scriptsize
    194 \begin{verbatim}
     157)))
     158La compilation s'effectue comme suit, à charge pour vous d'intégrer cela dans le Makefile.
     159Nous vous rappellons que la compilation de '''flex''' doit dépendre du fichier d'entête généré par '''bison'''.
     160{{{
    195161bison -t -d vst.y
    196162gcc -Wall -Werror -o parser vst.tab.c vst.yy.c -lfl
    197 \end{verbatim}
    198 \normalsize
    199 
    200 \section*{Etape 4 : suite et fin de l'Ècriture du \emph{parser}}
    201 
    202 L'idÈe est de construire le \emph{parser} de maniËre incrÈmentale.
     163}}}
     164
     165= Etape 4 : Fin de l'écriture de l'analyseur syntaxique =
     166
     167L'idée est de construire l'analyseur de manière incrémentale de maniËre incrÈmentale.
    203168La syntaxe de la dÈclaration des signaux ayant ÈtÈ dÈfinie, vous allez,
    204169dans cet ordre~: