G´en´eration de planning HTML
Licence info S5
TP COMPIL – 2012 - 2013
Le but de ce TP est de vous faire d´evelopper une petite application de traitement de donn´ees textuelles,
sans utiliser les techniques bien utiles qui seront vues en cours, pour bien vous faire prendre la mesure
de la difficult´e de la tˆache quand on ne maˆıtrise pas ces techniques. En pratique :
– ce sujet de TP s’´etale sur 2 s´eances ;
– vous devez rendre votre travail sur PROF `a la fin de chaque s´eance, mˆeme s’il n’est pas termin´e
mais accompagn´e d’un README indiquant son ´etat d’avancement ;
– c’est un TP de mise en jambe, sciemment difficile puisqu’on ne connaˆıt pas encore les techniques
adapt´ees, donc pas de panique : si vous avez du mal, c’est normal !
`
A l’issue de ce TP, vous devriez :
2avoir compris le DSL des plannings ;
2ˆetre `a l’aise en Java ;
2maˆıtriser la biblioth`eque de lecture / ´ecriture qui vous est fournie ;
2savoir utiliser les expressions r´eguli`eres de Java (classes Pattern et Matcher) ;
2savoir ´ecrire des scripts shell simples ;
2savoir rendre `a temps votre travail sur PROF ;
2attendre impatiemment la suite du cours.
1 Le DSL
Pour se simplifier la vie, et comme on ne sait pas encore utiliser une analyse dirig´ee par la syntaxe 1,
on a fait le choix pour ce TP d’une analyse dirig´ee par les d´elimiteurs 2, en l’occurrence les sauts de ligne.
On impose donc dans la syntaxe du DSL que les informations soient organis´ees ligne par ligne (et le
fichier d’entr´ee sera en cons´equence lu ligne par ligne, et non caract`ere par caract`ere). On pourra utiliser
le saut de ligne et les blancs `a volont´e, pour la mise en forme.
Pour ce TP, c’est d´ej`a bien si vous r´ealisez la version simple du DSL, et ce n’est pas grave
si certains d´etails restent `a traiter (par exemple si vous ne v´erifiez pas les pr´esence des guillemets,
la syntaxe des heures, etc).
2 R´ealisation
T´el´echarger l’archive sur le portail. Elle contient un paquetage planningMaster `a compl´eter. G´en´erer
la javadoc peut ˆetre utile (sh genererJavadoc.sh).
2.1 Les fichiers fournis
La classe GenerationHTMLPlanningMaster est `a compl´eter. La m´ethode generation est charg´ee
de :
– lever une exception ErreurFormatException si le planning d’entr´ee n’est pas correct ;
– s’il est correct, ´ecrire le fichier HTML correspondant.
Les utilitaires d’entr´ee/sortie sont fournis et param`etrent la classe GenerationHTMLPlanningMaster
(pas la peine d’´editer ces fichiers, regarder la javadoc suffit) :
–LectureLigne.java,LectureLigneFlot.java : pour lire un fichier ligne par ligne ;
–EcritureTexte.java,EcritureTexteFlot.java : pour ´ecrire des chaˆınes dans un fichier.
La classe LancerGeneration permet de lancer l’application en passant un fichier de donn´ees fichier.dsl
sur la ligne de commande. Elle cr´ee un objet de type GenerationHTMLPlanningMaster (param´etr´e par
le flot d’entr´ee) et lance dessus la m´ethode generation.
Une fois que le nom du fichier de sortie sera calcul´e (rappel : nomMaster date salle.html ), il faudra
le transmettre `a l’objet de type GenerationHTMLPlanningMaster (dans l’exemple qui suit this est de
type GenerationHTMLPlanningMaster) pour rendre les ´ecritures possibles :
1. Analyse dirig´ee par la syntaxe = bas´ee sur une grammaire alg´ebrique
2. Delimiter-directed translation, [Fowler2011] p201.
TP COMPIL 2012 - 2013
TP COMPIL G´en´eration de planning HTML
EcritureTexte sortie = new EcritureTexteFlot(new FileOutputStream(<nomFichier>);
this.setOutput(sortie);
...
this.ecrire(...);
Le fichier ConstantesHTML.java contient le texte correspondant `a certaines balises HTML qui ap-
paraˆıtront dans le fichier g´en´er´e. Ce fichier est `a compl´eter.
Il est conseill´e de stocker les fichiers de test dans un r´epertoire test.
Il est fortement recommand´e d’automatiser votre travail en vous bricolant des scripts pour lancer des
lignes de commande depuis le r´epertoire courant (voir les rappels utiles sur le portail), par exemple :
– pour compiler les sources ;
– pour lancer le main de la classe LancerGeneration ;
– pour supprimer automatiquement les html g´en´er´es ;
– cr´eer une archive `a rendre sur PROF.
2.2 M´ethode `a appliquer
Le sch´ema g´en´eral consiste `a :
– lire la prochaine ligne
– la reconnaˆıtre pour v´erifier qu’elle correspond `a la syntaxe attendue, ou pour faire un choix entre
plusieurs syntaxes possibles
– l’analyser pour en extraire l’information utile
Pour savoir quel formalisme utiliser pour la reconnaissance, on peut commencer par se demander si les
langages contenant les lignes d´eclarant le master, la date, une ligne de soutenance, etc, sont des langages
r´eguliers (avec r´eponse argument´ee, pas au pif !).
Si tel est le cas, alors chaque ligne peut ˆetre reconnue par une expression r´eguli`ere et on peut utiliser
les expressions r´eguli`eres de Java 3.
2.3 Les expressions r´eguli`eres de Java
Vous trouverez ici un tutorial tr`es complet (le chercher en local au M5)
http://download.oracle.com/javase/tutorial/essential/regex/
et dans ce sujet de quoi commencer. On se sert des classes Pattern et Matcher du paquetage java.util.regex
(la classe String peut aussi se r´ev´eler utile).
La classe Pattern permet de d´efinir une expression r´eguli`ere sous la forme d’une String. Par exemple,
"master" correspond `a l’expr reg master. De nombreuses classes de caract`eres sont pr´ed´efinies, voir
http://download.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html
Par exemple, \w d´esigne n’importe quel caract`ere dans [a-zA-Z_0-9] et \s d´esigne un blanc au sens
large (incluant les tabulations, retour `a la ligne, etc). L’expression r´eguli`ere .d´enote n’importe quel
caract`ere. L’expression [^;] d´esigne n’importe quel caract`ere sauf ;. Les expressions \s+ et \s* utilisent
les op´erateurs +et *avec leur signification habituelle. Comme en Java le caract`ere \est un caract`ere
sp´ecial, il faut le d´esp´ecialiser `a l’int´erieur des String, et on devra donc ´ecrire "\\s*" pour exprimer
autant de blancs que je veux , ce qui rend les expressions rapidement illisibles.
Si on veut juste savoir si une chaˆıne correspond `a une expression r´eguli`ere, on peut utiliser la m´ethode
statique matches :Pattern.matches("master",ligneLue) retourne vrai si la chaˆıne d’entr´ee ligneLue
(de type String) correspond `a l’expression r´eguli`ere "master".
Pour extraire des sous-motifs de la chaˆıne d’entr´ee, il faut passer par la classe Matcher.
Pattern pattern = Pattern.compile("\\s*dring\\s+((\\w|\\s)+)\\s*");
Matcher matcher = pattern.matcher(ligneLue);
if (matcher.matches())
System.out.println(matcher.group(1));
d´efinit l’expression r´eguli`ere reconnaissant le mot dring, suivi d’une suite de caract`eres de [a-zA-Z_0-9],
avec ´eventuellement des blancs qui trainent. L’objet matcher est construit sur cette expression. Sa
3. Plus g´en´eralement, le langage contenant l’ensemble des plannings est r´egulier. Mais ce n’est pas pratique d’utiliser
une grosse expression r´eguli`ere pour extraire les informations du texte source.
2012 - 2013 2 Licence info S5