split
peut s’implémenter assez facilement récursivement, surtout avec les fonctions créés plus tôt dans la partie 1. Hint: essaye de voire comment tu peux transformer le retour de split [2; 3]
en le retour de split [1; 2; 3]
.
Une expression régulière permet de définir un schéma et d’ensuite vérifier si une entrée suis ce schéma. C’est typiquement utilisé sur les chaînes de caractères, par exemple pour vérifier si une chaîne de caractères ressemble à une adresse email.
Une expression régulière se défini par composition d’expression régulières plus simples, jusqu’à ce qu’on n’utilise que les briques de base. Ici, la brique de base est Symbole 'a
qui accepte un unique symbole. Union
, Produit
et Repetition
sont utilisés pour composer des expressions régulière en une expression régulière plus complexe.
Par exemple, on peut vouloir réaliser la vérification suivante: la chaîne de caractère en entrée doit commencer par la lettre 'a’, suivi de soit 'b’, soit 'c' et enfin doit avoir plusieurs 'd’. Dans cet exemple "acddd" est valide, "abd" l’est aussi, mais "abc" et "bdd" ne le sont pas.
Dans cet exemple, le "suivi de" correspond à l’opération de Produit
et le "soit x, soit y" correspond à l’opération d'Union
. L’expression que j’ai décrite peut donc s’écrire Produit(Symbole 'a', Produit(Union (Symbole 'b', Symbole 'c'), Repetition (Symbole 'd')))
.
Si j’ai une recommandation à avoir pour l’implémentation, c’est que tu écrives tout plein de tests les plus simple possible pour savoir ce qui fonctionne et ce qui ne fonctionne pas. Par exemple accept ['a'] (Symbole 'a')
doit retourner True
alors que accept ['a';'a'] (Symbole 'a')
doit retourner False
.
L’implémentation de chaque cas va en difficulté croissante: Symbole
est plus simple à implémenter que Union
, qui est plus simple que Produit
, qui est plus simple que Repetition
. Donc il vaut mieux commencer par des tests d’expression régulière utilisant Symbole
uniquement, puis y ajouter Union
, etc.