- •Часть 1
- •Лекция №1 Предисловие п.1. Место системного программного обеспечения в компьютерной системе
- •П.2. Структура спо
- •П.3. Хакеры как движущая сила развития спо
- •Лекция №2
- •1. Формальные языки и грамматики в системе программирования
- •1.1. Структура систем программирования
- •1.2. Языки и цепочки символов. Способы задания языков
- •1.2.1. Общие представления о языках
- •1.2.2. Цепочки символов. Операции над цепочками символов
- •1.2.3. Формальное определение языка
- •1.2.4. Способы задания языков
- •Лекция №3
- •1.3. Грамматики и распознаватели
- •1.3.1. Порождающая грамматика
- •1.3.2. Запись правил грамматики с использованием метасимволов
- •Лекция №4
- •1.3.3. Распознаватели
- •1.3.4. Классификация распознавателей
- •1.3.4.1. Классификация распознавателей по компонентам
- •1.3.4.2. Классификация распознавателей по типу языков
- •Лекция №4
- •Лекция №5
- •1.3.5. Примеры классификации языков и грамматик
- •Лекция № 6
- •1.4. Технология формирования предложений языка
- •1.4.1. Выводимость цепочек
- •1.4.2. Сентенциальная форма грамматики
- •1.4.3. Левосторонний и правосторонний выводы
- •1.4.4. Дерево вывода и методы его построения
- •1.4.5. Проблема однозначности грамматик
- •2.1.2. Формальное определение компилятора
- •2.1.3. Интерпретаторы
- •2.2. Общая схема работы компилятора
- •2.3. Варианты построения компиляторов
- •2.3.1. Общие подходы в построении компиляторов
- •2.3.2. Понятие прохода
- •2.3.3. Однопроходные и многопроходные компиляторы
- •2.4. Особенности построения интерпретаторов и их взаимодействие с компиляторами
- •3.1.2. Принципы построения сканеров
- •Лекция 9
- •3.1.3. Сканер как конечный автомат
- •Лекция 10
- •3.2. Взаимодействие сканера с таблицей идентификаторов
- •3.2.1.Назначение и особенности построения таблиц идентификаторов
- •3.2.2. Простейшие методы построения таблиц идентификаторов
- •3.2.3. Построение таблиц идентификаторов по методу бинарного дерева
- •Список литературы
Лекция №5
1.3.5. Примеры классификации языков и грамматик
Сводная таблица грамматик по Хомскому показана в табл. 1. Классификация языка идет от простого к сложному. Если мы имеем дело с регулярным языком, то он также является и контекстно-свободным, и контекстно-зависимым, и языком с фразовой структурой. В то же время известно, что существуют КС-языки, которые не являются регулярными, и КЗ-языки, которые не являются ни регулярными, ни контекстно-свободными. Используя табл. 1, рассмотрим несколько примеров классификации грамматик.
Пример 1.3.
Задана грамматика для языка L1-языка целых десятичных чисел со знаком:
G1<T1, N1, P1, S1>, где T1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, –},
N1 = {S, T, F}; S1 = {S}
P1: S T + T – T
T F TF
F 0 1 2 3 4 5 6 7 8 9
Необходимо определить тип грамматики. Цифрами в правых частях правил пронумерованы правила.
Начнем с типа 3. Возможны 2 класса грамматик:
леволинейная праволинейная
A B или A A B или A
где A, B N; T* где A, B N; T*
В правилах P1 слева находится один нетерминальный символ и по этому признаку G1 можно отнести к типу 3.
Если посмотреть на правую часть первой строки правил 2 и 3 P1, то можно сказать, что G1 – это праволинейная грамматика.
Посмотрим на вторую строчку правил P1. В правой части правила 4 только нетерминальный символ F. Относится ли это правило к типу 3? Да, относится, так может быть равна , т. к. T*. Тогда правила грамматики типа 3 трансформируются в A B.
Однако пятое правило T TF не соответствует типу 3, т. к. в правой части цепочка из двух нетерминальных символов, которая допустима для типа 2. То есть по структуре своих правил G1 относится к контекстно-свободным грамматикам (тип 2, НКС).
Для того же самого языка L1 может построить другую грамматику G1<T1, N1, P1, S1>:
T1 = T1; N1 = {S, T}; S1 = {S,};
P1: S T +T – T
T 0 1 2 3 4 5 6 7 8 9 0T 1T 2T 3T 4T 5T 6T 7T 8T 9T
По структуре своих правил грамматика G1 является праволинейной и может быть отнесена к регулярным грамматикам (тип 3).
Покажем, что она эквивалентна G1. Сделаем это на примере получения числа (– 157). Это число по грамматике G1 мы получили ранее в п. 1.3.1.
По грамматике G1 это же число получаем следующим образом:
S – T – 1T – 15T – 157.
Для этого же языка L1 можно построить эквивалентную леволинейную грамматику (тип 3) G1:
G1<T1, N1, P1, S1>
T1 = T1; N1 = N1; S1 = {S}
P1: S T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 S0 S1 S2 S3
S4 S5 S6 S7 S8 S9
T + –
Для числа (– 157) будет следующий набор правила
S S7 S57 S157 – 157.
Вопрос к слушателям. Какого типа язык L1?
Пример 1.4.
Задана грамматика для языка L2: G2<T2, N2, P2, S>
T2 = {0, 1}; N2 = {A, S};
P2: S 0A1
0A 00A1
A .
Эта грамматика относится к типу 0.
Вопрос слушателям. Почему можно сказать, что грамматика G2 относится к типу 0?
Она определяет язык, множество предложений которого
L(G2) = {0n1nn > 0}.
При n = 1 предложение будет 01;
при n = 2 предложение будет 0011;
при n = 3 предложение будет 000111.
Эти предложения получены из совокупности правил P2 следующим образом:
S 0A1 01 01;
S 0A1 00A11 0011 0011;
S 0A1 00A11 000A111 000111 000111.
Для n = 1 сделано три шага в выводе цепочки 01, для n = 2 – четыре шага, для n = 3 – пять шагов.
Вопрос слушателям. Сколько шагов необходимо сделать для вывода цепочки при n = 5?
Для этого же языка можно построить также контекстно-зависимую (КЗ-грамматику): G2<T2, N2, P2, S>
T2 = T2 = {0, 1}; N2 = N2 = {A, S};
P2: S 0A1 01
0A 00A1 001.
Вопрос слушателям. Как показать, что это K3-грамматика, и что она эквивалентна G2?
Однако для того же самого языка L2 можно использовать и КС-грамматику G2: G2<T2, N2, P2, S>,
T2 = T2 = {0, 1}; N2 = {S};
P2: S 0 S 1 01.
При n = 1 S 01; n = 2 S 0S1 0011; n = 3 S 0S1 00S11 000111;
Следовательно, язык L2 = {0n1nn > 0} является языком типа 2 (контекстно-свободный).
Пример 1.5.
Задана грамматика G3<T3, N3, P3, S>
T3 = {a, b, c}; N3 = {B, C, D, S}
P3:
S BD
B aBbCab
Cb bC
CD Dc
bDc bcc
abD abc.
Эта грамматика порождает язык L3, множество предложений которого можно записать так: L(G3) = {anbncn n > 0},
Вопрос слушателям. Какой тип языка L3?