Le Mta-Gnrateur MetaGen
Aprs avoir dfini les rgles de transcription, il sagit de les implanter dans un gnrateur
de code. Le rle de ce gnrateur de code est de transcrire la description textuelle du modle
de performance dun systme en un programme VHDL conformment aux rgles de
transcription dcrites dans le chapitre 4. La description textuelle dentre et celle de sortie du
gnrateur dvelopper sont conformes une grammaire. Elles respectent une syntaxe et une
smantique donnes.
Dvelopper un outil pour effectuer cette transformation nest pas une tche facile. Leffort
est encore plus important quand la gnration de code inclut galement une phase de synthse
logicielle ou matrielle. On se limitera dans ce document uniquement la gnration de code,
ce qui signifie que loutil de gnration dvelopper nest pas capable de choisir une solution
dimplantation de lui-mme. Si plusieurs alternatives possibles existent, la solution retenue
sera spcifie dans le modle source ou via linterface utilisateur de loutil. Pour cet objectif,
leffort de dveloppement est fortement dpendant de la syntaxe et la smantique des langages
source et cible et de la complexit des rgles de transformation.
Dans le pass, lquipe MCSE a dj dvelopp trois types de gnrateurs de code pour le
modle fonctionnel de MCSE: un gnrateur de C [CALVEZ-93c], un gnrateur dOCCAM
[PASQUIER-93], un gnrateur de VHDL simulable [BAKOWSKI-92] et synthtisable
[HELLER-92] [CALVEZ-93d]. Ces gnrateurs de code crits en C utilisaient des structures
internes spcifiques. Cette solution dimplantation qui dpendait galement de
lenvironnement graphique SunView ou XMOTIF pour linterface utilisateur sest vite rvle
pnalisante. Elle ntait pas portable. Elle ne facilitait pas la maintenance et la mise jour des
gnrateurs en fonction des modifications de la grammaire de la spcification dentre ou de
celles des rgles de transcription.
Afin dobtenir des outils multi plate-formes et plus faciles dvelopper, maintenir et
enrichir, lquipe MCSE sest alors intresse la technologie mta-case et en particulier
loutil GraphTalk pour ldition de graphes et loutil LEdit pour la gnration de code. Cette
M.C.S.E
133
Chapitre 5
approche a galement t abandonne. Lexplication de cette abandon est donne en dbut de
chapitre. Mais cette exprience et en particulier le travail effectu sur la gnration de code
avec LEdit a amen lquipe MCSE revoir entirement sa stratgie de dveloppement des
outils dont les gnrateurs de code comme support pour la mthodologie MCSE. La
prsentation de la nouvelle philosophie de dveloppement de la plate-forme MCSE montre
quelle repose sur les concepts danalyseurs syntaxiques et de mta-structure.
Ces deux concepts nous ont permis de dvelopper un principe gnrique de gnration de
code prsent dans ce chapitre et exploit pour implanter de nouveaux gnrateurs de code
ayant comme spcification dentre le modle de performance de MCSE dcrit dans le chapitre
3. Un analyseur syntaxique est obtenu partir de la spcification de la grammaire du langage
concern. Si la spcification de la grammaire est enrichie de rgles de production, alors elle
peut engendrer la structure de donnes interne image du texte analys. La structure interne
obtenue partir dun fichier texte est le coeur des gnrateurs. Pour que ceux-ci aient une
architecture commune, nous avons dfini un modle gnrique de modle de structure de
donnes. Aprs avoir analys la spcification dune grammaire, nous prsentons dans ce
chapitre ce modle gnrique appel par la suite mta-structure ainsi que larchitecture
commune des gnrateurs.
Le principe de gnration de code qui est ensuite dcrit repose galement sur le concept de
template qui est un fichier contenant toutes les constructions en langage cible ncessaires la
transcription. Pour un gnrateur donn, le fichier source et un fichier template sont analyss,
puis les oprations de manipulation des structures de donnes rsultantes sont excutes pour
raliser la transcription. Pour avoir un gnrateur facilement reconfigurable, nous avons dcid
de dcrire les oprations de manipulation de structures de donnes dans un langage interprt
nomm Script. La syntaxe et les constructions de ce langage ddi la manipulation de
structure de donnes sont dfinies. Cette dfinition sert par la suite linterprtation de
limplantation du gnrateur de code VHDL qui fait lobjet du chapitre 6.
Une fois saisi, le Script est interprt ou transcrit en code JAVA par un programme dont
limplantation en Java est dcrite laide du modle statique de la mthode OMT-UML. Ce
programme nomm MetaGen est donc un gnrateur de gnrateurs de code ou mtagnrateur.
5.1 LA TECHNOLOGIE META-CASE
De 1993 1996, le dveloppement de la plate-forme MCSE a repos sur lutilisation dun
mta-outil orient diteur de graphes (GRAPHTALK) et dun mta-outil orient diteur
syntaxique (LEdit). La mise en oeuvre dun outil CASHE (Computer Aided Software
Hardware Engineering) pour une mthodologie laide de la technologie mta-Case est
normalement rduite la dclaration du formalisme de ses modles. Les mta-outils
permettent, en effet, de se focaliser sur la mthode et la smantique des modles plutt que sur
des aspects bas niveau tels que lintgration doutils, la gestion dune base de donnes et
lenvironnement graphique.
Loutil GraphTalk tait sduisant pour au moins 4 raisons. Il est multi plate-formes (PC,
UNIX). Il est construit autour dune base de donnes oriente objet. Les spcifications des
modles sont saisies graphiquement et loutil permet dadopter une dmarche incrmentale
facilitant le prototypage. La spcification graphique du mta-modle fournit un bon support
pour la documentation et le suivi du dveloppement de loutil.
134
M.C.S.E
Le Mta-Gnrateur MetaGen
Malheureusement, lutilisation de GraphTalk a rvl progressivement un certain nombre
de limitations:
- les concepts de mta-modlisation sont trop limits pour dcrire compltement le
modle MCSE et il fallait crire de plus en plus de code C (API C) pour dfinir des
dmons et actions sur les objets du mta-modle. Au fur mesure de limplantation, on
perdait en efficacit (interprtation des dmons) et en facilits de prototypage.
- la personnalisation de linterface utilisateur est trs limite.
- il ny a quasiment plus de maintenance et dvolubilit des outils GraphTalk et LEdit
alors que ceux-ci sont pourtant fortement "buggs".
- lutilisation ncessite de payer un "runtime" par machine.
Lutilisation des mta-outils GraphTalk/LEdit a conduit une impasse. Pour compenser
leurs limites, lquipe devait dpenser de plus en plus defforts alors que les rsultats ne
pouvaient tre que mdiocres, non propritaires et sans perspective dvolution.
Cependant, lexprience de gnration de code avec LEdit qui est une encapsulation de
Lex&Yacc a permis dapprhender les concepts des gnrateurs danalyseurs syntaxiques et de
mta-structure sur lesquels repose entirement la nouvelle "philosophie" de dveloppement des
outils MCSE. Avec lexprience de la technologie mta-Case, lquipe a galement pris
conscience que le succs du dveloppement dun outil CASHE repose essentiellement sur la
gnricit et lvolubilit de la structure des donnes internes aux outils. Dbut 1997, lquipe
a donc rflchi une autre orientation.
5.2 NOUVELLE STRATEGIE DE DEVELOPPEMENT DES OUTILS
Il est usuel de constater que dans la plupart des outils CASHE actuels le couplage de
donnes entre outils est bas sur un change par fichiers et non sur lutilisation dune base de
donnes pour des raisons defficacit et dindpendance. Sur la base de ce constat, lquipe a
donc dcid de dvelopper une nouvelle plate-forme doutils base sur un couplage possible
entre outils par fichiers. Dans ce contexte, comme le montre la figure 5.1, chaque outil de la
plate-forme peut tre implant sous la forme dune architecture gnrique base sur trois
fonctions principales:
- la fonction Load qui permet de crer la structure de donnes partir du fichier texte,
- la fonction Save qui est la rciproque de la fonction Load et qui consiste parcourir la
structure de donnes et exploiter la grammaire correspondante pour gnrer un fichier
texte,
- la fonction Transformations qui est spcifique loutil et qui dfinit les manipulations
effectues sur la structure de donne charge.
Outil
Transformations
Sauvegarde/ Restitution
sur disque
Load
Texte en entre
Grammaire dfinissant la
syntaxe du texte en entre
Save
Texte rsultat
135
Chapitre 5
Cette approche ncessite de rsoudre deux problmes:
- La lecture dun texte et sa conversion en une structure de donnes (Load) et lopration
inverse (Save). Pour rsoudre ce problme, nous sommes partis du principe que toute
structure de donnes peut tre engendre dune manire automatique par un analyseur
syntaxique enrichi des rgles de production de la structure de donnes. Cet analyseur
syntaxique est obtenu par un gnrateur danalyseur syntaxique partir de la
spcification de la grammaire (syntaxe dentre du texte source) et des rgles de
production. Pour avoir un principe de cration de la structure de donnes indpendant
de la grammaire, nous avons dfini pour la spcification des rgles de production un
modle de modle de structure de donnes ou mta-structure bas sur la composition de
trois constructions de noeuds: le record ou ensemble fini dlments, lalternative et la
liste. Ce principe est prsent en dtail dans le paragraphe 5.4. Lutilisation de cette
technique permet de rpondre aux critres de gnricit et dvolubilit des structures
de donnes internes aux outils considrs indispensables pour le succs du
dveloppement de la plate-forme doutils. Pour faire voluer la structure de donnes, il
suffit en effet de modifier la grammaire et de regnrer lanalyseur syntaxique associ.
La fonction Save qui correspond un parcours ordonn de la structure de donnes
interne et lexploitation de la grammaire pour le formatage du texte de sortie ne pose
pas de difficults particulires dimplantation.
- la sauvegarde et restitution dune structure de donnes sur disque sans contrainte de
format, ce qui se rsoud bien avec le concept dobjets persistants. Ce problme est
rsolu implicitement par le choix dimplantation des outils en Java qui dispose en
standard (JDK 1.1) de la srialisation/dsrialisation dobjets.
5.3 ANALYSE DUNE GRAMMAIRE
Le fichier dentre dun outil respecte une syntaxe donne. La syntaxe accepte se dcrit
par une grammaire. Une grammaire se dcrit elle-mme selon une grammaire qui est alors
appele mta-grammaire. Un analyseur syntaxique est une fonction charge de vrifier quun
texte donn en entre respecte une grammaire donne. Si lanalyseur syntaxique est enrichi par
des rgles de production ou actions, il est alors mme de produire directement quelque chose
en sortie. Nous sommes ici intresss par la production de la structure de donnes interne
quivalente au texte analys et la fonction inverse pour la production de texte de manire
disposer dune fonction bi-univoque texte <-> structure de donnes.
5.3.1 Dfinition dune grammaire
Une grammaire est un ensemble fini de rgles de la forme "cot gauche ::= cot droit" o
le cot gauche reprsente un symbole non terminal et le cot droit est un ensemble
ventuellement vide de symboles non terminaux et terminaux. Les symboles terminaux
reprsentent les mots cls et les expressions rgulires (identificateurs, nombre, etc).
Pour la comprhension de la technique employe par un gnrateur danalyseur syntaxique,
nous commenons par prsenter quelques rgles de grammaire pour un exemple trs simple.
Le texte suivant constitue un ensemble de rgles de grammaire crites selon la norme BNF
(Backus Naur Form).
136
M.C.S.E
Le Mta-Gnrateur MetaGen
ComponentDescription ::= <Component> [Range] Name [GenericParameters]
Parameters ";" [Attributes] ComponentDef <EndComponent>
Range ::= "[" Indice ":" Indice "]"
GenericParameters ::= Generic Name {"," Name }
Parameters ::= "(" {Parameter";"} ")"
ComponentDef ::= StructureDef | BehaviorDef
La signification de la notation pour interprter les rgles est la suivante:
- <Component> et "(" sont des symboles terminaux (directement prsents dans le texte).
Les autres noms (GenericParameters, Parameters, etc.) sont appels symboles nonterminaux et doivent tre dfinis par des rgles de grammaire.
- ::= dfinit une rgle de grammaire. La partie gauche est rgie selon la description
droite.
- Y ::= A B C veut dire que le texte doit comporter A puis B puis C.
- Y ::= A | B | C veut dire que le texte comprend A ou B ou C (Ou exclusif)
- Y ::= [ A ] veut dire que A est optionnel.
- Y ::= { A } veut dire quil sagit dune suite de longueur quelconque de A, la suite
pouvant tre vide.
5.3.2 Structure de donnes pour une grammaire
La figure suivante montre les rgles de grammaire ci-dessus, mais cette fois reprsentes
sous une forme graphique. La notation graphique est celle recommande par la mthodologie
MCSE pour la structuration des donnes [CALVEZ-90].
ComponentDescription
"<Component>"
"<EndComponent>"
ComponentDef
Name
0:1
0:1
Parameters
GenericParameters
Range
0:1
")"
"("
ListeParam
"Generic"
1:1
";"
0:n
Attributes
StructureDef
BehaviorDef
"]"
"["l
ListeName
Indice
Indice
":"
Name
0:n
";"
","
Parameter
Name
137
Chapitre 5
La notation graphique utilise ici 3 types de symboles:
- Le rectangle qui contient un identificateur ou une valeur (symbole terminal),
- Un rond qui signifie le produit cartsien et qui veut aussi dire la composition de tous les
champs qui en partent. Cest lquivalent dun record. Un champ peut tre un mot cl,
une valeur ou identificateur, la dsignation dun autre noeud de la structure.
- Un demi-rond pour lensemble qui signifie le regroupement dune collection
dlments. Un ensemble peut tre vide ou non, peut aussi tre born. Dans ce dernier
cas, les 2 nombres dans le symbole indiquent la borne minimale et la borne maximale.
Sur la base de cette notation, la structure de donnes devient plus lisible. La premire rgle
de grammaire textuelle de lexemple se traduit par le rond ComponentDescription. Comme
Range est optionnel, on utilise le symbole ensemble (0:1) pour reprsenter lalternative: Range
ou absence de Range. On retrouve la mme notation pour les paramtres gnriques. La
notation 0:n pour ListeName et ListeParam indique une suite vide ou de longueur quelconque.
La notation 1:1 reprsente lalternative des cas possibles. Une seule doit exister. Cest le cas
pour ComponentDef.
A noter que dans le cas dune rcursivit, la structure de donnes est arrte ds la rencontre
dun symbole non-terminal dj dfini au pralable.
On peut conclure que tout texte respectant une grammaire peut se dcrire sous la forme
dune structure de donnes construite sur la base des 2 oprateurs: composition et ensemble.
5.3.3 Structure de donnes pour une solution
Considrons maintenant un texte respectant les rgles de grammaire ci-dessus. Un exemple
est donn ci-aprs.
<Component> [1:k] F1 Generic n, k ( E; S;)
<Structure>
.........
<EndComponent>
Intressons-nous sa reprsentation possible sous la forme dune structure de donnes en
exploitant la mme notation que prcdemment.
La structure de donnes de lexemple reprsente par la figure suivante montre la
disparition des ensembles 0:1, 1:1. Ceci sexplique par le fait que lalternative reprsente par
lensemble 0:1 se trouve maintenant spcifi pour un texte donn. On trouve par exemple ici
Range avec sa dfinition. En labsence de Range, le lien pointe sur Nil (qui veut dire vide). Pour
un ensemble 1:1, on trouve le noeud correspondant au cas reprsent dans le texte (ici
StructureDef).
Les noeuds de composition se retrouvent intgralement dans la solution. Dans le cas dune
rcursivit, la structure de donnes est prolonge. En effet, si un composant contient un autre
composant, on doit retrouver la structure de donnes de cet autre composant (diffrence
138
M.C.S.E
Le Mta-Gnrateur MetaGen
essentielle par rapport la structure de donnes de la grammaire). Le cas est reprsent par la
figure 5.3 pour le noeud StructureDef qui inclut des composants dfinis par le noeud
ComponentDescription.
ComponentDescription
"<EndComponent>"
"<Component>"
StructureDef
Range
Parameters
F1
"Generic"
"<Structure>"
Indice
":"
Indice
")"
"("
"]"
"["l
ListeParam
ListeName
n
........
ComponentDescription
0:n
0:n
";"
","
k
Parameter
139
Chapitre 5
La troisime colonne donne une implmentation approprie pour chaque type de noeud.
Ainsi une grammaire peut se reprsenter en interne sur la base de records. Le premier champ
indique le type. Le deuxime champ indique le nombre de symboles qui suivent, sauf sil un
seul existe.
Rgles BNF
notation MetaDs
NodeDs
Type
NextFriend
Y
A
Record Y
m
B
C
B
Y ::= A | B | C...
Modle Ds
XDs
Y Record
n
A
B
Y ::= A B C...
MetaDs
1:1
Father
Set11
n
A
B
A ou B ou C
Reserved
FieldNb
B
Y ::= [A]
0:1
Set01
A
B
Nil
Record A
A
Y ::= A {A}
1:n
Set1n
A
Value
A
A
Y ::= {A}
Y
0:n
Nil
Node
Node
Y
ou
Set0n
A
ID
Nil
Key
A
ID dans HashTable
-Figure 5.4- Correspondances entre les rgles BNF et les modles de structure de donnes.
Les trois premires colonnes du tableau dfinissent ainsi la mta-grammaire et la mtastructure pour spcifier toute grammaire et la construction de structure quivalente. La
transformation des rgles textuelles dune grammaire donne une structure de donnes appele
GrammarDs conforme la notation MetaDs construite sur la base des rgles qui viennent dtre
dfinies.
Intressons-nous maintenant la structure de donnes qui doit tre construite par la
fonction Loader lors de la reconnaissance dun texte. La quatrime colonne reprsente la
notation de la structure de donnes pour une solution tandis que la cinquime colonne montre
une solution pour limplmentation.
Pour un noeud de composition, la notation est identique celle de la grammaire, mais
limplantation diffre. Pour des raisons doptimisation de la structure, seuls les champs nonterminaux sont placs dans le record (pour lexemple, A est considr ici comme symbole
terminal). En effet, comme les champs terminaux sont constants, il ne sert donc rien de les
dupliquer dans ce record car leur existence et valeur sont dfinies dans la GrammarDs. Ainsi,
linterprtation de la structure de donnes pour tout texte se fera laide de la GrammarDs.
Pour cette raison, on ne trouve dans un noeud de composition que des rfrences vers dautres
noeuds.
Lors dune alternative Set1:1, on trouve la notation alternative. Pour une solution donne,
lalternative disparat car llment concern est fix dans le texte. Le cas est alors dfini par
le type de record (ici A ou B ou C...). Ainsi lensemble disparat dans la structure XDs. Si la
140
M.C.S.E
Le Mta-Gnrateur MetaGen
structure doit pouvoir se modifier par un diteur syntaxique par exemple, les alternatives
possibles sont connues par lanalyse du noeud de la GrammarDs qui indique les possibilits par
le Set 1:1.
Pour lalternative Set 0:1, on trouve les 2 possibilits: absence ou symbole A.
Limplantation est immdiate. Une rfrence Nil indique la non-existence de loption. Dans le
cas contraire on y trouve la rfrence du noeud.
Les ensembles Set 1:n et Set 0:n se retrouvent dans la structure. Elles sont implantables
comme une liste chane des noeuds composant cet ensemble. Si lensemble est vide, alors la
rfrence est Nil.
Il ressort de cette analyse que toute structure XDs peut se construire sur la base dun modle
de noeud appel ici NodeDs. Le modle est reprsent dans la dernire colonne. Chaque noeud
est identifiable par son type qui est le mme que le noeud quivalent dans la GrammarDs. On
trouve ensuite les champs:
- NextFriend pour permettre son inclusion dans une liste et donc dans un ensemble,
- Father pour tre capable de remonter la structure,
- Reserved pour des utilisations ultrieures,
- FieldNb qui dfinit le nombre de rfrences qui suivent. Ces rfrences dsignent
obligatoirement des noeuds non-terminaux. Elles sont dfinies dans le noeud du mme
type de la GrammarDs.
- Chaque rfrence dsigne 4 cas possibles: vide, un autre noeud, une valeur, un
identificateur.
Une valeur peut tre un boolen, un entier ou un flottant. Un identificateur est une chane
de caractres. Si un accs par le nom est souhait, une hashtable pour la mmorisation des
identificateurs peut tre approprie. Mais il faut faire trs attention la porte des
identificateurs. Ce point essentiel conduit un ensemble de hashtables et pas uniquement une
seule.
En conclusion, tout texte source conforme un langage X est reprsent par une structure
de donnes XDs dont la signification est fournie par une structure de donne XGrammarDs qui
est la transcription des rgles de grammaire textuelles de X.
5.5 GENERATION DU LOADER
Lobjectif est de disposer dun programme Loader capable de transformer tout texte MCSE
conforme aux rgles de grammaire du modle MCSE en une structure de donnes McseDs et
un ensemble de tables des identificateurs. Une qualit essentielle du loader est son aptitude
pouvoir sadapter toute modification de la grammaire. Cette technique doit donc aussi
pouvoir semployer pour toutes autres grammaires telles que C et VHDL par exemple.
Le loader souhait est en fait un parser (analyseur syntaxique). Le terme parser inclut ici
tout dabord un analyseur lexical pour identifier les tokens successifs et les prsenter
lanalyseur syntaxique. La figure 5.5 explique la technique dite du "bootstrapping" que nous
avons utilise pour engendrer le parser souhait.
Le loader est en fait ralis par un programme dnomm MCSE-Parser. Il exploite en entre
tout texte MCSE pour lanalyser avec laide de la structure MCSEGrammarDS et de la table
des symboles associe de la grammaire du modle MCSE. La MCSEGrammarDs et la table
M.C.S.E
141
Chapitre 5
des symboles sont des classes dobjets fixes (statiques) pour une grammaire donne intgres
au programme MCSE-Parser lors de sa compilation pour disposer dune version excutable.
Cette compilation ne doit se faire que lors dune modification de grammaire.
Il faut bien comprendre que le programme MCSE-Parser contient, en plus des tables de
reconnaissance du texte, les procdures ou mthodes appropries de production des noeuds de
la structure de donnes McseDs. La question intressante est: comment engendrer
automatiquement ce programme?
La figure suivante fournit la rponse.
Grammaire modle MCSE
Mta-grammaire
+rgles de
production de la MetaDs
et de la table des
mta-symboles
Meta-Parser
+rgles de
production de la GrammarDs
et de la table des
symboles
Grammar-Parser
Texte MCSE
MCSE-Parser
McseDs
Tables des
Identificateurs
MetaDs
Table des
symboles
MCSEGrammarDs
Table des
symboles
Loader
M.C.S.E
Le Mta-Gnrateur MetaGen
les classes MCSEGrammarDs et MCSE-Parser. Lexcution de lobjet MCSE-Parser produit
des instances des objets de la classe MCSEGrammarDs pour reprsenter une solution de
description.
Lintrt essentiel de cette technique est son volutivit. Un changement souhait de la
structure interne McseDs se traduit par une modification de la grammaire du modle MCSE ou
par une modification de la MCSEGrammarDs ou par une modification des rgles de
production. Un nouveau loader est engendr par exploitation de Grammar-Parser.
Ce rsultat a t obtenu grce lutilisation dun classe java disponible sur le web ralisant
la fonction de Meta-Parser [HUDSON-96].
5.6 STRUCTURE INTERNE GENERIQUE DE CHAQUE OUTIL
La technique de chargement du modle MCSE tant matrise, il sagit de complter
lorganisation autour de la structure de donnes McseDs ncessaire pour chaque outil.
Il est clair maintenant que la structure de donnes interne est lquivalent du texte source
McseModel. Le texte est indispensable car il peut se lire et se mmoriser sous la forme de
fichier. La structure de donnes en interne est aussi indispensable car cest la seule forme
exploitable efficacement par des programmes.
Disposant de la fonction Load, il faut aussi la fonction inverse appele Save. De plus pour
pouvoir modifier la structure interne, lenrichir par exemple, il faut ajouter une fonction Edit.
McseDs
McseModel
McseModel
Save
Load
Edit
Affichage
Selection
143
Chapitre 5
La fonction Edit peut avoir un rle vari. Un premier rle est la modification de la structure
par une dition textuelle assiste par la syntaxe. Un deuxime rle est la modification de la
structure par une dition graphique assiste. Un autre catgorie de rle est la transformation
automatique ou assiste de la structure. Ce type de rle permet dentrevoir des possibilits
intressantes par exemple pour la ralisation de gnrateurs de solutions et de code.
5.7 PRINCIPE DE GENERATION DE CODE
Le principe de gnration de code retenu est dexploiter la structure de donnes
quivalente dun fichier template (ou fichier modle) crit dans le langage cible not ici X. Le
contenu de ce fichier template va comprendre toutes les constructions qui vont se retrouves
dans le programme cible. Chaque construction sera dfinie sous sa forme la plus complte et
uniquement une fois. Un tel template permet alors de disposer en interne de la structure
XGrammarDs, la table des symboles et la structure de donnes XTemplateDs pour toute
production dune structure reprsentative du code de sortie.
Ainsi, la production dun programme ou dun texte selon un langage cible ncessite de
disposer de sa grammaire. Connaissant la grammaire, on peut alors disposer dun analyseur
syntaxique capable danalyser un texte modle et de produire la structure de donnes interne
quivalente. Pour la comprhension de la mthode utilise, nous commenons par une analyse
des textes source et rsultat voulu pour en dduire ce que doit tre un template.
5.7.1 Analyse des textes source et rsultat
Pour comprendre le principe de gnration bas sur lemploi dun template, considrons
tout dabord une trs petite partie dun exemple de modle MCSE et du programme VHDL
correspondant.
-A- Description du modle MCSE
Ce modle contient la description dun systme dcrit sous la forme dune structure qui elle
mme contient 2 ports et une fonction. Le port Cmd est un vecteur. La fonction Emission est
multiple. Sa description est dcrite par un comportement.
<Component> Serveur Generic n, k ( In Mess E: DefE; Out Var S: DefS;)
<Structure> Modele1;
<Port> [1:k] Cmd : DefCmd;
Rep
Emission[1:n]
<Port> Rep: DefRep;
<Component> [1:n] Emission
(Out Mess Cmd[] : DefCmd;);
<Attributes>
Id=meIndex;
Cmd[]Id = meIndex;
*
Size=5;
Cmd[]Size = 5;
TprodTime = 0;
<Behavior> Modele2;
TprodTime=0;
Emission::{Tprod&!Cmd[]}*;
Tprod
Cmd[1:k]
<EndBehavior>
<EndComponent>
Cmd[]
<EndStructure>
<EndComponent>
Emission
a) Reprsentation textuelle
Modle1
b) Reprsentation graphique
M.C.S.E
Le Mta-Gnrateur MetaGen
-B- Rsultat VHDL souhait
Compte tenu du chapitre 4, la traduction souhaite pour avoir un modle VHDL noninterprt est la suivante.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
LIBRARY STANDARD;
USE STANDARD.TEXTIO.all;
LIBRARY ServeurLibrary;
USE ServeurLibrary.ServeurDeclaration.all;
ENTITY Serveur IS
GENERIC (
n : INTEGER := 1;
k : INTEGER := 1);
PORT (
SIGNAL E: IN DefE;
SIGNAL S: OUT DefS;);
END Serveur;
ARCHITECTURE behavioral OF Serveur IS
FOR all : PortObject
USE ENTITY Library.PortObject (behavioral);
..............................
SIGNAL CmdInputAccesses : DefPortInVector(1 TO n);
ALIAS EmissionCmd : DefPortInVector(1 TO n) IS CmdInputAccesses(1 TO n);
SIGNAL CmdNumberOfCurrentAccesses : DefNaturalVector(1 TO n);
SIGNAL CmdNumberOfMessagesInPort : DefNaturalVector(1 TO n);
BEGIN
-- Instanciation des ports Cmd[1:k] et Rep
MultipleCmd :
FOR i IN 1 TO k GENERATE
Cmd :
COMPONENT PortObject
GENERIC MAP (NbUsersInput =>1,
NbUsersOutput =>1,
policy =>Fifo,
concurrency =>1,
capacity =>1,
WriteTime =>NullTime,
ReadTime =>NullTime)
PORT MAP (InputAccesses (1) =>CmdInputAccesses (i),
OutputAccesses (1) =>CmdOutputAccesses (i),
NumberOfCurrentAccesses =>CmdNumberOfCurrentAccesses (i),
NumberOfMessagesInPort =>CmdNumberOfMessagesInPort (i));
END GENERATE MultipleCmd;
Rep :
COMPONENT PortObject
GENERIC MAP (NbUsersInput =>1,
NbUsersOutput =>1,
policy =>Fifo,
concurrency =>1,
capacity =>1,
WriteTime =>NullTime,
ReadTime =>NullTime)
PORT MAP (InputAccesses (1) =>RepInputAccesses (1),
OutputAccesses (1) =>RepOutputAccesses (1),
NumberOfCurrentAccesses =>RepNumberOfCurrentAccesses (1),
NumberOfMessagesInPort =>RepNumberOfMessagesInPort (1));
-- Instanciation des fonctions
MultipleEmission :
BLOCK
PORT (Cmd : OUT DefPortInVector(1 TO n));
PORT MAP (Cmd => EmissionCmd);
BEGIN
MultipleInstantiationEmission :
M.C.S.E
145
Chapitre 5
FOR i IN 1 TO n GENERATE
Emission :
BLOCK
PORT (Cmd : OUT DefPortIn);
PORT MAP (Cmd => Cmd (i));
CONSTANT me : INTEGER := i;
BEGIN
EmissionBehavior : PROCESS
CONSTANT TprodTime : TIME := 0;
VARIABLE InfoCmd : DefTprod;
BEGIN
LOOP
Delay (TprodTime);
InfoCmd.Id := me;
InfoCmd.Size := 5;
Send (Cmd, InfoCmd, NullTime, 0, now);
END LOOP;
END PROCESS EmissionBehavior;
END BLOCK Emission;
END GENERATE MultipleInstantiationEmission;
END BLOCK Serveur;
END behavioral;
Le programme commence par des dclarations fixes. On trouve ensuite la librairie utilise
puis la dclaration de lentit. La partie Architecture contient la dclaration de signaux et alias
ncessaires pour les ports. On trouve ensuite linstanciation de composants PortObject pour les
ports Cmd et Rep. Le port multiple Cmd exploite linstruction VHDL Generate.
On trouve pour finir linstanciation de la fonction multiple Emission. Celle-ci est dcrite
comme un block avec ses entres et sorties. Linstanciation multiple sobtient aussi par
linstruction Generate. Le corps de la fonction possde un comportement squentiel. Un
process est utilis cet effet. On trouve dans ce process les instructions reprsentant le
comportement.
Pour cette description, nous avons mis en gras les mots qui sont spcifiques de lexemple.
On peut de cette manire comprendre aisment lide du template. Ainsi, si on considre la
transcription du port Cmd[1:k], il faut produire toutes les lignes comprises entre
"MultipleCmd" et "END GENERATE MultipleCmd;". Il faut au pralable ajouter 3 signaux
et un alias. Il en est de mme pour linstanciation dune fonction dcrite par un comportement.
Toute
la
structure
entre
"MultipleEmission"
et
"END
GENERATE
MultipleInstantiationEmission;" doit tre reproduite pour chaque fonction. Ladaptation porte
alors sur certains champs: uniquement le nom Cmd pour le port.
5.7.2 Le concept de fichier Template
La description suivante correspond au template possible pour produire le programme
prcdent. Les lettres en gras sont X pour une chane de caractres, un N pour un nombre. Dans
ce template certains champs alternatifs (par exemple IN, OUT ou INOUT) sont aussi indfinis.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
LIBRARY STANDARD;
USE STANDARD.TEXTIO.all;
LIBRARY XLibrary;
USE XLibrary.XDeclaration.all;
ENTITY X IS
GENERIC (X : INTEGER := N;);
146
M.C.S.E
Le Mta-Gnrateur MetaGen
PORT (SIGNAL X: X X;);
/*Choix entre IN, OUT, INOUT*/
END X;
ARCHITECTURE behavioral OF X IS
FOR all : PortObject
USE ENTITY Library.PortObject (behavioral);
..............................
SIGNAL XInputAccesses : DefPortInVector(1 TO N);
ALIAS X : DefPortInVector(1 TO N) IS XInputAccesses(1 TO N);
SIGNAL XNumberOfCurrentAccesses : DefNaturalVector(1 TO N);
SIGNAL XNumberOfMessagesInPort : DefNaturalVector(1 TO N);
BEGIN
-- Instanciation dun port
MultipleX :
FOR i IN 1 TO N GENERATE
X :
COMPONENT PortObject
GENERIC MAP (NbUsersInput =>1,
NbUsersOutput =>1,
policy =>Fifo,
concurrency =>1,
capacity =>1,
WriteTime =>NullTime,
ReadTime =>NullTime)
PORT MAP (InputAccesses (1) => XInputAccesses (i),
OutputAccesses (1) => XOutputAccesses (i),
NumberOfCurrentAccesses => XNumberOfCurrentAccesses (i),
NumberOfMessagesInPort => XNumberOfMessagesInPort (i));
END GENERATE MultipleX;
-- Instanciation dune fonction
MultipleX :
BLOCK
PORT (X : X DefPortInVector(1 TO N));
/* X vaut IN, OUT, INOUT*/
PORT MAP (X => X);
BEGIN
MultipleInstantiationX :
FOR i IN 1 TO N GENERATE
X :
BLOCK
PORT (X : X DefPortIn);
PORT MAP (X => X (i));
CONSTANT me : INTEGER := i;
BEGIN
XBehavior : PROCESS
CONSTANT XTime : TIME := N;
VARIABLE InfoX: X;
BEGIN
LOOP
Delay (XTime);
InfoX.X := X;
Send (X, InfoX, NullTime, 0, now);
END LOOP;
END PROCESS XBehavior;
END BLOCK X;
END GENERATE MultipleInstantiationX;
END BLOCK X;
END behavioral;
Ce template nest bien sr pas exhaustif pour la gnration dun programme VHDL noninterprt complet. Il est ici simplement considr suffisant pour lexemple. Il ne sert donc qu
illustrer la mthode utilise.
M.C.S.E
147
Chapitre 5
Il est ais de comprendre que, par exemple, la cration de chaque port ou chaque fonction
va ncessiter la copie des lignes de VHDL du template pour chaque lment. Il faut ensuite
assurer la mise jour, par exemple modifier le nom X en Cmd. Un port simple ou une fonction
simple se dduit dun lment multiple par simplification. Ceci est mis en vidence dans le
paragraphe suivant.
Pour faciliter la production, un template doit contenir la description la plus complexe. Toute
copie du modle est alors ajuste par changement de valeurs et par limination des parties nonutiles.
5.7.3 Analyse des structures de donnes
Pour comprendre la technique de gnration, la figure suivante reprsente (partiellement)
la structure de donnes du modle MCSE de lexemple ci-dessus et la structure de donnes du
template VHDL.
VHDLProgram
Declarations
MCSEModelDescription
EntityDeclaration
ComponentDescription
Entity
<Component>
(Nil) Range
Architecture
<EndComponent>
"Architecture"
Architec.
Serveur
Interface
Attributes
(Nil)
";"
StatementPart
<Structure>
0:n
Modele1
InputOuputs
GenericParameters
"("
0:n
<EndStructure>
";"
Attributes
"Generic"
End Architecture
Relations
Declarations
StructureDef
")"
BlockDef
RelationDescription
StructureDescription
Relation
Declarations
Multiple
1:n
Block
EndGenerate
ForGenerate
n
ComponentInstance
ComponentDescription
NextList
<Component>
0:n
0:n
Block
([1:n]) Range
Block
<EndComponent>
NextName
Emission
InputOutput
EndBlock
"Block"
Interface
(Out Mess Cmd[]:...;)
","
Block
Attributes
(Id, Size, Time)
1:1
*BlockDef
1:n
BehaviorDef
<Port> Rep
Behavior
<Behavior>
RelationDescription
<EndBehavior>
Modele2
0:n
";"
BehaviorDefinition
<Port>
Attributes
Process
<EndRelation>
1:n
BehaviorInstance
TypedRelationDef
Process
";"
Attributes
(Nil)
";"
([1:k])Range
Statements
ActivityDef
DefCmd
Cmd
*NameList
(Nil)
":"
EndProcess
"Process"
"::"
Emission
Stat
If
Send
Case
M.C.S.E
Le Mta-Gnrateur MetaGen
La dmarche de gnration peut tre la suivante:
1- Copie de la structure complte du template comme structure du programme de sortie.
2- Mise jour du champ Declarations en remplaant X par Serveur.
3- Mise jour du champ EntityDeclaration en utilisant le nom Serveur puis en crant les
paramtres gnriques et entres/sorties par exploitation de la structure Interface de
MCSE.
4- Larchitecture est ensuite mise jour par le nom du modle (Modele1) et le nom du
composant Serveur.
5- Il sagit ensuite de crer autant de relations que dans le modle MCSE avec mise jour
des noms X pour les signaux et alias de chaque relation. Si une relation nest pas
multiple, il faut supprimer la structure Generate, ce qui se fait simplement par
limination du noeud MultipleBlock (idem la dclaration des composants).
6- La dfinition de blockDef est ensuite mise jour pour linstanciation de n blocs
Emission. Il sagit de modifier la valeur n, le nom du block, de crer ses entres et sorties
conformment la dclaration de linterface de Emission dans le modle MCSE. Si le
composant nest pas multiple, il suffit de dtruire le noeud MultipleBlock (lien en
pointill sur la figure).
7- Il faut ensuite assurer la mise jour de la partie comportementale (Behavior). Le process
est mis jour compte-tenu de la dclaration du comportement par ActivityDef. Si
plusieurs process sont ncessaires, chacun est cr limage du process dans le
template.
8- il suffit ensuite de transcrire la structure sous forme textuelle pour avoir le programme
rsultat souhait.
Ainsi lexplication prcdente montre que dans le cas de cet exemple, la structure du
rsultat sobtient par une seule copie de la structure complte du template, puis par sa mise
jour. La mise jour inclut la destruction des champs inutiles car le template est une version
complte, la modification de noms et valeurs de champs, lajout dlments supplmentaires
dans les ensembles par copie du modle dans le template.
5.8 STRUCTURE ET FONCTIONNEMENT DUN GENERATEUR
Dans ce paragraphe nous expliquons la structure dun gnrateur et son principe de
fonctionnement.
5.8.1 Structure du gnrateur
Un gnrateur bas sur le principe expliqu dans les paragraphes prcdents exploite en
entre les 2 structures McseDs et XTemplateDs. Le rsultat en sortie est la structure OutputDs.
Les 2 structures en entre sont obtenues par lanalyseur syntaxique Loader paramtr par la
grammaire du texte. Chacune des structures possde une rfrence sur sa grammaire
(GrammarDs) en incluant la table des symboles pour permettre son interprtation. La structure
de sortie ncessite aussi de se rfrer une grammaire, ici celle de XtemplateDs. La sortie
textuelle se fait avec la fonction Save qui exploite alors cette structure de donnes et la
grammaire pour le formatage.
M.C.S.E
149
Chapitre 5
La figure 5.9 montre lorganisation dun gnrateur.
OutputDs
McseDs
McseModel
OutputText
Save
MCSE
Load
Generation
XTemplateDs
XTemplate
Template
Load
ScriptDs
Edit
Gnrateur
Gnrique
Script Load
Script
M.C.S.E
Le Mta-Gnrateur MetaGen
- Il met ensuite jour la structure cre dans OutputDs compte-tenu des champs des
noeuds de McseDs. La mise jour veut dire: placer les noms appropris des
identificateurs, supprimer les champs inutiles car le template contient la structure la plus
complte, mettre jour les listes correspondant aux ensembles.
- Il procde ainsi pour toute la structure McseDs par rcurrence et/ou rcursivit.
- Lorsque la structure est complte, le programme code est produit dans un fichier par la
fonction Save qui exploite la XGrammarDs pour linterprtation et sa table des
symboles pour lcriture des champs terminaux.
Ce principe de gnrateur savre ainsi relativement indpendant du langage produire. Il
sagit donc de dvelopper la fonction Generation selon une approche dautomate dexcution
sappliquant sur le parcours du script reprsent en interne par sa structure de donnes. Le
script doit tre construit sur la base des oprations gnrales de parcours, copie et mise jour
de structures.
Sur la figure prcdente nous avons gris la fonction Edit. La question est: peut-on exploiter
Edit dans un gnrateur? Edit peut par exemple servir proposer des alternatives. Ainsi ne
peut-on pas utiliser Edit pour slectionner une solution particulire pour la gnration lorsque
plusieurs sont possibles? Cest le cas par exemple en VHDL pour une variable partage
plusieurs critures. Les diffrentes solutions peuvent tre dans le template.
Une autre suggestion est de constituer plusieurs templates diffrents et de choisir le
template le mieux adapt. Ainsi dans le cas du langage C avec lemploi dun excutif tempsrel, il est utile de pouvoir "fitter" sur plusieurs excutifs temps rel. La diffrence est au moins
dans les primitives: noms et arguments, ainsi que dans les dclarations.
Un diteur orient par la syntaxe peut aussi servir ldition de tout texte dfini par une
grammaire. Ainsi, il peut donc tout fait servir pour ldition du script. Une telle dition peut
simaginer se faire dune manire interactive; choix dune action et visualisation immdiate du
rsultat.
5.9 DEFINITION DU SCRIPT
La question fondamentale pour dfinir la grammaire du script concerne les oprations
ncessaires pour assurer toute transformation de structure. On peut donc se dire quil sagit de
rechercher un langage de manipulation de structures.
Pour rpondre cette question, nous commenons par analyser lensemble des oprations
lmentaires ncessaires puis nous proposons une technique dexcution.
5.9.1 Oprations sur les structures
La prsentation de la mthode faite dans le paragraphe prcdent permet dextraire assez
facilement les oprations de base ncessaires. Nous retenons la liste suivante:
- Chargement dune structure partir dun texte,
- Sauvegarde dune structure sous forme textuelle,
- Copie dune structure complte partir du point de dsignation,
- Copie dun noeud dune structure,
- Destruction dune structure,
- Destruction dun noeud,
- Mise jour dun champ dun noeud,
M.C.S.E
151
Chapitre 5
- Ajout dun lment dans un ensemble.
-A- Chargement dune structure partir dun texte: LoadDs
Les structures ncessaires pour la gnration (par exemple McseDs et XTemplateDs) sont
charges par lopration RefDs := LoadDs(AccessFileName, Grammar, mode);.
- AccessFileName est le chemin daccs au fichier. Pour que loutil soit indpendant du
systme de fichiers, le chemin est dfini laide dune variable prdfinie FileSeparator
qui reprsente le caractre de sparation dun "path". Lutilisateur du script peut
galement utiliser dautres variables systmes: ProjectPath pour le chemin du projet,
ToolsPath pour le chemin des outils et Date pour la date courante.
- Grammar dfinit la grammaire utiliser pour lanalyse et la construction de la
structure de donnes.
- mode indique le format du fichier charger. Le ficher peut tre du type Ascii (mode=0)
et dans ce cas il est charg par un analyseur syntaxique. Mais il peut galement tre du
type Binaire (mode=1) et dans ce cas on utilise le mcanisme de srialisation/
dsrialisation du langage JAVA pour le charger. Un fichier srialis sera charg plus
rapidement quun fichier texte, mais il nest pas lisible.
- Le rsultat RefDs est une rfrence sur la structure de donnes cre. Mais comme une
structure de donnes na de signification quavec sa grammaire, le rsultat va contenir
aussi une rfrence sur la structure de donnes de la grammaire GrammarDs qui a t
charge pendant lopration LoadDs. GrammarDs contient aussi bien-sr la table des
symboles.
Lopration peut se reprsenter par la figure suivante.
Texte
RefDs:Ds
LoadDs(Texte,Grammaire,mode)
Grammaire
TexteDs
GrammaireDs
M.C.S.E
Le Mta-Gnrateur MetaGen
-C- Copie dune structure complte: CopyDs
Lobjectif est dobtenir une nouvelle structure image complte de sa source. Une telle copie
concerne la duplication de tous les noeuds de la structure, de tous les identificateurs et valeurs,
de la mise jour de tous les champs de cette nouvelle structure.
La copie doit tre telle que la destruction de la structure source doit permettre son
remplacement par sa copie.
La syntaxe est la suivante: NewDs := CopyDs(SourceDs);
Lopration peut se reprsenter par la figure suivante.
SourceDs:Ds
NewDs:Ds
Ds
CopyDs(SourceDs)
Ds
GrammarDs
Il sagit ici de dupliquer uniquement le noeud (et donc pas ses noeuds fils). La duplication
exploite le modle du noeud dans la grammaire. Tous les champs terminaux sont donc
existants. Les champs contenant des rfrences sur dautres noeuds ou sur des valeurs ou
identificateurs sont vides (Nil).
La syntaxe est la suivante: NewNode := CopyNode(SourceDs);
Lopration peut se reprsenter par la figure suivante.
SourceDs:Ds
NewNode:Ds
Ds
CopyNode(SourceDs)
Node
GrammarDs
153
Chapitre 5
La rfrence sur la nouvelle structure inclut aussi la rfrence sur la grammaire source pour
linterprtation. Comme chaque noeud possde son type mme aprs duplication, les champs
du noeud rsultat sont dfinis par ceux de son noeud modle dans la structure de la grammaire.
En fait, un noeud est simplement le cas particulier dune structure un seul lment.
Nous avons aussi considr utile dajouter lopration CreateNode(GrammarDs,
NodeType); qui a pour objectif de crer un noeud sans avoir un exemplaire disponible. La
cration se fait partir du modle de la grammaire. Largument est alors la grammaire et le type
de noeud.
-E- Destruction dune structure: DelDs
La destruction dune structure dfinie par une rfrence permet de rcuprer de la place en
mmoire ou permet de simplifier une structure plus globale.
La syntaxe est la suivante: DelDs(RefDs);
Lopration peut se reprsenter par la figure suivante.
SourceDs:Ds
RefDs:Ds
Ds
DelDs(RefDs)
Nil
Nil
GrammarDs
SubDs
RefDs:Ds
Cette opration na de signification que sil sagit dun noeud isol (sans rfrences). Dans
ce cas il sagit dun cas particulier dune structure. La destruction dun seul noeud dune
structure plus globale na pas de sens car alors les noeuds fils (ceux rfrencs) ne sont plus
rfrencs et donc inutilisables.
-G- Mise jour dun champ: ModifField
La modification dun champ est une opration importante. Il sagit de pouvoir affecter une
nouvelle valeur. Il y a 2 catgories de noeuds: le noeud de composition (NodeDs), le noeud de
valeur (DataNode). Le noeud de valeur est un noeud lmentaire contenant un nombre ou un
identificateur. Le noeud de composition contient un ensemble de champs de rfrence. Chaque
champ de rfrence pointe sur un autre noeud et donc sur une structure. Lassignation dun
champ est donc fonction de la catgorie concerne. Un champ peut aussi tre mis vide (Nil).
154
M.C.S.E
Le Mta-Gnrateur MetaGen
La syntaxe est la suivante: RefDs.Field := [ Ds | Val | Nil];
La figure suivante reprsente les 3 types doprations.
SourceDs:Ds
Range = nil
DataNode: String
Name
Toto
Descript
GrammarDs
SubDs
RefDs:Ds
SourceDs.Descript := RefDs;
Source.Name := Toto;
VarDs := SourceDs.Range;
DelDs(VarDs);
Source.Range := Nil;
ou bien DelDs(SourceDs.Range);
les 3 oprations AddFirst, AddLast et AddAfter servent la mise jour dun ensemble
dlments. Il sagit de pouvoir ajouter une structure ou une valeur en dbut de liste, en fin de
liste ou aprs un lment donn de la liste.
La syntaxe est la suivante: AddLast(RefDs.Field,VarDs);
La figure suivante reprsente la structure dun ensemble et leffet de lopration.
SourceDs:Ds
Range = nil
Name
DataNode: String
Toto
Set
GrammarDs
NextFriend
Nil
Father
Father
Name
Name
VarDs:Ds
AddLast(SourceDs.Set,VarDs);
155
Chapitre 5
VarDs.NextFriend := Nil;
VarDs.Father := SourceDs;
Lajout en dbut de lensemble ou aprs un lment donn est assez similaire.
5.9.2 Instructions denchanement
Aprs avoir dfini les oprations de base, il faut pouvoir construire une instruction ou une
transformation plus complexe. Pour dcider des constructions ncessaires, nous partons des
bases de la programmation structure qui recommande lemploi des 3 constructions suivantes:
- Excution squentielle,
- Rptition,
- Excution conditionnelle.
Un ensemble doprations peuvent se regrouper en une procdure, ce qui va se traduire par
une rgle de construction ou de transformation. Nous retenons les instructions suivantes:
- Rgle = suite dinstructions ou de rgles excutes en squence,
- While Condition do rgle;
- ForEach lment do rgle; instruction approprie pour les ensembles
- Case pour lexcution conditionnelle.
Ces instructions sont dcrites dans les paragraphes suivants.
-A- Dfinition dune rgle composite
Une rgle de transformation ou de construction se dfinit comme une suite de rgles plus
lmentaires ou doprations telles que celles dcrites auparavant.
La syntaxe est la suivante: R ::= { R1; R2; ....... Rn; }
La traduction de cette rgle sous la forme dune structure conduit un vecteur des rgles
plus lmentaires. La rcursivit est possible en permettant lutilisation de rgles plus
englobantes.
-B- Instruction While
Il est indispensable de pouvoir rpter une rgle jusqu une condition darrt. La syntaxe
est la suivante: While( Condition : Rgle);
La condition peut tre lmentaire ou compose de conditions lmentaires avec les
oprateurs logiques ou (OR), et (AND) et ou exclusif (XOR). Une condition lmentaire est
boolenne et limite aux tests simples Egal (=), Diffrent (#), Infrieur (<) et suprieur (>). Il
sagit de tester la valeur de champs.
-C- Instruction Case
Cette instruction porte sur la manipulation dun ensemble dlments. Il sagit par exemple
de pouvoir excuter une rgle pour chaque lment de lensemble. La syntaxe retenue est la
suivante: ForEach( Set : Rgle );
156
M.C.S.E
Le Mta-Gnrateur MetaGen
Set est une rfrence sur un ensemble. Les lments de lensemble constituent une liste
chane avec le pointeur NextFriend.
5.9.3 Dfinition des variables
Lanalyse qui prcde montre que les rfrences ou valeurs sont de 3 natures: Rfrence sur
une structure de donnes, chane de caractres, Nombre. La clart dun script passe par la
dclaration des variables utilises dans celui-ci. Des oprations particulires sont ensuite
ncessaires pour faciliter lcriture du script.
-A- Dclarations
Pour viter les erreurs et faciliter la transcription du script pour une excution efficace, il
est judicieux dassocier un type chacun.
Les variables dsignant un scalaire sont du type String ou du type Value.
Les variables dsignant une structure ou un noeud doivent tre types avec la grammaire.
Ceci est ncessaire pour donner une signification aux champs de la structure ou du noeud
rfrenc. Ceci a t montr comme indispensable pour les oprations CopyDs et CopyNode.
Do la dclaration: Var : [ Value | String | Grammar ];
La structure de donnes dune variable du script pour lexcution est reprsente par la
figure suivante.
VariableScript
Name
TypeName
GrammarRuleName
Value
0:n
Element
1:1
Integer
NodeDs
Real
String
Par rapport un langage classique et pour des raisons de simplicit, les rgles dun script
nont pas darguments dappel ni de variables locales. Ceci oblige le dveloppeur de Script
matriser parfaitement la traabilit des variables quil utilise et empiler et dsempiler
explicitement les variables utilises par des rgles rcursives. Pour viter davoir une liste trop
longue dinstructions Push(Var); et Pop(Var); , une clause LocalVisibility a t rajoute la
dfinition dune rgle. Les variables dclares dans cette liste sont implicitement empiles lors
de lappel de la rgle et dsempiler la fin de son excution.
LocalVisibility::=LocalVisibility name {, name};
M.C.S.E
157
Chapitre 5
Travailler uniquement par variables globales offre un avantage du point de vue efficacit
du code, mais se paie videmment par une plus mauvaise lisibilit du code.
5.9.4 Manipulations des variables
Des manipulations des variables du type Value et String sont indispensables.
-A- Les oprations sur les chanes de caractres
158
M.C.S.E
Le Mta-Gnrateur MetaGen
USE work.Declaration.all;
ENTITY ApplicationName IS
...
Lors de la sauvegarde sous forme textuelle, il faut liminer les dlimiteurs de zones non
analyses syntaxiquement. Pour cela, le concepteur dispose de linstruction DelDelimiter dont
la syntaxe est la suivante:
DelDelimiter(StringRef, BeginDelimiterString, EndDelimiterString);
Bien que ce soit dconseill, le concepteur peut modifier ces zones de texte figes avec
linstruction ReplaceCharAt qui permet de changer un caractre dune chane de caractres et
dont la syntaxe est:
ReplaceCharAt(StringRef, Index, NewChar);
-B- Les oprations sur les nombres
159
Chapitre 5
5.9.6 Configuration dun script
-A- Configuration
Un script est un ensemble de rgles. Il est possible dimporter et dutiliser des rgles dun
autre script. Ceci permet lutilisateur de pouvoir dcouper son code en diffrents petits
morceaux de script. Cette possibilit de dcoupage a au moins deux avantages:
- elle rduit la taille des fichiers de code et donc amliore leur lisibilit,
- elle permet de crer des librairies de rgles qui sont utilisables par diffrents
gnrateurs et donc amliore la rutilisabilit du code.
La syntaxe est la suivante: ImportOp NomRegle1,NomRegle2;
Les chemins daccs aux scripts contenant les rgles importer sont dfinis dans le fichier
de configuration de loutil.
-C- Contrle de lexcution
En mode interprt, le concepteur peut mettre des points darrt dans son code script avec
linstruction "BreakPoint;". Il a alors la possibilit de visualiser le contenu des variables, faire
du pas pas ou continuer lexcution.
Le concepteur dispose galement de linstruction "Error(msg);" qui permet dafficher un
message et stopper lexcution du gnrateur. A tout moment, il peut aussi envoyer un message
avec les instructions "Display(msg);" et "Warning(msg);" sans stopper lexcution du
gnrateur.
Enfin, on retrouve comme instructions du script les mthodes spcifiques lexploitation
du modle MCSE et qui permettent de rsoudre les problmes de:
- porte des noms,
- traabilit des liens entre lments de relations et interfaces de composant,
- inclusion de modle.
Ces mthodes ont t dtailles dans le chapitre 3 sur le modle de performance de MCSE.
5.10 SPECIFICATION DE LA GRAMMAIRE DU SCRIPT
La syntaxe du langage Script a t inspire de celle de langages existants. Elle devrait ainsi
tre assez familire pour tous nouveaux dveloppeurs de scripts. Sa description au format BNF
est donne dans le paragraphe suivant.
160
M.C.S.E
Le Mta-Gnrateur MetaGen
5.10.1 Syntaxe BNF de la grammaire du script
Script ::= ScriptName [Configuration] [Importation] [Constants] [Variables] Operations
Configuration ::= "Configuration" ParameterName {"," ParameterName} ";"
Importation ::= "ImportOp" RuleName {"," RuleName} ";"
Constants ::= "Constants" ConstName ":" ConstValue ";" {ConstName ":" ConstValue ";"}
ConstValue ::= Integer | String
Variables ::= "Variables" VarName ":" VarType ";" {VarName ":" VarType ";"}
VarType ::= "Value" | "String" | GrammarName
Operations ::= "Operations" {OpDefinition}
OpDefinition ::= OpName "::" "{" [LocalVisibility] OpDef; {OpDef;} "}"
LocalVisibility ::= "LocalVisibility" VarName {"," VarName} ";"
OpDef ::= OpName | SaveOp |AssignOp | DelDs | DelNode | ExecOp | SetOp |
CaseOp | WhileOp | PushOp | PopOp | GetAttributes | RelationLinks |
UnLinkInstance | AddFirst | AddLast | AddAfter | ResetVariable | Error |
Warning | Display | "BreakPoint;"
SaveOp ::= "SaveDs(" IdName "," StringDef ");"
AssignOp ::= IdName ":=" Value ";"
IdName ::= VarName {.FieldName}
Value ::= "Nil" | StringDef | Expression
StringDef ::= "LabelOf(" IdName ")" | StringDef {"&" StringDef} |
"IncludeOp(" StringDef "," Integer ")" | "TypeOf(" IdName")" |
"Date" | "ProjectPath" | "ToolsPath" | "FileSeparator" |
DataStructure | "DelDelimiter(" IdName "," StringDef "," StringDef ")" |
SubStringOf(" StringDef "," Expression "," Expression ")" | "ToString(" IdName ")" |
"HierarchyName(" IdName "," IdName "," StringDef ")" |
"ReplaceCharAt(" StringDef "," Expression "," StringDef ")"
DataStructure ::= IdName |
"LoadDs(" StringDef "," Name "," Integer ")" |
"CopyDs(" DataStructure ")" | "CopyNode(" DataStructure ")" |
"CreateNode(" GrammarName "," NodeType ")" |
"PeekAt(" Name "," Expression ")" | "Search(" Name "," StringDef "," StringDef ")" |
"IncludeComponent(" IdName ")" | "GetLibraryPath(" IdName ")" |
"FindModel(" IdName "," Integer ")" | "FindRelationalElement(" IdName ")" |
"FindStartComponent(" IdName "," StringDef "," StringDef "," Integer ")" |
"FindActivityDescription(" IdName ")"
Expression ::= BinaryExpression | Factor
BinaryExpression ::= Expression Op Expression
Op ::= "+" | "-" | "*" | "/"
factor ::= Integer | Real | "SizeOf(" Name ")" | "IsIn(" Name "," IdName ")" |
"ValueOf(" IdName ")" | "GetTime(" Name ")" | "GetFreeMemory()" | "LengthOf(" IdName ")"
DelDs ::= "DelDs(" IdName ");"
DelNode ::= "DelNode(" IdName ");"
ExecOp ::= "Exec(" String ");"
SetOp ::= "ForEach(" VarName ":" OpDef; {OpDef;} ");"
While ::= "While(" Condition ":" OpDef; {OpDef;} ");"
CaseOp ::= "Case(" Condition ":" OpDef; {OpDef;} {"|" Condition ":" OpDef; {OpDef;}}
["| Else" : OpDef; {OpDef;}] ");"
Condition ::= IdName ComparisonOp |alue | Value | LogicalExpression
ComparisonOp ::= "=" | "#" | "<" | ">"
LogicalExpression ::= "(" Condition LogicalOp Condition ")"
LogicalOp ::= "AND" | "OR" | "XOR"
PushOp ::= "Push(" VarName ");"
PopOp ::= "Pop(" VarName ");"
GetAttributes ::= "GetAttributes(" Idname "," VarName ");"
RelationLinks ::= "RelationsLinks(" IdName ");"
UnLinkInstance ::= "UnLinkInstance(" IdName ");"
AddFirst ::= "AddFirst(" IdName "," DataStructure ");"
AddLast ::= "AddLast(" IdName "," DataStructure ");"
AddAfter ::= "AddAfter(" IdName "," DataStructure ");"
ResetVariable ::= "ResetVariable(" VarName ");"
Error ::= "Error(" StringDef ");"
Warning ::= "Warning(" StringDef ");
Display ::= "Display(" StringDef ");
M.C.S.E
161
Chapitre 5
OutputDs.Name:=McseDs.Name;
}
CreateRelations :: { VarMcseDs:=McseDs.RelationDef;
VarTemplateDs:=TemplateDs.RelationDef;
VarOutputDs:=OutputDs.RelationDef;
ForEach( VarMcseDs : AddLast(VarOutputDs,copyDs(VarTemplateDs));
}
CreateBlocks :: { VarMcseDS:=McseDs.StructureDef;
VarTemplateDs:=TemplateDs.BlockDef;
VarOutputDs:=OutputDs.BlockDef;
ForEach( VarMcseDs : CreateBlock);
}
CreateBlock :: { Tmp1Ds:=copyDs(VarTemplateDs);
Case( VarMcseDs.Range = Nil : DeleteMultipleBlock);
AddLast(VarOutputDs,TempDs);
}
DeleteMultipleBlock :: { Tmp2:=Tmp1Ds.BlockDef;
Tmp1Ds.BlockDef:=Tmp2.block;
}
ScriptName
Operations
0:n
0:1
Configuration
0:1
0:1
0:1
OpDef
Importation
ImportOp
Constants
Variables
1:1
ElementaryOp
CompoundOp
Name
Variables
Constants
Configuration
OpType
OpName
Arg3
Name
0:n
0:n
0:n
CommaName
VarDef
ConstDef
:: {
Arg1
Arg2
*Operations
Var
Name
Const
Name
Name
ConsValue
VarType
M.C.S.E
Le Mta-Gnrateur MetaGen
- le nom du script qui est utilis pour nommer la classe dobjet obtenue par la
transcription du script en code JAVA,
- la clause de configuration qui permet de paramtrer lexcution et la gnration du
script. Les paramtres de configuration sont dclars et initialiss dans le fichier de
configuration du mta-gnrateur.
- la clause dimportation qui indique les rgles importes dun autre script. Le nom des
rgles et le chemin du fichier dans lequel elles sont dfinies sont galement dclars
dans le fichier de configuration du mta-gnrateur.
- la dclaration des constantes et des variables.
Chaque opration est soit une opration composite et donc dfinie par un ensemble
doprations, soit une opration lmentaire. Chaque opration lmentaire est caractrise par
son type et lensemble de ses arguments. Par exemple, lopration LoadDs possde les 3
arguments: FileName, GrammarName et mode. A noter quun argument peut se dfinir comme
un noeud opration qui est alors le rsultat de cette opration (donc une variable implicite).
Cest par exemple le cas pour lopration LoadDs qui est largument de droite de lopration
dassignation.
Lordre de dclaration des rgles na pas dimportance: les rgles sont excutes suivant
lordre dappel de ces rgles.
La rcursivit apparat lorsquune opration comprend une opration de niveau suprieur.
5.11.2 Principe dexcution
La structure du script doit tre construite pour avoir une efficacit dexcution. On analyse
dans ce paragraphe les transformations apporter la structure ci-dessus avant excution pour
permettre une excution efficace.
-A- Objectif defficacit
163
Chapitre 5
Le champ concern est dfini dans le script par son nom. Il sagit donc dassurer la
conversion du nom du champ en un index dans le noeud. Cette conversion est faite avant
excution. Lindex dans le champ se trouve par la grammaire de la structure du texte considr.
Comme le type dune variable (type de la rgle de grammaire) dpend de lhistorique de
lexcution du script, cette conversion ncessite de faire une pseudo-excution qui ne tient
compte que du type des variables (et non leurs valeurs): cest la phase dite doptimisation dun
script.
-B- Exploitation des variables
Les oprandes sont en fait les variables du script. Lefficacit sobtient en exploitant une
dsignation directe de la variable. Ceci impose donc de remplacer le nom dans le script par un
index dans la structure de donnes des variables (voir le paragraphe suivant).
-C- Principe dexcution
La figure suivante montre la technique retenue pour obtenir une excution efficace. Il sagit
de lorganisation de la structure de donnes du script pour quun programme conu comme un
automate soit efficace.
Les variables sont regroupes sous la forme dun vecteur. Chaque variable se dsigne alors
par son index dans le vecteur. Chaque variable est galement gre comme une pile qui permet
la rcursivit et la gestion de listes.
Script
ScriptName
Operations
Constants
0:n
Variables
OpName
0:n
OpDef
0:n
1:1
ConstDef
VarDef
Const
Name
ElementaryOp
CompoundOp
Var
Name
OpName
OpType
Arg3
*Operations
VarType
Arg1
Arg2
Value
ConsValue
Variable ou constante
Index de champ
VarName
Gestion LIFO de chaque variable
M.C.S.E
Le Mta-Gnrateur MetaGen
La figure 5.19 illustre le cas de lopration dassignation.
Exemple:
ElementaryOp
Tmp.BlockDef.Block:=V.Block;
AssignOp
Value du type IdName
IdName
Arg1
Arg2
VarName
Champ1
ChampN
Variables
VarName
Champ1
VarName
165
Chapitre 5
Comme un script peut contenir un ou plusieurs appels rcursifs directs ou indirects, nous
sommes obligs de dfinir une mthode pour chaque rgle. Cette solution donne galement la
possibilit de surcharger chaque mthode ou rgle et donc de piloter le script de lextrieur.
5.12 LA TECHNOLOGIE JAVA
Le changement de philosophie de conception des outils MCSE a offert lopportunit
dutiliser pour limplantation des outils, le dernier n des langages orient objet, cest dire le
langage Java. Jamais encore un nouveau langage de programmation na reu autant dattention
et est devenu trs populaire aussi rapidement. Les raisons de ce succs sont principalement
lies la slection minutieuse des constructions du langage et son ouverture sur le web.
Pour le dveloppement dune plate-forme doutils, le langage Java offre un certain nombre
davantages non ngligeables par rapport une implantation en C++ ou lutilisation dun mtaoutil. Il est en effet [JAWORSKI-97]:
- objet (et non orient objet). Contrairement C++ qui permet de programmer sans
utiliser ncessairement une approche et des concepts objet, Java nautorise de travailler
quavec des classes dobjets et supporte tous les concepts de la programmation oriente
objet: hirarchie de classes, hritage, encapsulation (package), polymorphisme
(mthode de mme nom), rutilisation (Java Beans), etc.
- interprt et portable. Un programme Java tourne sur toute plate-forme disposant de la
machine virtuelle Java. Si le logiciel doit satisfaire des contraintes de temps svres, un
programme Java peut aussi tre compil en code machine la vole (compilateur JustIn- Time) ou dfinitivement (compilateur natif). Le mode interprt permet dinstancier
des classes dobjets dont on ne connat pas le nom (nom saisi par lutilisateur par
exemple) lors de la compilation en byte-code. Le pseudo-code (byte-code) utilis par la
machine virtuelle a aussi la particularit dtre facilement retransformable en code Java
("reverse-coding"). Un dassembleur est livr en standard dans le JDK.
- simple et familier. Pour lcriture, la syntaxe est proche de celle du C++ avec quelques
concepts plus formaliss tel que labsence de pointeurs, la persistance dobjets
(srialisation), etc. La similitude syntaxique entre Java et C++ facilite la translation dun
programme C++ en Java.
- multi-thread. Lordonnancement des threads est premptif et priorit fixe. La
protection des donnes partages entre threads est assure en standard
(synchronisation). Java offre ici une proprit trs intressante pour la simulation du
modle de performance de MCSE. En plus de la programmation multi-thread, dautres
constructions ont aussi t inspires dADA: les concepts de package et dexception.
- fiable. Les constructions qui sont souvent source de problmes en C/C++ telles que par
exemple les pointeurs gnriques (*void) et la conversion implicite de type ne sont pas
autoriss en Java. Le garbage collector soccupe de librer automatiquement la mmoire
dsalloue. Le mcanisme dexception permet de retrouver plus facilement la source
dune erreur survenue lors de lexcution du programme.
- riche. La richesse des classes prdfinies facilite en autre la gnration dinterfaces
utilisateurs conviviales (menus, boutons, boite de dialogue, ScrollBar, animations,
gestion des vnements, etc),
166
M.C.S.E
Le Mta-Gnrateur MetaGen
- facile documenter et maintenir. Si le code source respecte un format donn,
lutilitaire javadoc gnre un document HTML contenant la hirarchie des classes, une
description dtaille de chaque classe (attributs, constructeur, mthodes), un index, etc.
- adapt limplantation de systmes distribus sur un rseau local ou distant. Java
permet de dcrire facilement des architectures client/serveur et autorise lutilisation de
diffrents protocoles de communication (TCP/IP, UDP, IPX, HTTP, etc). Comme il
autorise galement le lancement de diffrents process (programme C, simulateur
spcifique), Java est donc trs intressant pour faire de la co-simulation htrogne.
- scuris. Ddi programmer des applications sur Internet, Java a t conu avec
diffrentes couches de scurit. Le package Security Manager contient des mthodes
pour contrler les accs des utilisateurs et encrypter les donnes.
- ouvert vers le web. Un programme Java dcrit sous forme dapplet est tlchargeable
par le web. Si de plus, lapplication est implante sur le modle client-serveur et utilise
le protocole RMI (Remote Method Invocation), alors elle est utilisable par tous mais sa
proprit intellectuelle (code source) est prserve.
- plein de vitalit. La technologie Java est en plein essor (prolifration de livres, outils et
classes). Le systme dexploitation JavaOs qui est multi-tches et orient rseaux de
communication devrait connatre un franc succs avec lapparition des "Network
Computers" bon march et la banalisation dInternet.
5.13 REALISATION DE LOUTIL META-GEN
Ce paragraphe dcrit la solution retenue pour limplantation de loutil MetaGen. Pour
reprsenter les classes dobjets implantes, nous utilisons le modle statique de la mthode
OMT-UML. Pour le lecteur non familiaris avec le dialecte de cette notation pour la conception
oriente objet, les concepts du modle statique de la mthode unifie sont prsents dans
[RUMBAUGH-91] [RUMBAUGH-95].
5.13.1 Les classes dobjets
Toutes classes dobjets sont regroupes en deux catgories. La premire catgorie concerne
linterface utilisateur de loutil. La classe StartScript sert lancer loutil sous forme
dapplication locale ou dapplet. La classe GenEdit implante linterface utilisateur qui sera
dtaille dans le paragraphe suivant. La seconde catgorie regroupent les classes qui
constituent le coeur du mta-gnrateur.
Lensemble des instructions du script est rparti sur trois classes de la seconde catgorie:
- la classe VariableScript qui implante les variables du script,
- la classe NodeDs qui implante un noeud de structure de donnes,
- la classe GeneratorAll qui contient les mthodes qui ne sont rattaches ni aux variables
du script ni aux noeuds dune structure de donnes.
-A- La classe VariableScript
Chaque variable du script possde une rfrence sur la grammaire et la rgle de grammaire
concernes. Les valeurs dune variable sont gres par une pile dont la tte est la valeur
courante de la variable. Lors dune assignation, il y a systmatiquement vrification de la
cohrence entre le type de la variable et la valeur qui lui est assigne.
M.C.S.E
167
Chapitre 5
La hirarchie des classes est reprsente sur la figure 5.20.
Interface Utilisateur
StartScript
ToolsPath
ProjectPath
WorkPath
startComponent
...
MetaGen m_generator
watchDialog m_watchDialog
String fileName
String findText
int findIndex
...
init
main
open_Action
save_Action
exit_Action
cut_Action
copy_Action
paste_Action
replace_Action
find_Action
compile_Action
execute_Action
code_Action
breakButton_Clicked
stepButton_Clicked
continueButtonClicked
watchButtonClicked
debugFlag_Action
historyFlag_Action
reload_Action
GeneratorAll
Vector VariableVector
int nbWaring
boolean debugFlag,historyFlag
Properties generatorConfiguration
Thread exeThread
...
setDebugFlag
setHistotyFlag
writeMsg
sendMsg
clear
updateVariableTable
getTime
getFreeMemory
replaceCharAt
delDelimiter
includeOp
initReport
initVariableValue
writeHistory
startExecution
interprete
getVariableOf
getListVariable
getWatchTree
suspend
resume
stopExecution
LoadSaveManager
GenEdit
Vector roots
Vector Infos
Vector paths
...
putRoot
getRoot
delete
getPathName
removeAll
...
watchDialog
1
attentionDialog
findReplaceDialog
1
gscriptDs root
Vector ConstantVector
boolean steptostep
Vector ConfigurationVector
HashTable constantTable,variableTable,
configurationTable,ruleTable
...
MetaGen
1
gscriptDs
setStepFlag
load
compile
interprete
doJavaCode
NodeDs
NodeDs nextFriend,superFather,father
Vector element
GrammarDs grammarDs
...
copyNode
copyDs
typeOf
addAfter
addFirst
addLast
createNode
delDs
delNode
loadAscii
loadBin
0..*
VariableScript
String type
String grammar
String name
Stack Value
resetValue
nameOf
grammarOF
typeOf
setType
isIn
search
peekAt
size
push
pop
assign
read
duplicate
McseDs
0..*
Vector linkUp
Vector linkDown
...
0..*
0..*
VHDLDs
GrammarCDs
findModel
findRelationElement
getAttributes
getLibraryPath
hierarchyName
includeComponent
relationLinks
unLinkInstance
Mta-gnrateur
168
M.C.S.E
Le Mta-Gnrateur MetaGen
-B- Les classes des noeuds de structure
Les classes des noeuds de structure hritent toutes de la classe NodeDs. Parmi ces classes,
la classe McseDs se distingue par le fait quelle possde des attributs (linkUp, linkDown) et des
mthodes spcifiques lexploitation du modle MCSE.
-C- La classe LoadSaveManager
Cette classe sert mmoriser les structures de donnes charges (fichiers templates) lors de
lexcution dun script. Lors dune nouvelle excution, les classes mmorises qui nauront pas
t volontairement effaces par lutilisateur ne seront pas recharges do un gain de temps non
ngligeable. Ce mcanisme est galement valable pour les gnrateurs engendrs par le mtagnrateur pour lesquels plusieurs gnrations de code successives seront ncessaires pour
parcourir le domaine des solutions possibles.
-D- La classe GeneratorAll
La classe GeneratorAll est une classe abstraite dont hritent la classe MetaGen et les classes
obtenues par transcription dun script en code Java. Elle contient comme principaux attributs
le vecteur des variables du script et un "Thread" qui sert pour linterprtation ou lexcution du
script. Lutilisation de ce thread permet de suspendre lexcution du script tout moment. On
peut remarquer quil ny a pas de table de constantes. En effet, lors de la gnration de code
Java, les constantes sont remplaces par leurs valeurs. Les erreurs de syntaxe, compilation ou
excution sont gres par le mcanisme dexception de Java. En cas derreur, un vnement
contenant un message derreur est envoy vers linterface graphique. On utilise galement un
vnement mais sans message pour signaler la fin dexcution dun script.
-E- La classe MetaGen
169
Chapitre 5
5.13.2 Linterface utilisateur de loutil MetaGen
Linterface de loutil se compose:
-
M.C.S.E
Le Mta-Gnrateur MetaGen
alors visualiser le contenu des variables (Watch) et relancer linterprtation en continu
(Continue) ou en pas pas (Step). Des indicateurs permettent davoir une trace sur lcran
(Debug) ou dans un fichier (History) de la compilation ou de lexcution. Enfin, il peut
transcrire le script en un programme Java dont lexcution sera beaucoup plus rapide (Code).
5.14 CONCLUSION
Ce chapitre a dcrit la stratgie adopte pour disposer dun outil gnral permettant une
conception aise et efficace de tout gnrateur de code.
Le travail sur la gnration de code prsent dans ce chapitre a aussi amen lquipe MCSE
revoir sa stratgie de dveloppement des outils comme support pour la mthodologie MCSE.
Dans la nouvelle plate-forme en cours de dveloppement "MCSE ToolBox", le couplage entre
outils est bas sur un change par fichiers. Ce fichier dchange doit tre transform en une
structure de donnes qui est ensuite manipule par loutil concern. Or, toute structure de
donnes peut tre engendre dune manire automatique par un analyseur syntaxique enrichi
des rgles de production de la structure de donnes. Cet analyseur syntaxique est obtenu par un
gnrateur danalyseur syntaxique partir de la spcification de la grammaire (syntaxe
dentre du texte source) et des rgles de production.
Pour avoir un principe de cration de la structure de donnes indpendant de la grammaire,
nous avons dfini pour la spcification des rgles de production un modle de modle de
structure de donnes ou mta-structure bas sur la composition de quatre lments de base qui
sont la squence dlments, loptionnel, lalternative et la liste ou ensemble.
Cette solution offre au moins deux avantages. Tout dabord, elle est volutive. En effet,
pour faire voluer la structure de donnes, il suffit de modifier la grammaire et de regnrer
lanalyseur syntaxique associ. Elle est aussi gnrique. Comme tous les outils de la plateforme MCSE ToolBox, un gnrateur de code repose sur une architecture gnrique
comportant une fonction de chargement, de modification et de sauvegarde de structure de
donnes. La fonction de chargement charge sous la forme dune structure interne le texte
source. La fonction de manipulation parcourt la structure de donnes du modle source et cre
partir des informations recueillies une structure de donnes de sortie dont la grammaire est
celle du langage cible. La fonction de sauvegarde qui correspond un parcours ordonn de la
structure de donnes cre et lexploitation de la grammaire pour le formatage du texte de
sortie gnre le fichier texte final.
Pour faciliter les manipulations des structures de donnes effectuer pour mener bien une
transcription texte texte, nous avons galement utilis deux autres concepts: le concept de
template et le concept de script. Un template est un fichier crit dans le langage cible souhait
et contenant toutes les constructions ncessaires pour la translation texte texte. Il sagit dun
modle gnrique du rsultat attendu. Ainsi, la production de la structure de sortie consiste
parcourir la structure de donnes du modle source, copier des parties de la structure du
template puis les mettre jour. Le script est un langage que nous avons dfini pour dcrire de
manire concise les manipulations de structures de donnes effectuer: chargement dune
structure partir dun texte, sauvegarde dune structure sous forme textuelle, copie dune
structure complte ou dun noeud de structure, destruction dune structure complte ou dun
noeud de structure, mise jour dun champ dun noeud et ajout dun lment dans un ensemble.
Un gnrateur est alors le rsultat de la dfinition des grammaires des langages source et
cible afin dobtenir les analyseurs syntaxiques associs, la dfinition dun ou plusieurs fichiers
M.C.S.E
171
Chapitre 5
template et lcriture dun script. Ce script sert de point dentre au gnrateur de gnrateurs
de code ou mta-gnrateur nomm MetaGen qui permet dinterprter le script ou de le
transcrire en code JAVA. En mode interprt, le script est charg et la gnration se fait par
parcours de la structure de donnes du script. Bien que relativement lent, ce mode est trs utile
pour:
- la mise au point dun script: vrification incrmentale, point darrt, excution pas
pas, visualisation du contenu des variables, etc,
- la modification de la structure de donnes du script et donc du rsultat de la gnration
par un programme extrieur (diteur orient par la syntaxe par exemple): le script peut
ainsi tre modifi de manire interactive par lutilisateur en fonction de choix
dimplantation. Cette proprit est intressante pour le dveloppement dun gnrateur
dinterface matriel/logiciel qui doit laisser le choix au concepteur entre plusieurs
solutions dimplantation possibles.
Lorsque le script est transcrit en code Java, lexcution est plus rapide, sachant quen
contre-partie il ne peut plus tre modifi par un programme extrieur que par une surcharge de
mthodes.
Lintrt du script est que toute la dfinition de la gnration se fait par des rgles de
production fournies au gnrateur pour son paramtrage. Ainsi une modification dans le script
est immdiatement reporte dans le gnrateur concern. Un autre aspect intressant est la
possibilit de construire un script (cest--dire sa structure de donnes) par un autre
programme. Il peut sagir dun programme interactif permettant au concepteur de spcifier ce
quil dsigne comme solution en sortie. Ceci peut par exemple tre le cas pour le choix dune
solution pour limplantation dune variable partage ou dune fonction. Il peut aussi sagir de
lemploi dun autre script qui par son excution engendre le script de production du code!. La
modification de la structure de donnes dun script peut aussi se faire en interactif par une
dition oriente par la syntaxe car toutes les rgles de grammaire sont connues par loutil.
Lditeur exploite alors la mta-structure et la table des symboles pour proposer lutilisateur
les solutions possibles. La slection faite respecte ainsi obligatoirement la grammaire.
Actuellement, les concepts retenus et le mta-gnrateur dvelopp ont t utiliss pour
gnrer trois gnrateurs de code:
- un gnrateur de code VHDL comportemental pour la vrification fonctionnelle et
lvaluation des performances qui est prsent dans le chapitre 6. Ce gnrateur a
demand un temps de dveloppement plus long (6 mois) que les deux autres (3 mois)
car dune part les rgles de transcription sont plus complexes et dautre part il na pas
pu bnficier contrairement aux deux autres de lexprience acquise sur limplantation
dun gnrateur quivalent mais limit au modle fonctionnel de MCSE. Ce gnrateur
est galement celui qui est le plus avanc, debugg et test.
- un gnrateur de code VHDL au niveau RTL pour la synthse matrielle
- un gnrateur de code C/Noyau Temps-rel pour la synthse logicielle pour lequel la
possibilit de configuration permet de changer facilement de noyau temps-rel cible.
Un gnrateur de code C++ pour lvaluation des performances est galement en cours de
dveloppement. Pour tester efficacement lintrt de notre solution, ce gnrateur est
dvelopp par des personnes nouvelles au projet (utilisation de candide pour ne pas biaiser les
rsultats de cette exprience).
172
M.C.S.E