web-dev-qa-db-ja.com

左線形および右線形文法

以下の言語の左線形と右線形の文法を作成するのに助けが必要ですか?

a)  (0+1)*00(0+1)*
b)  0*(1(0+1))*
c)  (((01+10)*11)*00)*

A)の場合:

Left-linear
S --> B00 | S11
B --> B0|B1|011

Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1

これは正しいです? bとcのサポートが必要です。

15
user1585646

正規表現から同等の正規文法を構築する

まず、正規表現(RE)から正規文法(RG)を構築するためのいくつかの簡単なルールから始めます。
私は右線形文法のルールを書いています(左線形文法の同様のルールを書く演習として残します)

注:変数には大文字が使用され、文法では端末には小文字が使用されます。 NULLシンボルは^です。用語 '任意の数'は、0回以上のスタークロージャーを意味します。

[基本的なアイデア]

  • SINGLE TERMINAL: REが単にe (e being any terminal)の場合、Gを記述できます。プロダクションルールS --> eS is the start symbol)は1つだけで、同等のRGになります。

  • NION OPERATION: REがe + fの形式である場合、両方のe and f are terminalsで、2つのプロダクションルールS --> e | fを使用してGを記述できますが、これは同等のRGです。

  • CONCATENATION: REがefの形式の場合、両方のe and f are terminalsで、2つのプロダクションルールS --> eA, A --> fを使用してGを記述できますが、これは同等のRGです。

  • STAR CLOSURE: REがe*の形式である場合、e is a terminalおよび* Kleene star closure演算では、GS --> eS | ^の2つの生成ルールを記述でき、これは同等のRGです。

  • PLUS CLOSURE: REがeの形式の場合+、ここで、e is a terminalおよび+ Kleene plus closure操作では、Gに2つのプロダクションルールを記述できます。S --> eS | eは、同等のRGです。

  • STAR CLOSURE ON UNION: REが(e + f)*の形式の場合、両方のe and f are terminalsGS --> eS | fS | ^に3つのプロダクションルールを記述でき、これは同等のRGです。 。

  • PLUS CLOSURE ON UNION: REが(e + f)の形式の場合+ここで、e and f are terminalsは、Gに4つのプロダクションルールを記述できます。S --> eS | fS | e | fは、同等のRGです。

  • STAR CLOSURE ON CONCATENATION: REが(ef)*の形式の場合、両方のe and f are terminalsGS --> eA | ^, A --> fSに3つのプロダクションルールを記述でき、これは同等のRGです。

  • PLUS CLOCURE ON CONCATENATION: REが(ef)の形式の場合+、両方のe and f are terminalsGに3つのプロダクションルールを記述できる場合、S --> eA, A --> fS | fは同等のRGです。

上記のすべての規則を理解していることを確認してください。これが要約表です。

+-------------------------------+--------------------+------------------------+
| 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 |
+-------------------------------+--------------------+------------------------+

注:シンボルeおよびfはターミナル、^はNULLシンボル、Sは開始変数

[回答]

今、私たちはあなたの問題に来ることができます。

a)(0+1)*00(0+1)*

言語の説明:すべての文字列は0と1で構成され、少なくとも1組の00を含みます。

  • 右線形文法:

    S-> 0S | 1S | 00A
    A-> 0A | 1A | ^

    文字列は、0sと1sの任意の文字列で開始できます。そのため、ルールs --> 0S | 1S00のペアが少なくとも1つあるため、nullシンボルはありません。 S --> 00A01の後に置くことができるため、00が含まれています。シンボルAは、00の後の0と1を処理します。

  • 左線形文法:

    S-> S0 | S1 | A00
    A-> A0 | A1 | ^

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

言語の説明: 0の任意の数、10と11の任意の数の後に続きます。
{1(0 + 1)= 10 + 11のため}

  • 右線形文法:

    S-> 0S | A | ^
    A-> 1B
    B-> 0A | 1A | 0 | 1

    文字列は任意の数の0で始まるため、ルールS --> 0S | ^が含まれ、次に10を使用して11およびA --> 1B and B --> 0A | 1A | 0 | 1を任意の回数生成するためのルール。

    他の代替正しい線形文法は

    S-> 0S | A | ^
    A-> 10A | 11A | 10 | 11

  • 左線形文法:

    S-> A | ^
    A-> A10 | A11 | B
    B-> B0 | 0

    代替フォームは

    S-> S10 | S11 | B | ^
    B-> B0 | 0

c)(((01+10)*11)*00)*

言語の説明:最初に、言語にはnull(^)文字列が含まれます。これは、内部に存在するすべてのものの外側に*(星)があるためです。また、言語の文字列がヌルではなく、最後が00である場合。この正規表現は(((A)* B)* C)*の形式で考えることができます。ここで、(A)*は(01 + 10)です。 *それは01と10の任意の数の繰り返しです。文字列にAのインスタンスがある場合、(A)* BとBが11であるため、Bは間違いなく存在します。
文字列の例{^、00、0000、000000、1100、111100、1100111100、011100、101100、01110000、01101100、0101011010101100、101001110001101100 ....}

  • 左線形文法:

    S-> A00 | ^
    A-> B11 | S
    B-> B01 | B10 |あ

    S --> A00 | ^は、文字列がnullであるか、nullでない場合は00で終わるためです。文字列が00で終わる場合、変数Aはパターン((01 + 10)* + 11)*に一致します。繰り返しますが、このパターンはnullにすることも、11で終わる必要があることもあります。 nullの場合、ASと再度一致します。つまり、文字列は(00)*のようなパターンで終了します。パターンがnullでない場合、B(01 + 10)*と一致します。 Bが可能な限り一致すると、Aは文字列の照合を再開します。これにより、((01 + 10)* + 11)*の最も外側の*が閉じます。

  • 右線形文法:

    S-> A | 00S | ^
    A-> 01A | 10A | 11S

質問の2番目の部分

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

answer
次の理由であなたの解決策は間違っています、

文字列0010を生成できないため、左線形の文法が間違っています。文字列1000は生成できないため、右線形文法は間違っています。どちらも質問(a)の正規表現によって生成された言語です。

[〜#〜]編集[〜#〜]
各正規表現にDFAを追加します。役立つと思うので。

a)(0+1)*00(0+1)*

DFA

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

DFA

c)(((01+10)*11)*00)*

この正規表現でDFAを描画するのは巧妙で複雑です。
このためにDFAを追加したかった

タスクを単純化するために、REの種類の形成は、RE (((01+10)*11)*00)*(a*b)*のように見えると考える必要があります。

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

実際には上記の式aでは、(a*b)*である((01+10)*11)*の形式で自己表現します。

RE (a*b)*(a + b)*b + ^と同じです。 (ab)のDFAは次のとおりです。

DFA

((01+10)*11)*のDFAは次のとおりです。

DFA

(((01+10)*11)* 00 )*のDFAは次のとおりです。

DFA

上記の3つのDFAの構造の類似性を見つけてください。あなたが最初のものを理解しないまで先に進めないでください

79
Grijesh Chauhan

正規表現を左または右の線形正規文法に変換するルール Cheat sheet

2
lordvcs