Comment puis-je convertir une langue régulière en sa grammaire sans correspondance équivalente? Est-il nécessaire de construire la DFA correspondant à cette expression régulière ou existe-t-il une règle pour une telle conversion? P>
Par exemple, considérez l'expression régulière suivante p>
01 + 10 (11) * sup> p> blockQuote>
Comment puis-je décrire la grammaire correspondant à la valeur ci-dessus? p>
3 Réponses :
Je suppose que vous voulez dire la convertir en une grammaire formelle avec des règles de la forme V-> w, où v est un non mortminal et W est une chaîne de bornes / non-mines. Pour commencer, vous pouvez simplement dire (mélanger la syntaxe CFG et Regex): où S est le symbole de démarrage. Maintenant, brisons-le un peu (et ajoutons de la clarté de clarté): p> La clé est de convertir enfin, nous convertirons * code> ES et
+ es à la récursion. Premièrement, nous convertirons l'étoile kleène en un plus en insérant une règle intermédiaire qui accepte la chaîne vide: p>
+ Code> Notation à la récursivité: P>
S -> 0 A 1 0 B
A -> 1
A -> A 1
B -> (empty)
B -> C
C -> 11
C -> C 11
changer A + B sur la grammaire p>
A -> 01 A -> 10B B -> (empty) B -> 11B
changer A * à p>
G -> AB
changer AB sur p>
G -> (empty) G -> A G
Pourquoi B -> 11 B> au lieu de B -> B11 B>?
Pourquoi changez-vous A + B code> dans
g -> A code> et
g -> b code>? Ne
+ code> signifie-t-il "une ou plusieurs de l'expression précédente" dans Regex?
@Leonoverweel dans la théorie de la langue formelle A + B code> est utilisé pour désigner la somme, dans la notation de langages de programmation
A | B code> est utilisé à la place.
En réalité, différentes grammaires CFG peuvent produire la même langue. Donc, étant donné une expression régulière (langue régulière), sa cartographie de la CFG n'est pas unique. P>
Certainement, vous pouvez construire un CFG qui entraîne une expression régulière donnée. Les réponses ci-dessus ont montré une certaine manière pour y parvenir. p>
J'espère que cela vous donne une idée de haut niveau. P>
Vous vous demandez s'il existe des implémentations de bibliothèque open source utiles pour cette tâche en maintenant