Лево-Линейная и право-Линейная грамматики
мне нужна помощь в построении левой линейной и правой линейной грамматики для языков ниже?
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.
2 ответов
построение эквивалентной регулярной грамматики из регулярного выражения
во-первых, я начинаю с некоторых простых правил для построения регулярной грамматики(RG) из регулярного выражения(RE).
Я пишу правила для правой линейной грамматики (оставляя в качестве упражнения писать аналогичные правила для левой линейной грамматики)
Примечание: заглавные буквы используются для переменных и небольшие для терминалов в грамматике. Нулевой символ -^. Термин 'любой номер' означает ноль или более раз, * закрытие звездой.
[ОСНОВНАЯ ИДЕЯ]
ОДИНОЧНЫЙ ТЕРМИНАЛ: если RE просто
e (e being any terminal), мы можем написатьG, только с одним правилом производстваS --> e(гдеS is the start symbol), является эквивалентным RG.ОПЕРАЦИЯ ОБЪЕДИНЕНИЯ: если RE имеет форму
e + f, гдеe and f are terminals, мы можем написатьG, С два производственных правилаS --> e | f, является эквивалентным RG.конкатенация: если RE имеет форму
ef, гдеe and f are terminals, мы можем написатьG, С двумя правилами производстваS --> eA, A --> f, является эквивалентным RG.ЗАКРЫТИЕ ЗВЕЗДЫ: если RE имеет форму
e*, гдеe is a terminalи* Kleene star closureоперация, мы можем написать два производственных правила вG,S --> eS | ^, это эквивалент RG.ПЛЮС ЗАКРЫТИЕ: если RE имеет форму e+, где
e is a terminalи+ Kleene plus closureоперация, мы можем написать два производственных правила вG,S --> eS | e, является эквивалентным RG.ЗАКРЫТИЕ ЗВЕЗДЫ НА СОЮЗЕ: если RE имеет вид (e + f)*, где оба
e and f are terminals, мы можем написать три правила производстваG,S --> eS | fS | ^, является эквивалентным RG.ПЛЮС ЗАКРЫТИЕ НА UNION: если RE имеет вид (e + f)+, где
e and f are terminals, мы можем написать четыре правила производстваG,S --> eS | fS | e | f, является эквивалентным RG.ЗАКРЫТИЕ ЗВЕЗДЫ НА КОНКАТЕНАЦИИ: если RE имеет форму (ef)*, где оба
e and f are terminals, мы можем написать три правила производстваG,S --> eA | ^, A --> fS, является эквивалентным RG.ПЛЮС ЗАКРЫТИЕ КОНКАТЕНАЦИИ: если RE имеет форму (ef)+, где
e and f are terminals, мы можем написать три правила производстваG,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являются терминалами, ^ является нулевым символом иSначало переменной
[ответ]
, мы можем прийти к вам проблема.a) (0+1)*00(0+1)*
язык описание: все строки состоят из 0s и 1s, содержащие по крайней мере одну пару
00.
-
Правая Линейная Грамматика:
S --> 0S | 1S / 00A
A --> 0A | 1A / ^строка может начинаться с любой строкой
0s и1s Вот почему включены правилаs --> 0S | 1Sи потому, что по-крайней мере одна пара00,нет нулевого символа.S --> 00Aвключается, поскольку0,1может быть после00. СимволAзаботится о 0 и 1 после00. -
Левая Линейная Грамматика:
S --> S0 | S1 / A00
A --> A0 | A1 / ^
б) 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/^
Си>-- B0 / 0
c) (((01+10)*11)*00)*
язык описание: во-первых, язык содержит строку null (^), потому что есть * (звезда) снаружи каждой вещи, присутствующей внутри (). Также, если строка в языке не равна null, которая вызывающе заканчивается на 00. Можно просто представить себе это регулярное выражение в виде (((A)* B) * C)*, где (A)* - (01 + 10)*, то есть любое число повторов 01 и 10. Если есть является ли экземпляр a в строке, будет B вызывающе, потому что (A)*B и B равно 11.
Некоторые примеры строк { ^, 00, 0000, 000000, 1100, 111100, 1100111100, 011100, 101100, 01110000, 01101100, 0101011010101100, 101001110001101100 ....}
-
Левая Линейная Грамматика:
S --> A00/^
A --> B11 / S
B --> B01 | B10 / AS --> A00 | ^потому что любая строка либо null, либо если это не null он заканчивается на00. Когда строка заканчивается на00переменнаяAсоответствует шаблону((01 + 10)* + 11)*. Опять же, этот шаблон может быть нулевым или должен заканчиваться на11. Если его null, тоAсовпадает сSопять я.e строка заканчивается шаблоном like(00)*. Если шаблон не равен null,Bсовпадает с(01 + 10)*. КогдаBматчи все возможное,Aснова начинает соответствовать строке. Это закрывает out-most * in((01 + 10)* + 11)*. -
Правая Линейная Грамматика:
S --> A / 00S/^
A -- > 01A | 10A / 11S
вторая часть вопроса:
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
(ответ)
Вы решение неправильно по следующим причинам,
левая линейная грамматика неверна, потому что string 0010 невозможно создать.
Правильно-линейная грамматика неверна Потому что string 1000 невозможно создать. Хотя оба они на языке, генерируемом регулярным выражением вопроса (a).
редактировать
Добавление DFA для каждого регулярного выражения. чтобы можно было найти его полезным.
a) (0+1)*00(0+1)*

б) 0*(1(0+1))*

c) (((01+10)*11)*00)*
рисование DFA для этого регулярного выражения является трюком и сложным.
для этого я хотел добавить DFA в
чтобы упростить задачу, мы должны думать, что вид формирования 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 + ^. DFA для (Ab) в belows:

DFA для ((01+10)*11)* - это:

DFA для (((01+10)*11)* 00 )* - это:

попробуйте найти сходство в строительстве выше трех DFA. не двигайтесь вперед, пока не поймете первого!--316-->
