J'ai besoin d'aide pour construire une grammaire linéaire gauche et droite pour les langues ci-dessous?
a) (0+1)*00(0+1)*
b) 0*(1(0+1))*
c) (((01+10)*11)*00)*
Pour a) j'ai les éléments suivants:
Left-linear
S --> B00 | S11
B --> B0|B1|011
Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1
Est-ce correct? J'ai besoin d'aide avec b & c.
Tout d'abord, je commence par quelques règles simples pour construire une grammaire régulière (RG) à partir d'une expression régulière (RE).
J'écris des règles pour la grammaire linéaire droite (en partant comme un exercice pour écrire des règles similaires pour la grammaire linéaire gauche)
REMARQUE: Les lettres majuscules sont utilisées pour les variables et les petites pour les terminaux en grammaire. Le symbole NULL est ^
. Le terme 'n'importe quel nombre' signifie zéro ou plusieurs fois c'est * la fermeture de l'étoile.
[IDÉE DE BASE]
SINGLE TERMINAL: Si le RE est simplement e (e being any terminal)
, nous pouvons écrire G
, avec une seule règle de production S --> e
(Où S is the start symbol
), est un RG équivalent.
NION OPERATION: Si le RE est de la forme e + f
, Où les deux e and f are terminals
, Nous pouvons écrire G
, avec deux règles de production S --> e | f
, Est un RG équivalent.
CONCATENATION: Si le RE est de la forme ef
, où les deux e and f are terminals
, Nous pouvons écrire G
, avec deux règles de production S --> eA, A --> f
, est un RG équivalent.
CLÔTURE ÉTOILE: Si le RE est de la forme e*
, Où e is a terminal
Et * Kleene star closure
Opération, nous pouvons écrire deux règles de production dans G
, S --> eS | ^
, est un RG équivalent.
PLUS FERMETURE: Si le RE est de la forme e+, où e is a terminal
et + Kleene plus closure
opération, nous pouvons écrire deux règles de production dans G
, S --> eS | e
, est un RG équivalent.
STAR CLOSURE ON UNION: Si le RE est de la forme (e + f) *, où les deux e and f are terminals
, Nous pouvons écrire trois règles de production dans G
, S --> eS | fS | ^
, Est un RG équivalent.
PLUS FERMETURE SUR UNION: Si le RE est de la forme (e + f)+, où les deux e and f are terminals
, nous pouvons écrire quatre règles de production dans G
, S --> eS | fS | e | f
, est un RG équivalent.
CLÔTURE ÉTOILE SUR LA CONCATENATION: Si le RE est de la forme (ef) *, où les deux e and f are terminals
, Nous pouvons écrire trois règles de production dans G
, S --> eA | ^, A --> fS
, Est un RG équivalent.
PLUS FERMETURE SUR LA CONCATENATION: Si le RE est de la forme (ef)+, où les deux e and f are terminals
, nous pouvons écrire trois règles de production dans G
, S --> eA, A --> fS | f
, est un RG équivalent.
Assurez-vous que vous comprenez toutes les règles ci-dessus, voici le tableau récapitulatif:
+-------------------------------+--------------------+------------------------+
| TYPE | REGULAR-EXPRESSION | RIGHT-LINEAR-GRAMMAR |
+-------------------------------+--------------------+------------------------+
| SINGLE TERMINAL | e | S --> e |
| UNION OPERATION | e + f | S --> e | f |
| CONCATENATION | ef | S --> eA, A --> f |
| STAR CLOSURE | e* | S --> eS | ^ |
| PLUS CLOSURE | e+ | S --> eS | e |
| STAR CLOSURE ON UNION | (e + f)* | S --> eS | fS | ^ |
| PLUS CLOSURE ON UNION | (e + f)+ | S --> eS | fS | e | f |
| STAR CLOSURE ON CONCATENATION | (ef)* | S --> eA | ^, A --> fS |
| PLUS CLOSURE ON CONCATENATION | (ef)+ | S --> eA, A --> fS | f |
+-------------------------------+--------------------+------------------------+
remarque: symbole
e
etf
sont des terminaux, ^ est le symbole NULL etS
est la variable de début
[RÉPONSE]
Maintenant, nous pouvons venir à votre problème.
a)(0+1)*00(0+1)*
Description de la langue: Toutes les chaînes se composent de 0 et de 1, contenant au moins une paire de
00
.
Grammaire linéaire droite:
S -> 0S | 1S | 00A
A -> 0A | 1A | ^
La chaîne peut commencer par n'importe quelle chaîne de 0
Et 1
S c'est pourquoi les règles incluses s --> 0S | 1S
Et Parce qu'au moins une paire de 00
, Il n'y a pas symbole nul. S --> 00A
Est inclus car 0
, 1
Peut être après 00
. Le symbole A
s'occupe des 0 et des 1 après le 00
.
Grammaire linéaire gauche:
S -> S0 | S1 | A00
A -> A0 | A1 | ^
b)0*(1(0+1))*
Description de la langue: Tout nombre de 0, suivi de 10 et 11.
{car 1 (0 + 1) = 10 + 11}
Grammaire linéaire droite:
S -> 0S | A | ^
A -> 1B
B -> 0A | 1A | 0 | 1
La chaîne commence par un nombre quelconque de 0
Donc la règle S --> 0S | ^
Est incluse, puis la règle pour générer 10
Et 11
Pour un certain nombre de fois en utilisant A --> 1B and B --> 0A | 1A | 0 | 1
.
Une autre grammaire linéaire droite alternative peut être
S -> 0S | A | ^
A -> 10A | 11A | 10 | 11
Grammaire linéaire gauche:
S -> A | ^
A -> A10 | A11 | B
B -> B0 | 0
Une autre forme peut être
S -> S10 | S11 | B | ^
B -> B0 | 0
c)(((01+10)*11)*00)*
Description de la langue: Premièrement, la langue contient une chaîne nulle (^) car il y a une * (étoile) à l'extérieur de tout ce qui est présent à l'intérieur (). De plus, si une chaîne dans le langage n'est pas nulle qui se termine par un défi avec 00. On peut simplement penser à cette expression régulière sous la forme de (((A) * B) * C) *, où (A) * est (01 + 10) * c'est-à-dire n'importe quel nombre de répétitions de 01 et 10. S'il y a une instance de A dans la chaîne, il y aurait un B avec défi car (A) * B et B est 11.
Quelques exemples de chaînes {^, 00, 0000, 000000, 1100, 111100, 1100111100, 011100, 101100, 01110000, 01101100, 010101101010111100, 101001110001101100 ....}
Grammaire linéaire gauche:
S -> A00 | ^
A -> B11 | S
B -> B01 | B10 | UNE
S --> A00 | ^
Car toute chaîne est soit nulle, soit si elle n'est pas nulle, elle se termine par un 00
. Lorsque la chaîne se termine par 00
, La variable A
correspond au modèle ((01 + 10)* + 11)*
. Encore une fois, ce modèle peut être nul ou doit se terminer par 11
. Si sa valeur est nulle, alors A
correspond à nouveau à S
, c'est-à-dire que la chaîne se termine par un modèle comme (00)*
. Si le modèle n'est pas nul, B
correspond à (01 + 10)*
. Lorsque B
correspond à tout ce qu'il peut, A
recommence à faire correspondre la chaîne. Cela ferme le plus * dans ((01 + 10)* + 11)*
.
Grammaire linéaire droite:
S -> A | 00S | ^
A -> 01A | 10A | 11S
Deuxième partie de votre question:
For a) I have the following:
Left-linear
S --> B00 | S11
B --> B0|B1|011
Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1
( réponse )
Votre solution est erronée pour les raisons suivantes,
La grammaire linéaire gauche est incorrecte car la chaîne 0010
N'est pas possible de générer. La grammaire linéaire droite est incorrecte car la chaîne 1000
N'est pas possible de générer. Bien que les deux soient dans un langage généré par l'expression régulière de la question (a).
MODIFIER
Ajout de DFA pour chaque expression régulière. afin qu'on puisse le trouver utile.
a)(0+1)*00(0+1)*
b)0*(1(0+1))*
c)(((01+10)*11)*00)*
Dessiner DFA pour cette expression régulière est astucieux et complexe.
Pour cela, je voulais ajouter des DFA
Pour simplifier la tâche, nous devrions penser que la formation type de RE pour moi le RE (((01+10)*11)*00)*
Ressemble à (a*b)*
(((01+10)*11)* 00 )*
( a* b )*
En fait dans l'expression ci-dessus a
elle-même sous la forme de (a*b)*
Qui est ((01+10)*11)*
RE (a*b)*
Est égal à (a + b)*b + ^
. Le DFA pour (a b) est le suivant:
DFA pour ((01+10)*11)*
Est:
DFA pour (((01+10)*11)* 00 )*
Est:
Essayez de trouver des similitudes dans la construction de plus de trois DFA. n'avance pas tant que tu ne comprends pas le premier