Étapes pour créer un NFA à partir d'une expression régulière

J'ai des problèmes 'décrivant chaque étape' lors de la création d'un NFA à partir d'une expression régulière. La question est la suivante:

Convertissez l'expression régulière suivante en un automate à états finis non déterministe (NFA), décrivant clairement les étapes de l'algorithme que vous utilisez: (b / a) * b (A / b)

J'ai fait une simple machine à 3 états, mais c'est beaucoup de l'intuition. Ceci est une question d'un examen passé écrit par mon conférencier, qui a également écrit l'explication suivante de Thompson algorithme: http://www.cs.may.ie/staff/jpower/Courses/Previous/parsing/node5.html

Quelqu'un Peut éclaircir comment décrire clairement chaque étape'? Cela semble juste être un ensemble de règles de base plutôt qu'un algorithme avec des étapes à suivre.

Peut-être qu'il y a un algorithme que j'ai passé sous silence quelque part, mais jusqu'à présent, je les ai juste créés avec une supposition éclairée.

21
demandé sur Johan 2012-08-05 22:58:15

2 réponses

Version courte pour l'approche générale.
Il y a un algo là-bas appelé L'algorithme de construction Thompson-McNaughton-Yamada ou parfois juste " Thompson Construction."On construit des NFA intermédiaires, remplissant les pièces en cours de route, tout en respectant la priorité de l'opérateur: premières parenthèses, puis étoile de Kleene (par exemple, a*), puis concaténation (par exemple, ab), suivie d'une alternance (par exemple, a|b).

Voici une procédure pas à pas en profondeur pour la construction (b / a)*b(a|b) ' s NFA

Construire le niveau supérieur

  1. Gérer les parenthèses. Note: dans l'implémentation réelle, il peut être logique de gérer les parenthèses via un appel récursif sur leur contenu. Par souci de clarté, je vais reporter l'évaluation de tout ce qui se trouve à l'intérieur de parens.

  2. Étoiles Kleene: un seul * là, donc nous construisons une machine à étoiles Kleene appelée P (qui contiendra plus tard b|a). Intermédiaire résultat:
    Automates finis non déterministes pour P*

  3. Concaténation: attachez P à b et attachez b à une machine d'espace réservé appelée Q (qui contiendra (a / b). Résultat intermédiaire:
    Automates finis non déterministes pour P * bQ

  4. Il n'y a pas d'alternance en dehors des parenthèses, donc nous l'ignorons.

Maintenant, nous sommes assis sur une machine P*bQ. (Notez que nos espaces réservés P et Q ne sont que des machines de concaténation.) On remplace le bord P par le NFA pour b / a, et on remplace le bord Q par le NFA pour A / b Via récursif l'application de la procédure ci-dessus.


Bâtiment P

  1. Skip. Pas de parens.

  2. Skip. Pas d'étoiles Kleene.

  3. Skip. Pas de contatenation.

  4. Construire l'alternance de la machine pour b|a. Résultat intermédiaire:
    NFA pour b ou a


L'Intégration De P

Ensuite, nous revenons à cette machine P*bQ et nous arrachons le bord P. Nous avons la source du bord P servir de départ l'état de destination pour la machine P, et la destination du bord p servent d'état de destination pour la machine P. Nous faisons également rejeter cet état (enlever sa propriété d'être un État d'acceptation). Le résultat ressemble à ceci:
entrez la description de l'image ici


Bâtiment Q

  1. Skip. Pas de parens.

  2. Skip. Pas d'étoiles Kleene.

  3. Skip. Pas de contatenation.

  4. Construire la machine d'alternance pour a / B. incidemment, l'alternance est commutative, donc a / b est logiquement équivalent à b / A. (Lire: sauter ce diagramme de note de bas de page mineur par paresse.)


L'Intégration De Q

Nous faisons ce que nous avons fait avec P ci-dessus, sauf en remplaçant le bord Q par la machine intermedtae b|a que nous avons construite. C'est le résultat:
entrez la description de l'image ici

Tada! Euh, je veux dire, QED.


Vous voulez en savoir plus?

Toutes les images ci-dessus ont été générées à l'aide de un outil en ligne pour conversion automatique d'expressions régulières en automates finis non déterministes . Vous pouvez trouver son code source pour L'algorithme de construction Thompson-McNaughton-Yamada en ligne.

L'algorithme est également abordé dans les compilateurs Aho: Principles, Techniques, and Tools , bien que son explication soit clairsemée sur les détails de l'implémentation. Vous pouvez également apprendre de une implémentation de la construction Thompson en C par L'excellent Russ Cox, qui décrit quelques détails dans un article populaire sur expression régulière correspondant .

61
répondu Wayland Smith 2014-08-14 19:14:43

Dans le référentiel GitHub ci-dessous, vous pouvez trouver une implémentation Java de la construction de Thompson où d'abord un NFA est créé à partir de l'expression rationnelle, puis une chaîne d'entrée est mise en correspondance avec ce NFA:

Https://github.com/meghdadFar/regex

0
répondu MAZDAK 2016-11-30 14:43:46