Лево-Линейная и право-Линейная грамматики
мне нужна помощь в построении левой линейной и правой линейной грамматики для языков ниже?
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 / ^строка может начинаться с любой строкой
0
s и1
s Вот почему включены правила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-->