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 ☺
Comments