Links-lineare und rechts-lineare Grammatiken

9

Ich brauche Hilfe beim Aufbau einer links-linearen und rechts-linearen Grammatik für die folgenden Sprachen?

%Vor%

Für a) Ich habe folgendes:

%Vor%

Stimmt das? Ich brauche Hilfe bei b & amp; c.

    
user1585646 11.12.2012, 08:38
quelle

2 Antworten

73

Konstruieren einer äquivalenten regulären Grammatik aus einem regulären Ausdruck

Zuerst beginne ich mit ein paar einfachen Regeln, um Reguläre Grammatik (RG) aus Regulärem Ausdruck (RE) zu konstruieren.
Ich schreibe Regeln für die rechte lineare Grammatik (als Übung lasse ich ähnliche Regeln für die linke lineare Grammatik schreiben)

HINWEIS: Großbuchstaben werden für Variablen verwendet und klein für Terminals in Grammatik. Das NULL-Symbol ist ^ . Term 'any number' bedeutet null oder mehr mal das ist * Sternschluss.

[ BASISIDEE ]

  • SINGLE TERMINAL: Wenn der RE einfach e (e being any terminal) ist, können wir G schreiben, mit nur einer Produktionsregel S --> e (wobei S is the start symbol ) ein Äquivalent ist RG.

  • UNION OPERATION: Wenn der RE die Form e + f hat, wo beide e and f are terminals sind, können wir G schreiben, mit zwei Produktionsregeln S --> e | f , ist ein gleichwertig RG.

  • KONZENTRATION: Wenn die RE die Form ef hat, können wir e and f are terminals schreiben, G , mit zwei Produktionsregeln S --> eA, A --> f , ist ein Äquivalent RG.

  • STAR CLOSURE: Wenn der RE die Form e* hat, wobei e is a terminal und * Kleene star closure Operation, können wir zwei Produktionsregeln in G ,% co_de schreiben %, ist ein äquivalentes RG.

  • PLUS CLOSURE: Wenn die RE die Form e + hat, können wir in S --> eS | ^ und e is a terminal operation zwei Produktionsregeln schreiben + Kleene plus closure , G , ist ein äquivalentes RG.

  • STAR CLOSURE ON UNION: Wenn der RE die Form (e + f) * hat, wo beide S --> eS | e sind, können wir drei Produktionsregeln in e and f are terminals ,% schreiben co_de%, ist ein äquivalentes RG.

  • PLUS VERSCHLUSS AUF UNION: Wenn der RE die Form (e + f) + hat, wo wir beide G , können wir vier Produktion schreiben Regeln in S --> eS | fS | ^ , e and f are terminals , ist ein äquivalentes RG.

  • STAR CLOSURE ON CONCATENATION: Wenn der RE die Form (ef) * hat, wo beide G sind, können wir drei Produktionsregeln in S --> eS | fS | e | f , e and f are terminals schreiben , ist ein äquivalentes RG.

  • PLUS VERSCHLUSS: Wenn der RE die Form (ef) + hat, wo beide G , können wir drei Produktionsregeln schreiben S --> eA | ^, A --> fS , e and f are terminals , ist ein äquivalentes RG.

Stellen Sie sicher, dass Sie alle oben genannten Regeln verstehen, hier ist die Übersichtstabelle:

%Vor%
  

Hinweis: Das Symbol% ​​co_de% und G sind Terminals, ^ ist ein NULL-Symbol und S --> eA, A --> fS | f ist die Startvariable

[ANTWORT]

Jetzt können wir zu dir Problem kommen.

a) e

  

Sprachbeschreibung: Alle Strings bestehen aus 0s und 1s und enthalten mindestens ein Paar f .

  • Rechte lineare Grammatik:

    S - & gt; 0S | 1S | 00A
    A - & gt; 0A | 1A | ^

    String kann mit einer beliebigen Zeichenfolge von S s und (0+1)*00(0+1)* s beginnen, weshalb die Regeln 00 und Da mindestens ein Paar 0 enthalten sind, gibt es kein Nullsymbol. 1 ist enthalten, weil s --> 0S | 1S , 00 nach S --> 00A stehen können. Das Symbol% ​​co_de% kümmert sich um die 0 und 1 nach dem 0 .

  • Linke lineare Grammatik:

    S - & gt; S0 | S1 | A00
    A - & gt; A0 | A1 | ^

b) 1

  

Sprachbeschreibung: Eine beliebige Anzahl von 0, gefolgt von einer beliebigen Zahl von 10 und 11.
        {weil 1 (0 + 1) = 10 + 11}

  • Rechte lineare Grammatik:

    S - & gt; 0S | A | ^
    A - & gt; 1B
    B - & gt; 0A | 1A | 0 | 1

    String beginnt mit einer beliebigen Anzahl von 00 , also wird Regel A eingeschlossen, dann Regel für das Erzeugen von 00 und 0*(1(0+1))* für beliebig viele Male mit 0 .

    Eine andere alternative rechtslineare Grammatik kann

    sein

    S - & gt; 0S | A | ^
    A - & gt; 10A | 11A | 10 | 11

  • Linke lineare Grammatik:

    S - & gt; A | ^
    A - & gt; A10 | A11 | B
    B - & gt; B0 | 0

    Eine alternative Form kann

    sein

    S - & gt; S10 | S11 | B | ^
    B - & gt; B0 | 0

c) S --> 0S | ^

  

Sprachbeschreibung: Erstens enthält die Sprache null (^) Zeichenkette, weil dort ein * (Stern) außerhalb jedes im Inneren vorhandenen Gegenstands () steht. Auch wenn eine Zeichenkette in der Sprache nicht Null ist, die trotzig mit 00 endet. Man kann einfach diesen regulären Ausdruck in Form von (((A) * B) * C) * denken, wobei (A) * (01 + 10) ist * Das ist eine beliebige Anzahl von Wiederholungen von 01 und 10.   Wenn es eine Instanz von A in der Zeichenkette gibt, würde ein B trotzig sein, weil (A) * B und B 11. ist   Einige Beispielstrings {^, 00, 0000, 000000, 1100, 111100, 1100111100, 011100, 101100, 01110000, 01101100, 0101011010101100, 101001110001101100 ....}

  • Linke lineare Grammatik:

    S - & gt; A00 | ^
    A - & gt; B11 | S
    B - & gt; B01 | B10 | A

    10 , weil eine beliebige Zeichenkette entweder null ist, oder wenn sie nicht null ist, endet sie mit einem 11 . Wenn die Zeichenfolge mit A --> 1B and B --> 0A | 1A | 0 | 1 endet, stimmt die Variable (((01+10)*11)*00)* mit dem Muster S --> A00 | ^ überein. Auch dieses Muster kann entweder null sein oder mit 00 enden. Wenn es null ist, stimmt 00 mit A überein, d. H. Die Zeichenfolge endet mit dem Muster wie ((01 + 10)* + 11)* . Wenn das Muster nicht null ist, stimmt 11 mit A überein. Wenn S mit allem übereinstimmt, was es kann, beginnt (00)* mit der Übereinstimmung der Zeichenfolge. Dies schließt das äußerste * in B .

  • Rechte lineare Grammatik:

    S - & gt; A | 00S | ^
    A - & gt; 01A | 10A | 11S

Zweiter Teil Ihrer Frage :

%Vor%

( Antwort )
Ihre Lösung ist aus folgenden Gründen falsch:

Links-lineare Grammatik ist falsch, da String (01 + 10)* nicht generierbar ist. Die rechts-lineare Grammatik ist falsch. Da die Zeichenfolge B nicht generiert werden kann. Obwohl beide Sprachen durch den regulären Ausdruck der Frage (a) erzeugt werden.

BEARBEITEN
Hinzufügen von DFAs für jeden regulären Ausdruck damit man es hilfreich finden kann.

a) A

b) ((01 + 10)* + 11)*

c) 0010

Das Zeichnen von DFA für diesen regulären Ausdruck ist ein Trick und komplex.
Dazu wollte ich DFAs

hinzufügen

Um die Aufgabe zu vereinfachen, sollten wir die Artbildung von RE denken für mich sieht die RE 1000 wie (0+1)*00(0+1)*

aus %Vor%

Tatsächlich in obigem Ausdruck 0*(1(0+1))* it self in Form von (((01+10)*11)*00)* das ist (((01+10)*11)*00)*

RE (a*b)* ist gleich a . Der DFA für (a b) lautet wie folgt:

DFA für (a*b)* ist:

DFA für ((01+10)*11)* ist:

Versuchen Sie, die Ähnlichkeit in der Konstruktion der obigen drei DFA zu finden. gehe nicht weiter, bis du den ersten nicht verstanden hast

    
Grijesh Chauhan 19.12.2012, 05:13
quelle
0

Regeln zum Konvertieren regulärer Ausdrücke in lineare oder reguläre lineare reguläre Grammatik

    
diabolicfreak 20.01.2018 12:43
quelle