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'', |
| 50 | qui 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. |