Лево-линейная и праволинейная грамматика
Мне нужна помощь в построении лево-линейной и праволинейной грамматики для языков ниже?
a) (0+1)*00(0+1)*
b) 0*(1(0+1))*
c) (((01+10)*11)*00)*
Для а) у меня есть следующее:
Left-linear
S --> B00 | S11
B --> B0|B1|011
Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1
Это правильно? Мне нужна помощь с B & C.
2 ответа
Построение эквивалентной регулярной грамматики из регулярного выражения
Сначала я начну с нескольких простых правил построения регулярной грамматики (RG) из регулярного выражения (RE).
Я пишу правила для правой линейной грамматики (оставляя в качестве упражнения написание аналогичных правил для левой линейной грамматики)
ПРИМЕЧАНИЕ: заглавные буквы используются для переменных, и маленькие для терминалов в грамматике. NULL символ ^
, Термин "любое число" означает ноль или более раз, которые означают * закрытие звезды.
[ ОСНОВНАЯ ИДЕЯ ]
ОДИНОЧНЫЙ ТЕРМИНАЛ: если 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 is a terminal
а также+ Kleene plus closure
операции, мы можем написать два правила производства вG
,S --> eS | e
, является эквивалентом RG.ЗАКРЫТИЕ ЗВЕЗДЫ НА СОЮЗЕ: Если RE имеет форму (e + f)*, где оба
e and f are terminals
мы можем написать три правила производства вG
,S --> eS | fS | ^
, является эквивалентом RG.ПЛЮС ЗАКРЫТИЕ НА СОЮЗЕ: Если 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
переменная начала
[ОТВЕТ]
Теперь мы можем прийти к вам проблемы.
а) (0+1)*00(0+1)*
Описание языка: Все строки состоят из 0 и 1, содержащие как минимум одну пару
00
,
Правильная линейная грамматика:
S -> 0S | 1S | 00A
A -> 0A | 1А | ^Строка может начинаться с любой строки
0
с и1
Вот почему включены правила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 | 1А | 0 | 1Строка начинается с любого числа
0
так правилоS --> 0S | ^
включены, то правило для генерации10
а также11
за любое количество раз, используяA --> 1B and B --> 0A | 1A | 0 | 1
,Другая альтернативная правая линейная грамматика может быть
S -> 0S | A | ^
A -> 10A | 11А | 10 | 11Левая линейная грамматика:
S -> A | ^
A -> A10 | A11 | В
B -> B0 | 0Альтернативная форма может быть
S -> S10 | S11 | Б | ^
B -> B0 | 0
с) (((01+10)*11)*00)*
Описание языка: Во-первых, язык содержит пустую строку (^), потому что внутри каждой вещи, присутствующей внутри (), есть * (звезда). Кроме того, если строка в языке не является нулевой, которая демонстративно заканчивается на 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 |S --> A00 | ^
потому что любая строка либо нулевая, либо, если она не нулевая, она заканчивается00
, Когда строка заканчивается00
переменнаяA
соответствует шаблону((01 + 10)* + 11)*
, Опять же, этот шаблон может быть либо нулевым, либо должен заканчиваться11
, Если его ноль, тоA
совпадает сS
опять то есть строка заканчивается шаблоном как(00)*
, Если шаблон не является нулевым,B
соответствует(01 + 10)*
, когдаB
соответствует все, что может,A
начинает сопоставлять строку снова. Это закрывает самый-самый * в((01 + 10)* + 11)*
,Правильная линейная грамматика:
S -> A | 00S | ^
A -> 01A | 10А | 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
(ответ)
Ваше решение неверно по следующим причинам,
Левая линейная грамматика неверна, потому что строка 0010
не возможно генерировать. Правильно-линейная грамматика неверна, потому что строка 1000
не возможно генерировать. Хотя оба языка написаны регулярным выражением вопроса (а).
РЕДАКТИРОВАТЬ
Добавление DFA для каждого регулярного выражения. так что можно найти это полезным.
а) (0+1)*00(0+1)*
б) 0*(1(0+1))*
с) (((01+10)*11)*00)*
Рисование DFA для этого регулярного выражения является хитрым и сложным.
Для этого я хотел добавить DFA's
Чтобы упростить задачу, нам следует подумать о том, как мне нужно сформировать своеобразие 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 для (a b) является следующим:
ДФА для ((01+10)*11)*
является:
ДФА для (((01+10)*11)* 00 )*
является:
Попробуйте найти сходство в построении выше трех DFA. не двигайтесь вперед, пока не поймете первый