A$_{da}$ la régulière

Le langage Ada est, par construction, contraint et il n’est par exemple pas aisé de parser facilement des chaînes de caractères.

Même si l’environnement Ada offre des services intéressants, il faut bien avouer que la possibilité d’utiliser des expressions régulières serait un plus.

Qu’à cela ne tienne ! L’écosystème GNAT propose un paquetage GNAT.Regpat que nous allons brièvement présenter dans cet article. Il est à noter que d’autres paquetages similaires existent dans l’écosystème GNAT mais ils sont plus spécifiques et au final moins utiles.

Le paquetage GNAT.Regpat

Ce paquetage offre des services permettant de manipuler des expressions régulières telles que celles disponibles en Perl ou en Python.

L’implémentation permet, soit de manipuler les expressions régulières sous forme de chaînes de caractères (String), soit de compiler ces expressions et de manipuler au final des Pattern_Matcher. Cette deuxième approche est moins directe, mais permet d’avoir quelques raffinements tels que la gestion de la casse ou du multi-lignes.

Les services proposés permettent entre autres :

  • D’évaluer le matching d’une expression régulière ainsi que ses sous expressions,
  • La compilation d’une expression régulière sous la forme d’un Pattern_Matcher.

Exemple

Soit le code suivant :

with GNAT.Regpat, Ada.Text_IO;
use GNAT.Regpat, Ada.Text_IO;

procedure Regexp is
    PM : constant Pattern_Matcher := Compile ("James[[:space:]]+Bond[[:space:]]+00[[:digit:]]$", Case_Insensitive);
    function Match (Data : in String) return Boolean is (Match (PM, Data));
begin
    Put_Line (Match ("James BOND 007")'Image); --> True
    Put_Line (Match ("JamesBond 007")'Image); --> False
    Put_Line (Match ("James Bond ©7")'Image); --> False
    Put_Line (Match ("JAMES BOND 007")'Image); --> True
end Regexp;

Le deuxième matching échoue, car il n’y a pas au moins un espace entre James et Bond. Le troisième échoue, car James Bond est un agent double zéro ayant le permis de tuer et pas un « simple » agent zéro.

Conclusion

Dès que l’on veut parser efficacement du code en Ada, GNAT.Regpat s’avère être indispensable. C’est aussi une brique de base pour faire par exemple des fonctions efficaces de substitution au sein de chaînes de caractères. Si le cœur vous en dit, vous pourriez alors réécrire la commande sed en Ada ☺

Commentaires