以下の言語の左線形と右線形の文法を作成するのに助けが必要ですか?
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のサポートが必要です。
まず、正規表現(RE)から正規文法(RG)を構築するためのいくつかの簡単なルールから始めます。
私は右線形文法のルールを書いています(左線形文法の同様のルールを書く演習として残します)
注:変数には大文字が使用され、文法では端末には小文字が使用されます。 NULLシンボルは^
です。用語 '任意の数'は、0回以上のスタークロージャーを意味します。
[基本的なアイデア]
SINGLE TERMINAL: REが単にe (e being any terminal)
の場合、G
を記述できます。プロダクションルールS --> e
(S 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
演算では、G
にS --> 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 terminals
、G
、S --> 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 terminals
、G
、S --> eA | ^, A --> fS
に3つのプロダクションルールを記述でき、これは同等のRGです。
PLUS CLOCURE ON CONCATENATION: REが(ef)の形式の場合+、両方のe and f are terminals
、G
に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 | ^
文字列は、0
sと1
sの任意の文字列で開始できます。そのため、ルールs --> 0S | 1S
と00
のペアが少なくとも1つあるため、nullシンボルはありません。 S --> 00A
、0
は1
の後に置くことができるため、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の場合、A
はS
と再度一致します。つまり、文字列は(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)*
b)0*(1(0+1))*
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は次のとおりです。
((01+10)*11)*
のDFAは次のとおりです。
(((01+10)*11)* 00 )*
のDFAは次のとおりです。
上記の3つのDFAの構造の類似性を見つけてください。あなたが最初のものを理解しないまで先に進めないでください