Université d'Ottawa SEG-2506 : Construction de logiciel Gregor v. Bochmann Hiver 2008, 2009, 2010, 2011, 2012, 2013, 2015 |
Lab 5 - Partie 1 |
A l'origine, préparé par Nicolas Gorse |
(1) Expressions régulières: Nous considérons des langages sur l'alphabet (vocabulaire) de deux lettres: V={a, b}. Donnez des expressions régulières qui correspondent aux langages définis informellement ci-dessous:
(2) Automates: Pour chacun des langages ci-hauts, trouvez un automate (détermniste) qui accepte le langage.
(3) Automate correspondant à une expression régulière: Pour chaque expression régulière ci-dessous, donnez un automate (détermniste) qui accepte le language défini par l'expression régulière:
(4) Automate non déterministe: L'automate suivant est non déterministe. Questions:
(5) Équivalences: Nous considérons les pairs d'expressions régulières suivants. Pour chaque pair, indiquez si les deux expressions désignent le même langage ou non. Si elle désignent le même langage, donnez une preuve de l'égalité des langages en utilisant les propriétés algébriques des opérateurs des expressions régulières. Si elle désignent des langages différents, donnez un exemple de chaîne qui fait partie de l'un des langages mais pas de l'autre.
(6) Jouer avec le programme egrep: Ce programme est disponible sous Unix et peut être appelé avec une commande Unix. Essayez d'utiliser l'outil egrep (qui fait la recherche d'un patron défini par une expression régulière) pour vous familiariser avec les expressions régulières. Par exemple, si le fichier test.txt contient la chaîne accbbb et si vous utilisez
egrep "(a|b)c*cbb*" test.txt
vous allez voir toutes les lignes du fichier qui contiennent un patron "(a|b)c*cbb*", tel que accbbb.
Note: Vous pouvez utiliser le tutoriel RegexOne pour vous familiariser avec la notation utilisée par egrep, la classe Pattern en Java, et Lex.
(7) Programmer un simple analyseur en Java: Svp, écrire un programme simple en Java qui demande l'usager une chaîne de caractères, et qui vérifie si la chaîne contient une sous-chaîne correspondant à l'expression a*b. Il devrait sortir toutes les sous-chaînes de cette sorte.
(8) Utiliser la classe Pattern de Java: Le package utilitaire regex de Java contient les classe Pattern et Matcher (voir Java documentation). Le méthode compile de la classe Pattern génère un "pattern" qui peut être utilisé pour créer un objet "matcher" qui contient un algorithme pour analyser une chaîne de caractères pour la présence d'un patron défini par une expression régulière (de type regex) qui était donnée comme paramètre à la méthode compile. Voici un programme exemple qui utilise ces classes, préparé par Ahmed Jeddah inspiré par l'exemple dans un tutoriel Java qui contient aussi des explications sur la syntaxe des expressions régulières acceptées par Pattern. Vous avez les tâches suivantes: