web-dev-qa-db-fra.com

Grammaires linéaires gauche et droite

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.

15
user1585646

Construire une grammaire régulière équivalente à partir d'une expression régulière

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 et f sont des terminaux, ^ est le symbole NULL et S 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)*

DFA

b)0*(1(0+1))*

DFA

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

DFA pour ((01+10)*11)* Est:

DFA

DFA pour (((01+10)*11)* 00 )* Est:

DFA

Essayez de trouver des similitudes dans la construction de plus de trois DFA. n'avance pas tant que tu ne comprends pas le premier

79
Grijesh Chauhan

Règles pour convertir les expressions régulières en grammaire régulière linéaire gauche ou droite Cheat sheet

2
lordvcs