🧩 Des expressions régulières aux machines d'états

Série noire - le Labo Machine d'état de parsing. Tutoriel du FSM simulator : écrire une expression régulière, la transformer en machine d'états, la lire et la tester, étape par étape.

Tutoriel - FSM simulator, type DFA

0Ce qu'on va faire, et pourquoi ça compte

Une expression régulière décrit un ensemble de mots permis : (navire+voilier) permet exactement deux mots. Une machine d'états fait le même travail caractère par caractère : elle part d'un état de départ, chaque caractère lu la fait changer d'état, et à la fin du mot elle dit oui ou non.

Les deux sont équivalentes : toute expression régulière se transforme en machine d'états. C'est exactement ce que fait un compilateur quand il découpe votre code en mots-clés, parenthèses et opérateurs avant de le comprendre. Le FSM simulator fait cette transformation sous vos yeux et dessine la machine obtenue.

On construit ici trois petites machines sur le thème des bateaux, puis vous appliquez la même méthode au if du laboratoire.

1Ouvrir et régler le simulateur

  1. Ouvrir ivanzuzak.info/noam/webapps/fsm_simulator. La page est en anglais et se lit de haut en bas, en trois sections numérotées.
  2. Dans la section ① Create automaton, rester sur l'onglet Input regex.
  3. Écrire l'expression dans le champ or write your own. Le champ devient vert quand l'expression est valide, rouge sinon.
  4. Régler la liste Select generated FSM type sur DFA. Les autres types (eNFA, NFA) dessinent des machines avec plusieurs chemins possibles pour un même caractère ; le DFA en a un seul, c'est celui qu'on programme.
  5. Cliquer Create automaton. Le graphe apparaît plus bas, dans la section ③ Transition graph.

2La syntaxe du simulateur

Le simulateur accepte une syntaxe réduite, plus ancienne que celle de Python. Six symboles suffisent :

SymboleSensExemple
a, B, 9, =Le caractère lui-mêmeif : un i, puis un f
+OU : l'un ou l'autre(navire+voilier) : navire, ou voilier
*Zéro fois ou plusa *b : a, des espaces ou aucun, puis b
( )Regrouper(navire+voilier)s : navires ou voiliers
$Le mot vide : riennavire(s+$) : navire ou navires
\( \)Une vraie parenthèse, échappée par la barre oblique inverseif\( : i, f, puis le caractère (

⚠️ Le piège du + : en Python, + veut dire « une fois ou plus ». Ici, il veut dire OU, comme le | de Python. Et le | n'existe pas dans le simulateur.

⚠️ Le piège des parenthèses : navire(s) sans barre oblique reconnaît seulement navires, car les parenthèses regroupent. Pour reconnaître le texte navire(s) avec ses parenthèses, il faut écrire navire\(s\).

L'aide-mémoire REGEX de la semaine 6 donne la syntaxe complète de Python, pour comparer.

3Lire le graphe

💡 Les numéros des états sont choisis par le simulateur, pas par vous. Deux machines équivalentes peuvent avoir des numéros différents : comparez la forme et le nombre d'états, pas les numéros.

4Des parenthèses littérales

Premier objectif : reconnaître exactement le texte navire(s), parenthèses comprises.

navire\(s\)
Machine d'états de navire\(s\) : une chaîne de neuf transitions n, a, v, i, r, e, parenthèse ouvrante, s, parenthèse fermante, de l'état 0 à l'état acceptant 1, et un état puits 10
11 états : une seule chaîne de 0 à l'état acceptant 1, et l'état puits 10 pour tout le reste.

La machine est une ligne droite : un état par caractère lu. À chaque état, le seul bon caractère fait avancer ; tous les autres mènent à l'état puits. Remarquez que la parenthèse est devenue un caractère comme les autres sur les flèches ( et ).

5L'alternative

Deuxième objectif : reconnaître navire ou voilier.

(navire+voilier)
Machine d'états de (navire+voilier) : depuis l'état 0, une branche part sur n et une autre sur v ; les deux branches arrivent au même état acceptant 1 ; l'état puits est 13
14 états : depuis 0, la branche du haut lit navire, celle du bas lit voilier, et les deux finissent au même état acceptant 1.

Le premier caractère décide du chemin : n part en haut, v en bas. Les deux branches se rejoignent à la fin sur le même état acceptant : le simulateur fusionne les états qui ont le même avenir.

6Combiner les deux

Troisième objectif : reconnaître navire(s) ou voilier(s). On regroupe l'alternative avec de vraies parenthèses, puis on ajoute les parenthèses littérales.

(navire+voilier)\(s\)
Machine d'états de (navire+voilier)\(s\) : les branches navire et voilier se rejoignent à l'état 3, suivi d'une chaîne parenthèse ouvrante, s, parenthèse fermante jusqu'à l'état acceptant 1 ; état puits 16
17 états : les deux branches se rejoignent à l'état 3, puis une seule chaîne lit (s) jusqu'à l'état acceptant 1.

Les deux sortes de parenthèses travaillent ensemble : ( ) regroupe (navire+voilier) pour que le OU ne s'applique qu'aux deux mots, et \( \) devient du texte à reconnaître. La partie commune, (s), n'est dessinée qu'une fois.

7Faire lire un mot à la machine

  1. Dans la section ② Simulate automaton, écrire un mot dans le champ See if this fits, par exemple voilier(s).
  2. Cliquer Start, puis Read next pour lire un caractère à la fois : l'état rose avance dans le graphe. Read all lit tout d'un coup, Step backward recule d'un caractère, Reset recommence.
  3. À la fin, le mot est accepté si l'état rose est un double cercle.
  4. Les boutons Acceptable string et Unacceptable string génèrent des mots que la machine accepte ou refuse : pratique pour vérifier qu'elle ne laisse rien passer de trop.
✅ Acceptés par (navire+voilier)\(s\) : navire(s), voilier(s)
❌ Refusés : navire, voiliers, navire(s, bateau(s)

Retour à l'énoncé du Labo Machine d'état de parsing · outil : FSM simulator (Ivan Zuzak et Vedrana Jankovic, bibliothèque noam).