Changes between Version 3 and Version 4 of CaoCourseTme4


Ignore:
Timestamp:
Feb 25, 2007, 7:44:03 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme4

    v3 v4  
    2626
    2727Chaque fois que le scaner reconnait un token, il peut également transmettre au parser
    28 une valeur associée à ce token, en utilisant la variable globale yylval.
     28une valeur associée à ce token, en utilisant la variable globale {{{yylval}}}.
    2929Le type de la valeur associée à un token peut être différent suivant le token
    3030(ce peut être une valeur numérique, ou un pointeur sur chaîne de caractères, ou autre chose).
    3131Il faut donc définir, pour chaque token auquel on souhaite associer une valeur,
    32 le type de la valeur qui sera stockée dans la variable yylval.
     32le type de la valeur qui sera stockée dans la variable {{{yylval}}}.
    3333
    3434Dans cette étape, on ne va pas directement construire la structure de données ''lofig''.
     
    3636permettant d'afficher sur le terminal, en utilisant la fonction printf(), le texte
    3737correspondant aux différentes constructtions grammaticales reconnues.
    38 Dans cette première étape, on se limitera même à afficher les constructions grammaticales
    39 correspondant à la partie {{{entity}}} du fichier analysé. Le but ici est simplement de vérifier
     38On se limitera même à afficher les constructions grammaticales
     39correspondant à la partie {{{entity}}} du fichier analysé, puisque le but est simplement de vérifier
    4040le mécanisme de transmission de valeurs entre le scaner et le parser.
    4141
    4242Il faut pour cela modifier les deux fichiers vst.l et vst.y.
    4343
    44  *  Déterminez quels tokens retournent une valeur significative
    45     (les tokens n'ont pas tous une valeur).  Dans le fichier vst.y, typez
    46     les tokens qui doivent l'être en utilisant la construction
     44 *  Commencez par déterminer quels sont les tokens qui retournent une valeur significative, car les tokens n'ont pas tous besoin de transmettre une valeur. En pratique, il n'y a qu'un type de token qui doit transmettre une valeur. Pour définir le type de la valeur transmise dans le fichier  ''vst.y'', utilisez la construction
    4745{{{
    48 %token
    49     <type> TOKEN
     46%token  <type> TOKEN
    5047}}}
    51  *  On rappelle que pour chaque token reconnu par le scaner, la chaîne de caractères
    52     correspondant à ce token est stockée dans un buffer pointé par la variable
    53     {{{yytext}}}, et que le scanner réutilise ce même buffer pour chaque nouveau token. 
    54     Quand on souhaite que le scanner transmette cette chaîne au parser, il faut que le scanner
    55     recopie cette chaîne de caractères dans un autre buffer et transmette au parser un pointeur sur
    56     ce nouveau buffer. Il faut donc mofifier le fichier vst.l en conséquence.
    57  *  Le type de la variable yylval contenant la valeur du token est défini
    58     dans le fichier vst.y, en utilisant le mot clé {{{%union}}}.
    59     Modifier le fichier vst.y en conséquence.
    60  *  Pour permettre aux différentes règles du parser de communiquer entre elles, il faut également
    61     définir le type de la variable associée à chacune des règles du parser qui renvoient une valeur.
    62     On rappelle que la valeur associée à un token dans une règle est stockée dans la variable {{{$i}}}
    63     (où i est l'index du token dans la règle), et que la valeur du token défini par la règle
    64     (c'est à dire la valeur du membre de gauche) est stockée dans la variable {{{$$}}}.
    65     Modifier le fichier vst.y pour définir le type des token associés aux règles du parser
    66     en utilisant la construction {{{%type <type> règle}}}.
    67  *  Ajouter les affichages, c'est à dire les actions de compilation associées aux règles
    68     qui interviennent dans la partie "entity" du fichier exemple.vst. On
    69     pourra pour cela définir dans le fichier vst.y un objet de type {{{port_t}}},
    70     permettant de représenter un ensemble de ports sous forme de liste chaînée.
    71     Chaque objet {{{port_t}}} comporte un champs "NAME" définissant son nom,
    72     un champs "TYPE" définissant sa direction, et un champs "NEXT" permettant
    73     de construire une liste chaînée.  On introduira dans les règles "port"
    74     et "ports" les actions permettant de construire la liste des ports, et on
    75     utilisera dans la règle "entity" une boucle for pour parcourir cette liste
    76     et afficher les ports.
     48 *  On rappelle que pour chaque token reconnu par le scaner, la chaîne de caractères correspondant à ce token est stockée dans un buffer pointé par la variable {{{yytext}}}, et que le scanner réutilise ce même buffer pour chaque nouveau token. Quand on souhaite que le scanner transmette cette chaîne au parser , il faut que le scanner recopie cette chaîne de caractères dans un '''autre''' buffer et transmette au parser un pointeur sur ce nouveau buffer (dans la variable {{{yylval}}}). Il faut donc mofifier le fichier vst.l en conséquence.
     49 *  Les valeurs transmises dans la variable {{{yylval}}} ont des types différents, qui dépendent du type du token reconnu. On utilise donc une {{{union}}} pour définir le type génétal de la vatiable {{{yylval}}} dans le fichier ''vst.y'',
     50qui doit donc être modifié en conséquence.
     51{{{
     52%union {
     53             char* string;
     54             void* pointer;
     55             int  index;
     56             }
     57}}}
     58 * Pour permettre aux différentes règles du parser de communiquer entre elles, il faut également définir le type de la variable associée à chacune des règles du parser qui renvoient une valeur.  On rappelle que la valeur associée à un token dans une règle est stockée dans la variable {{{$i}}}  (où i est l'index du token dans la règle), et que la valeur du token défini par la règle  (c'est à dire la valeur du membre de gauche) est stockée dans la variable {{{$$}}}. Modifier le fichier vst.y pour définir le type des token associés aux règles du parser en utilisant la construction
     59{{{
     60%type <type> règle
     61}}}.
     62 *  Ajouter enfin les ''actions de compilation'' associées aux règles qui interviennent dans la partie "entity" du fichier exemple.vst.affichages. Pour chaque règle, cette ''action de compilation'' consiste simplement à afficher le texte de la règle en utilisant la fonction printf(). On pourra pour cela définir dans le fichier ''vst.y'' un objet de type {{{port_t}}}, permettant de représenter un ensemble de ports par une liste chaînée. Chaque objet {{{port_t}}} comporte un champs "NAME" définissant son nom, un champs "TYPE" définissant sa direction, et un champs "NEXT" permettant de construire la liste chaînée.  On introduira dans les règles "port" et "ports" les actions permettant de construire la liste des ports, et on utilisera dans la règle "entity" une boucle for pour parcourir cette liste et afficher les ports.
    7763
    78 ''Avertissement : Bison émet un avertissement "type clash on default action" pour certaines
     64'''Avertissement''' : Bison émet un avertissement "type clash on default action" pour certaines
    7965règles, lorsque l'action de compilation n'est pas définie. En effet, il effectue par défaut
    8066l'opération {{{{$$ = $1}}}}, et il proteste lorsque les deux tokens n'ont pas le même type.
     
    169155Il est préférable de changer le nom de la figure avant d'effectuer la sauvegarde,
    170156sans oublier d'utiliser la fonction {{{namealloc}}}.
     157
     158= Compte-Rendu =
     159
     160Vous n'avez pas de compte-rendu écrit à rendre pour ce TME4.
     161Il vous sera demandé une démonstation du parser ''.vst'' vers ''lofig'' au début du TME5.