Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Пример 5.1. Правила определения палиндромов, выраженные в виде контекстно-свободной грамматики, представлены на рис. 5.1. В разделе 5.1.2 мы рассмотрим их подробнее.
Первые три правила образуют базис. Они говорят, что класс палиндромов включает цепочки Е, 0 и 1. Эти правила образуют базис, поскольку ни одна из их правых частей (справа от стрелок) не содержит переменных.
Последние два правила образуют индуктивную часть определения. Например, правило 4 гласит, что если взять произвольную цепочку w из класса Р, то OwO также будет в классе Р. Аналогично, по правилу 5 цепочка 1 w 1 также будет в классе Р. □
- Р^Е 0 1 Р 0Р0 Р -> 1F1
Рис. 5.1. Контекстно-свободная грамматика для палиндромов
5.1.2. Определение контекстно-свободных грамматик
Описание языка с помощью грамматики состоит из следующих четырех важных компонентов.
- Есть конечное множество символов, из которых состоят цепочки определяемого языка. В примере о палиндромах это было множество {0, 1}. Его символы называются терминальными, или терминалами. Существует конечное множество переменных, называемых иногда также нетерминалами, или синтаксическими категориями. Каждая переменная представляет язык, т. е. множество цепочек. В рассмотренном примере была только одна переменная, Р, которая использовалась для представления класса палиндромов в алфавите {0, 1}. Одна из переменных представляет определяемый язык; она называется стартовым символом. Другие переменные представляют дополнительные классы цепочек, которые помогают определить язык, заданный стартовым символом. Имеется конечное множество продукций, или правил вывода, которые представляют рекурсивное определение языка. Каждая продукция состоит из следующих частей:
а) переменная, (частично) определяемая продукцией. Эта переменная часто называется головой продукции;
б) символ продукции —
в) конечная цепочка, состоящая из терминалов и переменных, возможно, пустая. Она называется телом продукции и представляет способ образования цепочек языка, обозначаемого переменной в голове. По этому способу мы оставляем терминалы неизменными и вместо каждой переменной в теле подставляем любую цепочку, про которую известно, что она принадлежит языку этой переменной.
Пример множества продукций приведен на рис. 5.1.
Описанные четыре компонента образуют контекстно-свободную грамматику, или КС-грамматику, или просто грамматику, или КСГ. Мы будем представлять КС - грамматику G ее четырьмя компонентами в виде G = (V, Т, Р, S), где V— множество переменных, Т— терминалов, Р — множество продукций, S — стартовый символ. Пример 5.2. Грамматика Gpa/ для палиндромов имеет вид Gpal = ({P}, {0, 1 },А, Р), где А обозначает множество из пяти продукций (см. рис. 5.1). □
Пример 5.3. Рассмотрим более сложную КС-грамматику, которая представляет выражения типичного языка программирования (в несколько упрощенном виде). Во - первых, ограничимся операторами + и *, представляющими сложение и умножение. Во - вторых, допустим, что аргументы могут быть идентификаторами, однако не произвольными, т. е. буквами, за которыми следует любая последовательность букв и цифр, в том числе пустая. Допустим только буквы аиАи цифры 0 и 1. Каждый идентификатор должен начинаться с буквы а или Ь, за которой следует цепочка из {а, Ъ, 0, 1}*.
В нашей грамматике нужны две переменные. Одна обозначается Е и представляет выражения определяемого языка. Она является стартовым символом. Другая переменная, /, представляет идентификаторы. Ее язык в действительности регулярен и задается регулярным выражением
(а + b)(a + b + 0 + 1)*.
В грамматиках, однако, регулярные выражения непосредственно не используются. Вместо этого будем обращаться к множеству продукций, задающих в точности то же самое, что и соответствующее регулярное выражение.
1. | Е - | |
2. | Е-^Е + Е | |
3. | ||
4. | ||
5. | I- | > а |
6. | /- | >Ь |
7. | I- | > 1а |
8. | /-> lb | |
9. | /- | >/0 |
10. | /->/1 |
Рис. 5.2. Контекстно-свободная грамматика для простых выражений
Грамматика для выражений определяется формально как G - (\Е, /}, Т, Р, Е), где Т = {+, *, (, ), а, Ь, 0, 1}, а Р представляет собой множество продукций, показанное на рис. 5.2. Продукции интерпретируются следующим образом.
Правило 1 является базисным для выражений. Оно гласит, что выражение может быть одиночным идентификатором. Правила 2-4 описывают индуктивное образование выражений. Правила 2 и 3 говорят, что выражение может состоять из двух выражений, соединенных знаком сложения или умножения. Правило 4 — что если заключить произвольное выражение в скобки, то в результате получается также выражение.
Сокращенное обозначение продукций
Продукцию удобно рассматривать как "принадлежащую" переменной в ее голове. Мы будем часто пользоваться словами "продукции для А" или "А-продукции" для обозначения продукций, головой которых является переменная А. Продукции грамматики можно записать, указав каждую переменную один раз и затем перечислив все тела продукций для этой переменной, разделяя их вертикальной чертой. Таким образом, продукции А —> ah А—>а2, ..., А —> а,, можно заменить записью А —» а, | а2 | ... | с^. Например, грамматику для палиндромов (см. рис. 5.1) можно записать в виде Р —> е | 0 | 110Р0 | 1Р1.
t Правила 5-10 описывают идентификаторы I. Правила 5 и 6 образуют базис; они гла-
| сят, что а и b — идентификаторы. Остальные четыре правила описывают индуктивный
i переход: имея произвольный идентификатор, можно приписать к нему справа а, Ь, 0 или
* 1 и получить еще один идентификатор. □
5.1.3. Порождения с использованием грамматики
Для того чтобы убедиться, что данные цепочки принадлежат языку некоторой переменной, мы применяем продукции КС-грамматики. Есть два способа действий. Простейший подход состоит в применении правил "от тела к голове". Мы берем цепочки, про которые известно, что они принадлежат языкам каждой из переменных в теле правила, записываем их в соответствующем порядке вместе с терминалами этого тела и убеждаемся, что полученная цепочка принадлежит языку переменной в голове. Такая процедура называется рекурсивным выводом (recursive inference).
Есть еще один способ определения языка грамматики, по которому продукции применяются "от головы к телу". Мы разворачиваем стартовый символ, используя одну из его продукций, т. е. продукцию, головой которой является этот символ. Затем разворачиваем полученную цепочку, заменяя одну из переменных телом одной из ее продукций, и так далее, пока не получим цепочку, состоящую из одних терминалов. Язык грамматики— это все цепочки из терминалов, получаемые таким способом. Такое использование грамматики называется выведением, или порождением (derivation).
Начнем с примера применения первого подхода — рекурсивного вывода, хотя часто естественнее рассматривать грамматики в качестве применяемых для порождений, и далее мы разовьем систему записи таких порождений.
Пример 5.4. Рассмотрим некоторые из выводов, которые можно сделать, используя грамматику для выражений (см. рис. 5.2). Результаты этих выводов показаны на рис. 5.3. Например, строчка (/') говорит, что в соответствии с продукцией 5 цепочка а принадлежит языку переменной /. Строчки (i/)—(iv) свидетельствуют, что цепочка 600 является идентификатором, полученным с помощью одного применения продукции 6 и затем двух применений продукции 9.
В строчках (v) и (vi) использована продукция 1 для того, чтобы прийти к заключению, что цепочки а и Ь00, которые выведены как идентификаторы в строчках (/') и (/V), принадлежат также и языку переменной Е. В строчке (vii) применяется продукция 2 для вывода, что сумма этих идентификаторов является выражением, в строчке (viii) — продукция 4, и эта же сумма в скобках также представляет собой выражение. В строчке (ix) используется продукция 3 для умножения идентификатора а на выражение, исследованное в строчке (viii). □
Процесс порождения цепочек путем применения продукций "от головы к телу" требует определения нового символа отношения =>. Пусть G= (V, T,P, S)— КС-грамматика. Пусть аА/З— цепочка из терминалов и переменных, где А — переменная. Таким
образом, а и (3— цепочки из (VU Т), А е V. Пусть А —> у— продукция из G. Тогда мы говорим, что аЛР => аур. Если грамматика G подразумевается, то это записывается
g
просто как аА/3=> ау/З. Заметим, что один шаг порождения заменяет любую переменную в цепочке телом одной из ее продукций.
Выведенная | Для языка | Использован | Использо | |
цепочка | переменной | ная продукция | ванные цепочки | |
(0 | a | / | 5 | — |
00 | b | / | 6 | — |
(Hi) | bO | / | 9 | (ii) |
(iv) | bOO | / | 9 | (iii) |
(V) | a | E | 1 | (0 |
(vi) | b№ | E | 1 | (iv) |
(vii) | a + bOO | E | 2 | (v), (vi) |
(viii) | (a + bOO) | E | 4 | (vii) |
(ix) | a* (a + bOO) | E | 3 | (v), (viii) |
Рис. 5.3. Вывод цепочек с использованием грамматики, показанной на рис. 5.2 Для представления нуля, одного или нескольких шагов порождения можно расширить отношение => подобно тому, как функция переходов <5 расширялась до 5 . Для обозначения нуля или нескольких шагов порождения используется символ *.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |


