Changes between Version 4 and Version 5 of CaoCourseTme4


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

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme4

    v4 v5  
    1515dans le TME3 sont achevés et opérationnels.
    1616Vous êtes donc  invités à utiliser vos propres fichiers vst.l et vst.y, mais vous pouvez également
    17 utiliser les fichiers vst.l et vst.y fournis avec ce TME. '''Attention''' : ces fichiers contiennent
     17utiliser les fichiers vst.l et vst.y fournis avec ce TME.
     18
     19 '''Attention''' : ces fichiers contiennent
    1820délibérement quelques erreurs que vous devrez corriger, afin de vous obliger à les comprendre.
    1921
     
    4648%token  <type> TOKEN
    4749}}}
    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'',
    50 qui doit donc être modifié en conséquence.
     50 *  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.
     51 *  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'', qui doit donc être modifié en conséquence.
    5152{{{
    5253%union {
     
    5657             }
    5758}}}
    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 * 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 le membre de droite de 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
    5960{{{
    6061%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.
     62}}}
     63 *  Ajouter enfin les ''actions de compilation'' associées aux règles qui interviennent dans la partie "entity" du fichier ''exemple.vst''. 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.
     64{{{
     65typedef struct port {
     66        struct port     *NEXT;
     67        char               *NAME;
     68        int                  TYPE;
     69        } port_t;
     70}}}
    6371
    64 '''Avertissement''' : Bison émet un avertissement "type clash on default action" pour certaines
    65 règles, lorsque l'action de compilation n'est pas définie. En effet, il effectue par défaut
     72'''Avertissement''' : Bison émet un avertissement "type clash on default action" , lorsque
     73l'action de compilation n'est pas définie. En effet, il effectue par défaut
    6674l'opération {{{{$$ = $1}}}}, et il proteste lorsque les deux tokens n'ont pas le même type.
    6775Il faut définir une action de compilation vide {{{{}}}} pour éviter ce problème.''