Changes between Version 14 and Version 15 of CaoCourseTme3


Ignore:
Timestamp:
Feb 17, 2007, 4:20:46 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme3

    v14 v15  
    88
    99L'objectif de ce TME est de vous familiariser avec les outils '''flex''' et '''bison''',
    10 qui 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
    12 syntaxique) pour différents formats de fichiers.
    13 
    14 Vous allez développer un analyseur lexical (scanner), puis un analyseur syntaxique (parser)
     10qui sont des outils de la distribution GNU permettant de générer automatiquement des 
     11analyseurs lexicaux (ou "scanners") et des analyseurs syntaxiques (ou ''parsers'')
     12pour différents formats de fichiers.
     13
     14Vous allez développer un analyseur lexical, puis un analyseur syntaxique
    1515pour 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
     
    2929Le sous-ensemble de VHDL visé permet de décrire des composants possédant des ports
    3030d'entrée/sortie, des signaux, et d'instancier ces composants en les connectants par les signaux.
    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.
     31On fait l'hypothèse que tous les signaux sont de type bit, et il n'est donc pas demandé de traiter
     32les vecteurs de bits.
    3233
    3334Dans ce TME3, on se limitera à l'analyse grammaticale du format''.vst''. La construction effective
     
    107108Validez votre travail en lançant l'analyseur lexical sur les fichiers ''signal.vst'' et ''exemple.vst''.
    108109{{{
    109 $ scanner signal.vst
     110$ scanner ../signal.vst
    110111}}}
    111112
     
    125126  * 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.
    126127  * Lancer cette nouvelle version de l'analyseur lexical sur les fichiers ''exemple.vst'' et ''signal.vst''.
     128{{{
     129$ scanner ../exemple.vst
     130}}}
    127131
    128132= Etape 3 : Analyseur syntaxique =
     
    138142(une liste de signaux dans notre cas).
    139143
    140   1. Définir les règles de grammaire correspondant a la déclaration des signaux en analysant le contenu du fichier ''signal.vst'' qui vous est fourni, et implanter ces règles dans le fichier ''vst.y''. On définira successivement la règle décrivant un signal, puis la règle décrivant une liste de signaux.
    141   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 le scanner.
    142   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().
    143   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''.
    144   1. Il faut enfin modifier la fonction main(), qui est maintenant définie dans le fichier ''vst.y'', et doit appeller la fonction yyparse().
     144  1. Déclarez dans le fichier ''vst.y'', les différents token utilisés par le parser susceptibles d'être reconnus par le scanner.
     145  1. Définissez les deux règles de grammaire correspondant a la déclaration d'une liste de signaux, et implanter ces règles dans le fichier ''vst.y''. On définira successivement la règle décrivant un signal, puis la règle décrivant une liste de signaux. '''Bison''' permet d'associer à chaque règle une "action de compilation" qui est exécutée pendant l'analyse du fichier, au moment ou la règle est reconnue, mais dans cette première étape, on n'associera aucune action aux deux régles définies.
     146  1. La fonction main() est maintenant définie dans le fichier ''vst.y'', et doit appeller la fonction yyparse(). Il faut donc modifier la dernière partie du fichier du fichier ''vst.l'', qui ne contient plus que la définition de la fonction
    145147
    146148Voici une ébauche du fichier ''vst.y'' que vous devez modifier et compléter:
     
    148150%{
    149151#include <string.h>
     152#include <stdlib.h>
    150153#include <stdio.h>
    151154
     
    161164%}
    162165
    163 %token ...
    164 
    165 %%
    166 prod : regle TOKEN
    167      | ...
    168      ;
     166%token ... déclarer ici les differents types de token
     167
     168%%
     169
     170... ecrire ici les règles grammaticales
     171
    169172%%
    170173
     
    185188}
    186189}}}
    187 La compilation s'effectue comme suit, à charge pour vous d'intégrer cela dans le Makefile.
    188 Nous vous rappellons que la compilation de '''flex''' doit dépendre du fichier d'entête généré par '''bison'''.
     190
     191La compilation s'effectue comme suit, à charge pour vous d'intégrer ces commandes dans le Makefile.
     192  * L'option -d sur la ligne de commande de '''bison''' active le mode debug, qui vous permet de suivre le déroulement de l'analyse syntaxique du fichier. Il faut de plus affecter une valeur non-nulle à la variable globale yydebug dans la fonction main().
     193  * L'option -t sur la ligne de commande de '''bison''' demande à '''bison''' de générer un  fichier ''vst.tab.h''. Ce fichier est utilisé par '''flex''', et contient la définition des "tokens" utilisés par '''bison'''. Ce fichier doit être inclus dans l'en-tête du fichier ''vst.l'', et la compilation de '''flex''' doit dépendre de ce fichier ''vst.tab.h'' généré par '''bison'''.
    189194{{{
    190195bison -t -d vst.y
    191196gcc -Wall -Werror -o parser vst.tab.c vst.yy.c -lfl
    192197}}}
     198Validez l'ensemble en lançant l'analyse syntaxique du fichier ''signal.vst'':
     199{{{
     200$ parser ../signal.vst
     201}}}
     202  1. Lancez l'analyse du fichier ''signal.vst'' en utilisant les deux options - t  et -d.N'associez aucune action aux deux règles de grammaire. Utilisez  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().
     203  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 ''v' 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''.
    193204
    194205= Etape 4 : Modification de l'analyseur syntaxique =