You are on page 1of 40

5

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

Structure de donnes interne

Texte rsultat

Grammaire du langage cible

-Figure 5.1- Architecture gnrique des outils de la plate-forme.


M.C.S.E

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

-Figure 5.2- Structure de donnes pour une grammaire.


M.C.S.E

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

-Figure 5.3- Structure de donnes pour une solution.


5.4 SPECIFICATION DUNE META-STRUCTURE
La prsentation faite dans le paragraphe prcdent permet maintenant de dfinir une
mthode gnrale de construction dun chargeur (loader) assurant la transformation dun texte
sous la forme dune structure de donnes. Le texte analyser est dfini par un ensemble de
rgles de grammaire. A ces rgles se trouvent associes des rgles de production induisant la
construction de la structure de donnes du texte analys. Dans ce paragraphe nous montrons
que les rgles de grammaire peuvent se reprsenter sur la base dune mta-structure appele ici
MetaDs. La MetaDs sert alors la construction de la reprsentation interne de la grammaire
appele ici GrammarDs. La GrammarDs est utilise par un analyseur syntaxique aussi appel
parser pour analyser et construire la structure de donnes de chaque solution appele ici XDs.
La XDs est base sur un modle de noeud gnrique appel ici DsModel. Ceci est expliqu
dans le paragraphe suivant.
Il sagit donc de tirer des rgles gnrales de transformations texte <-> structure partir de
lexemple de prsentation du paragraphe prcdent.
La figure 5.4 indique sous la forme de tableau le rsultat de synthse. La premire colonne
indique les 5 cas de rgles de grammaire selon la notation BNF. Les autres cas sen dduisent
par composition ou association. Y est un symbole non-terminal. A, B et C sont des symboles
terminaux ou non-terminaux.
La deuxime colonne montre la reprsentation graphique quivalente sous la forme de la
notation des structures de donnes. On retrouve le noeud de composition et 4 types
densembles, chacun dfini par des bornes diffrentes.
M.C.S.E

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

-Figure 5.5- Technique du "bootstrapping" pour la gnration du loader.


Pour gnrer la MCSEGrammarDs et la table des symboles correspondante, mais aussi le
programme source MCSE-Parser, il faut disposer dun autre programme. Un parser peut
nouveau effectuer cette production condition quil sache produire du code source. Un tel
parser est ici appel Grammar-Parser puisquil exploite pour cela en entre la grammaire du
modle MCSE. Le lien en gras reprsente la production dun code source.
Le programme Grammar-Parser doit disposer en entre:
- de la grammaire du modle MCSE qui est le texte pars,
- intgres cette grammaire, les rgles de production de la MCSEGrammarDs, de la
table des symboles de la grammaire et du code source de MCSE-Parser. Ces rgles sont
directement crites dans le langage du programme, cest--dire ici en JAVA.
- de la MetaDs et de la table des symboles de la mta-grammaire, indispensable pour
linterprtation de la grammaire et la production de la GrammarDs.
On peut nouveau continuer le raisonnement en se demandant comment obtenir
automatiquement le programme Grammar-Parser. La rponse est maintenant clair. Il suffit
dutiliser nouveau un parser appel maintenant Meta-Parser.
Le mta-Parser exploite en entre la mta-grammaire laquelle se trouvent associes les
rgles de production du code source de Grammar-Parser, de la MetaDs, de la table des
symboles de la mta-grammaire.
Pour rsumer ou pour avoir une autre vision de cette technique, le mta-parser produit des
classes dobjets appeles MetaDs et Grammar-Parser. Lexcution de lobjet Grammar-Parser
produit des instances des classes dobjets MetaDs pour reprsenter la grammaire ce qui donne
142

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

MCSEGrammarDs + Table des symboles

Affichage

Selection

-Figure 5.6- Structure interne gnrique de chaque outil.


La fonction Save est simplement un programme de parcours de la structure interne assurant
sa transcription sous forme textuelle et son formatage par indentation et contrle des retours de
ligne. La signification de la structure McseDs se trouve par exploitation de la structure
MCSEGrammarDs qui reprsente la grammaire. MCSEGrammarDs contient donc aussi les
rgles de formatage. La table des symboles est aussi indispensable pour lcriture textuelle des
symboles terminaux.
M.C.S.E

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

-Figure 5.7- Exemple de modle MCSE partiel.


144

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

-Figure 5.8- Structure de donnes pour le modle MCSE et le template VHDL.


148

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

-Figure 5.9- Structure interne dun gnrateur.


Un gnrateur pour un programme ou texte donn en sortie peut se concevoir comme un
programme crit en C, C++ ou Java assurant les oprations ncessaires sur les structures de
donnes et selon lordre appropri. Cette solution conduit devoir dvelopper autant de
gnrateurs que de rsultats diffrents en sortie. On peut aisment imaginer que les gnrateurs
devraient possder des oprations en commun par suite de similitudes. Ne peut-on pas alors
pousser plus loin le raisonnement en cherchant une solution dun seul gnrateur
programmable de lextrieur. On arrive alors lide dun script dfinissant le comportement
souhait. Nous avons retenu cette ide car elle devrait permettre toute autre personne de
dvelopper un gnrateur spcifique sans avoir connatre et intervenir dans le code du
gnrateur. Pour cela, il suffit que toutes les oprations ncessaires soient possibles par le
script.
5.8.2 Fonctionnement du gnrateur
La gnration est le rsultat de lexcution dun programme se conformant un script de
gnration. Plutt que deffectuer linterprtation du texte du script pour lexcution, le script
est aussi charg en mmoire sous la forme dune structure de donnes comme le montre la
figure 5.9. Le programme de gnration doit donc assurer le parcours de la structure du script
pour effectuer les oprations de manipulation de OutputDs.
Le fonctionnement possible pour un gnrateur pilot par un script est alors le suivant:
- Il commence par lire le fichier texte McseModel de manire construire la structure
interne McseDs. De la mme manire, il va crer la structure interne XTemplateDs
partir du fichier texte XTemplate.
- La structure de sortie OutputDs est cre limage de XTemplateDs par copie de parties
de structures en se basant sur une analyse de la structure McseDs.
150

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

-Figure 5.10- Opration LoadDs.


-B- Sauvegarde dune structure sous forme textuelle: SaveDs

La sauvegarde est lopration strictement inverse du LoadDs. La syntaxe est:


SaveDs(RefDs, AccessFileName);. RefDs et AccessFileName ont les mmes significations et
dfinitions que ci-dessus.
Une bonne vrification consiste crire le script suivant:
RefDs := LoadDs(Texte1, McseModel,0); SaveDs(RefDs, Texte2);
On doit alors trouver dans Texte2 la mme description que Texte1 mais avec en plus un
formatage qui peut tre meilleur si Texte1 ne respectait pas les rgles de prsentation.
152

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

-Figure 5.11- Opration CopyDs.


La rfrence sur la nouvelle structure inclut la rfrence sur sa grammaire pour
linterprtation. La structure de la grammaire nest pas copie.
Une vrification de cette opration peut tre la suivante:
SourceDs := LoadDs(Texte1, Grammaire,0);
NewDs := CopyDs(SourceDs);
DelDs(SourceDs);
Save(NewDs, Texte2);
On doit alors retrouver en sortie Texte2 le mme contenu que Texte1.
-D- Copie dun noeud dune structure: CopyNode

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

-Figure 5.12- Opration CopyNode.


M.C.S.E

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

-Figure 5.13- Opration DelDs.


La rfrence sur la structure dtruite nest plus utilisable car possdant un contenu Nil. Pour
lexploitation correcte de cette opration pour le cas reprsent par la figure, il faut que la
rfrence sur SubDs dans Ds doit aussi tre supprime. Ceci est possible avec lopration de
modification dun champ dcrite ci-aprs.
La destruction de toutes les structures dune mme grammaire peut conduire la
destruction de la grammaire de manire rduire la place mmoire.
-F- Destruction dun noeud: DelNode

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);

-Figure 5.14- Opration ModifField.


Une variante est indique pour le champ Range. Dans la grammaire du modle MCSE, le
champ Range est une rfrence sur une structure. Si Range ne doit pas exister, il sagit de
dtruire la structure et daffecter le champ Nil. Dans ce cas, lopration DelDs est suffisante.
-H- Ajout dun lment dans un ensemble: AddFirst, AddLast, AddAfter

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);

-Figure 5.15- Opration AddLast.


SourceDs.Set dsigne lensemble pour lequel il faut ajouter la structure rfrence par
VarDs. Compte-tenu du choix adopt pour limplantation dun ensemble, il sagit deffectuer
les oprations plus lmentaires suivantes:
TmpDs := SourceDs.Set;
While TmpDs # Nil do TmpDs := TmpDs.NextFriend;
Tmps.NextFriend := VarDs;
M.C.S.E

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

Lexcution conditionnelle englobe linstruction If et linstruction Case. On retient


linstruction Case car elle englobe la premire. La syntaxe retenue est la suivante:
Case( Condition1 : Rgle1 | Condition2 : Rgle2 ........ [ | Else : RgleN ]);
Le cas Else est optionnel. Une condition se dfinit comme pour le While.
-D- Instruction ForEach

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

Pour une variable dsignant une structure, la


variable doit aussi avoir une rfrence sur la rgle de
grammaire concerne. Les valeurs des variables sont
gres sous la forme de pile pour permettre la
rcursivit des rgles du script. Ceci explique
lensemble 0:n

NodeDs
Real

String

-Figure 5.16- Structure de donnes pour une variable du script.


Certaines oprations ncessitent demployer des donnes prdtermines. Il sagit alors de
constantes quil faut pouvoir dclarer pour faciliter leur modification globale.
Do la dclaration: Const [ Number | String];
-B- Porte des variables

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

Les oprations de manipulations des chanes de caractres retenues sont:


- la conversion dun nombre sous la forme dune chane de caractres (ToString),
- la concatnation de plusieurs chanes de caractres (&),
- lobtention du type (nom de la rgle de grammaire) dun noeud de structure (TypeOf),
- lobtention de la premire chane rencontre dans un record (LabelOf),
- lobtention de la longueur dune chane de caractres (LengthOf),
- lextraction dune sous-chane dans une chane de caractres (SubStringOf).
Les syntaxes de ces instructions sont:
- VarString := ToString(VarValue );
- VarString := VarString1 & VarString2 ......& VarStringN;
- VarString := TypeOf(RefDs.Field);
- VarString := LabelOf(RecordDs);
- VarValue := LengthOf(VarString);
- VarString2 := SubStringOf(VarString1, IndexMin, IndexMax);
Les gnrateurs de code qui seront obtenus partir du mta-gnrateur MetaGen doivent
permettre de produire un programme complet pour faire une simulation fonctionnelle ou une
synthse. Dans ce cas, des comportements sont crits directement sous une forme
algorithmique. Le gnrateur doit alors intgrer ce code saisi manuellement au code gnr
automatiquement. Pour cela, nous avons dfini linstruction IncludeOp dont la syntaxe est:
VarString := IncludeOp(FileAccessName, mode)
Linclusion dun fichier texte peut se faire par copie (mode=0) ou par rfrence (mode=1).
Pour le mode par rfrence, le fichier est inclut uniquement au moment de la sauvegarde de la
structure de donnes concerne sous forme textuelle.
Lorsque lon analyse un fichier template, certaines parties dclaratives de ce fichier
nauront pas tre modifies pour la transcription. Au lieu de crer une sous-structure de
donnes pour ces textes figs, le concepteur a la possibilit de les charger uniquement sous
forme de chanes de caractres en les dlimitant par des mots cls spcifiques
(NO_PARSE_TEXT et END_NO_PARSE_TEXT par exemple). Lexemple ci-dessous est
une partie dun fichier de template illustrant ces propos.
NO_PARSE_TEXT
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
LIBRARY STANDARD;
USE STANDARD.TEXTIO.all;
END_NO_PARSE_TEXT
LIBRARY work;

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

Les oprations du script concernant les nombres sont:


- la conversion dune chane de caractres en un nombre (ValueOf),
- lobtention de lheure courante (GetTime),
- lobtention de la mmoire systme libre (GetFreeMemory),
-

le calcul dexpression avec les oprateurs +, - , * et /.

La syntaxe de ces instructions est:


- VarValue := ValueOf( VarString );
- VarValue := GetTime(Unit); avec Unit ::=ms | sec | min
- VarValue := GetFreeMemory();
5.9.5 Manipulations de liste
Une variable du script est implante sous la forme dune pile. Donc pour crer une liste
dlments, il suffit de les empiler dans une variable laide des instructions Push et
dassignation: Push(Var); Var:=NewElement;. Pour grer ces piles, les instructions
disposition sont:
- lobtention de la taille de la liste (SizeOf),
- lobtention dun lment de la liste partir de son index (PeekAt),
- la recherche dun lment dans la liste partir de sa rfrence (IsIn),
- la recherche dun lment dans la liste partir de son type et de son nom (Search),
- la rinitilisation dune variable (ResetVariable).
La syntaxe est la suivante:
- VarValue := SizeOf( ListRef );
- NodeRef := PeekAt( ListRef,Index);
- VarValue := IsIn( ListRef,NodeRef );
- NodeRef := Search( ListRef,TypeName,NodeName);
- ResetVariable( VarRef );
M.C.S.E

159

Chapitre 5
5.9.6 Configuration dun script
-A- Configuration

Linterprtation du script et sa transcription en code Java peuvent tre pilotes en fonction


de paramtres contenus dans un fichier de configuration situ dans le rpertoire du projet. Il
sagit dans le principe dune sorte de pr-compilateur tel que celui du langage C. Seules les
parties de Script valides par ces paramtres sont compiles et interprtes ou transcrites en
code JAVA. Par exemple, un mme script peut ainsi fournir un gnrateur pour C/VxWorks ou
un gnrateur pour C/NoyauETRIreste.
La syntaxe est la suivante:
Configuration ExecutifETR;
...
Case (ExecutifETR=VxWork: ...;
| Else : ...):
-B- Importation de rgles

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 ");

5.10.2 Exemple de Script


Lexemple suivant est un script permettant de traiter partiellement le problme de
gnration prsent dans le paragraphe 5.7.1.
ExempleDeScript1
Variables VarMcseDs: McseGrammar; VarTemplateDs: VhdlGrammar;
VarOutputDs: VhdlGrammar; Tmp1Ds: VhdlGrammar;
Tmp2: VhdlGrammar;
Operations
VHDLGenerate :: { Load; CreateEntity; CreateRelations; CreateBlocks; }
Load :: { VarMcseDs :=LoadDs(McseDescription, McseGrammar,0);
VarTemplateDs := LoadDs(template, VhdlGrammar,1);
}
CreateEntity :: { OutputDs:=CopyDs(TemplateDs);

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;
}

5.11 AUTOMATE DEXECUTION


Le script sert dfinir la fonctionnalit du gnrateur. Le comportement sera obtenu par
interprtation de la structure de donnes ScriptDs qui est le rsultat de son chargement par
lanalyseur syntaxique appropri. Dans ce paragraphe nous analysons la structure de donnes
ScriptDs pour dduire la spcification du moteur dexcution.
5.11.1 Analyse de ScriptDs
La structure de donnes ScriptDs est associe sa structure de grammaire
ScriptGrammarDs comme cest le cas pour toute structure. Compte-tenu de la grammaire, la
structure de donnes souhaite pour tout script est reprsente sur la figure suivante.
Script

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

-Figure 5.17- Structure de donnes pour la grammaire du Script.


Un script se dcompose en deux parties: une partie dclaration et une partie description des
oprations. Dans la partie dclaration, il y a:
162

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

Lexcution sobtient par un programme se comportant comme un automate dexcution


assurant le parcours ordonn de la structure de donnes du script et excutant au fur et mesure
les oprations lmentaires.
Lefficacit dexcution rsulte:
- dune efficacit du parcours,
- dune efficacit dexcution des oprations.
Le parcours de la structure est efficace car limplantation des ensembles doprations est
faite sous la forme de listes chanes.
Lefficacit des oprations rsulte dun accs efficace aux oprandes puis dune excution
rapide. Le point important concerne laccs aux lments (variables, champs) comme
oprandes qui doit tre le plus direct possible. Les oprandes sont de 2 natures:
- une rfrence sur une donne ou une structure. Il sagit alors dun accs direct.
- la dsignation dun champ dans un noeud dune structure qui est faite par son nom
symbolique. La difficult consiste connatre directement la position de ce champ dans
le noeud. Cette position est dpendante du type de noeud, la structure du type de noeud
tant dfinie dans la structure de donnes de la grammaire GrammarDS.
M.C.S.E

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

Variables regroupes sous la forme dun vecteur

Dsignation par lindex dans le vecteur


Noeud de type connue par VarType

VarName
Gestion LIFO de chaque variable

-Figure 5.18- Structure de donnes pour une excution du Script.


Le noeud ElementaryOp illustre le cas des 2 types doprandes: une variable ou constante,
un champ dun noeud. Sil sagit dune constante, loprande est une rfrence directe sur cette
constante. Sil sagit dune variable, loprande est lindex de la variable dans le vecteur. Sil
sagit dun champ, il sagit de lindex dans le noeud.
164

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

-Figure 5.19- Structure de donnes pour lopration dassignation.


Lassignation est dfinie par IdName := Value. IdName et Value sont ici reprsents
comme lemploi dun champ dune variable. Chaque oprande est soit une dsignation directe
(cas dune variable sans champ ou dune constante), soit un champ dun noeud dsign par une
succession de champs (indirections multiples comme pour Arg1 de la figure 5.19). Les champs
sont traits dans lordre pour faire toutes les indirections dclares.
5.11.3 Implantation de lautomate
Lautomate dexcution se dduit assez directement de la technique dcrite dans le
paragraphe prcdent. Il sagit dimplanter:
- le programme de chargement du script de manire aboutir la structure de donnes
(phase de vrification syntaxique et chargement),
- le programme de parcours de la structure du script pour son optimisation avant
excution (phase doptimisation et de contrles smantiques),
- le programme de parcours et dexcution de toutes les oprations lmentaires (phase
dexcution).
5.11.4 Traduction dun script en Java
Au lieu dinterprter le Script en parcourant sa structure de donnes image, il est galement
possible de traduire le Script en un programme Java. On obtient alors un programme de
gnration indpendant du mta-gnrateur pour son excution et plus rapide que le
fonctionnement en mode interprt. En effet, que le script soit en mode interprt ou transcrit
en code Java, les mmes mthodes sont utilises pour lexcution des oprations lmentaires.
La transcription se limite donc simplement convertir une structure de donnes en un
enchanement dinstructions. Cette conversion repose sur la dualit qui existe entre oprateurs
de composition dune structure de donnes et structures de contrle dun programme. Ainsi un
record de la structure de donnes du script est traduit par une squence dinstructions,
lalternative par la slection et lensemble par litration.
M.C.S.E

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

-Figure 5.20- Hirarchie des classes dobjets de loutil MetaGen.

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

En plus de ceux hrits de la classe GeneratorAll, les attributs importants de la classe


MetaGen sont:
- la racine de la structure de donnes du script (root),
- la table des constantes (constantVector),
- la table des paramtres de configuration du script (configurationVector),
Les principales mthodes de cette classe sont charges de:
- la vrification syntaxique et le chargement de la structure de donnes du script (load),
- loptimisation de la structure de donnes avant son interprtation (compile),
- lexcution ou plutt interprtation (interprete),
- la transcription en code java (doJavaCode).
Durant la phase de chargement et vrification syntaxique, on met jour des "hashtables"
concernant les paramtres de configuration, les constantes, les variables et les rgles du script.
Ces hashtables sont ensuite utilises durant la phase doptimisation de la structure de donnes
qui consiste remplacer une variable par son index dans la table des variables et un nom dun
champ de record pour son index. Cette phase doptimisation est une pseudo-interprtation du
script qui ne tient compte que du type des variables. La phase dexcution est un parcours
ordonn de la structure du script et une excution des oprations lmentaires.
M.C.S.E

169

Chapitre 5
5.13.2 Linterface utilisateur de loutil MetaGen
Linterface de loutil se compose:
-

dune barre de menu principal,


dune zone ddition permettant de saisir le script et o lon retrouve les commandes
classiques dun diteur textuel (open, save, copy, paste, cut, find, replace, etc.),

- dune zone daffichage de messages,


- dune zone de boutons de commande,
- dune ligne de statut,
- dune zone daffichage du contenu des variables sous forme darbre.
La figure suivante montre linterface utilisateur du mta-gnrateur.

-Figure 5.21- Interface utilisateur de loutil MetaGen.


La mise au point dun script se fait dune manire interactive. Le concepteur assure dabord
son dition et sa sauvegarde. Le script est ensuite compil. Durant la phase de compilation,
loutil fait une vrification syntaxique et charge la structure de donnes du script. Une fois
charg, des contrles smantiques et des optimisations sont faites (Compile) sur cette structure.
Lorsque la compilation sest passe sans erreur, le concepteur peut lancer linterprtation de
son script (Execute). Pour la mise au point, il a la possibilit de placer des points darrt dans
le code (instruction BreakPoint) ou de suspendre linterprtation tout moment (Break). Il peut
170

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

You might also like