Corrigé de l'exercice 1
Le barème indiqué (total pour l'exercice : 7 points) est sur 30 points, et la note finale (sur 20) est obtenue par une règle de trois.
(2 points / 30) Non : si le titre de la section comporte lui-même des instructions de mise en page, reconnaître la fin du titre demande l'appariement correct des accolades ouvrantes et fermantes, qui relève de l'analyse syntaxique et non lexicale. Autrement dit, le langage des annonces de sections LaTeX n'est pas rationnel dans le cas général.
(5 points / 30)
void convertir (char *texte, char *balise);
titre [^{}]+
%%
"\\section{"{titre}"}" convertir (yytext + 9, "H1");
%%
void convertir (char *texte, char *balise) {
int n = strlen (texte);
texte[n - 1] = '\0';
printf ("<%s>%s%s>", balise, texte, balise);
}
Commentaires
Il est essentiel d'exclure l'accolade fermante des caractères autorisés dans le titre d'une section. Exclure l'accolade ouvrante a l'avantage de laisser inchangée une annonce de section ne respectant pas la condition restrictive de l'énoncé ; ce qui est préférable, dans le cas de macros emboîtées, à une conversion erronée se terminant à la première accolade fermante.
Les neuf caractères initiaux (\section{) du motif sont éliminés lors de l'appel de la fonction de conversion ; celle-ci élimine à son tour l'accolade fermante finale. Le second argument balise permet une généralisation facile du programme pour traiter des conversions de macros LaTeX similaires ; bien entendu cette précaution n'est pas demandée dans le cadre de l'examen.
Evaluation des copies d'examen
Proposer une solution sans motif dénoté par une expression rationnelle est possible strictement parlant, mais pour le moins maladroit pendant un examen de compilation ; d'autre part la solution proposée ci-dessus (avec motif) est la seule facilement généralisable aux macros LaTeX similaires.
Cependant une solution sans motif mais raisonnable et dénotant une certaine familiarité avec lex rapporte 3 points.
Le motif [a-zA-Z0-9]+ et ses frères restreignent tout à fait inutilement le jeu de caractères autorisé dans un titre de section.
Il est inutile d'ajouter d'autres règles dans le programme lex, car le reste du texte est inchangé par défaut. Ajouter .|\n ; supprime la recopie du reste du texte (et fait perdre un point) ; ajouter une règle commençant par .* rend sans effet les règles précédentes (et fait perdre deux points).
Ecrire une fonction de conversion avec force malloc et autres complications témoigne d'une incompréhension de la programmation (qui est sanctionnée).