- •Министерство образования и науки рф
- •Основы построения трансляторов Курс лекций по дисциплине «Системное программное обеспечение» Красноярск 2010 г.
- •1. Место трансляторов в системном программном обеспечении. Основные фазы процесса трансляции
- •Генерация промежуточного представления
- •Генерация кода
- •Контрольные вопросы
- •2. Базовые понятия теории формальных языков и грамматик
- •2.1. Алфавиты, цепочки и языки. Основные понятия и определения
- •2.2. Представление языков
- •2.3. Грамматики
- •2.3.1. Формальное определение грамматики
- •2.3.2. Классификация грамматик и языков по Хомскому
- •2.3.3. Разбор цепочек
- •2.3.4. Преобразования грамматик
- •2.4. Задачи
- •3. Лексический анализ
- •Описание модельного языка
- •3.1. Сущность и задачи лексического анализа
- •3.2. Способы организации таблиц идентификаторов
- •Организация таблицы идентификаторов в виде неупорядоченного массива записей. Метод линейного поиска.
- •Организация таблицы идентификаторов в виде упорядоченного массива записей. Метод бинарного поиска.
- •Использование бинарного дерева поиска для построения таблицы идентификаторов.
- •Построение таблиц идентификаторов с использованием методов хеширования.
- •3.3. Методы и средства лексического анализа
- •3.4. Недетерминированный разбор
- •3.5 Разработка лексического анализатора для модельного языка Описание модельного паскалеподобного языка (м-языка):
- •Контрольные вопросы
- •4. Синтаксический и семантический анализ
- •4.1. Задачи и методы синтаксического анализа
- •4.2 Сущность метода рекурсивного спуска
- •Void error(); / функция обработки ошибок /
- •4.3. Условия применимости метода рекурсивного спуска
- •4.4. Синтаксический анализатор для м-языка
- •4.5. Семантический анализ
- •4.6. Семантический анализатор для м-языка
- •4.6.1. Обработка описаний
- •Int declare; / описан ? 1-"да", 0-"нет" /
- •Void ipush (int I); / значение I - в стек /
- •Int ipop (void); / из стека - целое /
- •4.6.2. Контроль контекстных условий в выражении
- •Void spush (char s); / значение s - в стек /
- •If (tid [I].Declare) / описан? /
- •4.6.3. Контроль контекстных условий в операторах
- •4.7. Задачи
- •5. Генерация внутреннего представления программ
- •5.1. Язык внутреннего представления программы
- •5.2 Синтаксически управляемый перевод
- •5.3 Генератор внутреннего представления программы на м-языке
- •5.4 Интерпретатор полиЗа для модельного языка
- •5.5 Задачи
- •Литература
2.3.2. Классификация грамматик и языков по Хомскому
Рассмотрим классификацию грамматик, предложенную Н.Хомским, основанную на виде их правил.
Тип 0.
Грамматика G = (VT, VN, P, S) называется грамматикой типа 0 (или грамматикой без ограничений), если на правила вывода не накладывается никаких ограничений (кроме тех, которые указаны в определении грамматики).
Тип 1.
Грамматика G = (VT, VN, P, S) называется неукорачивающей грамматикой, если для каждого правила вывода (кроме S ) выполняется соотношение | | | |. В том случае, когда S P, символ S не встречается в правых частях правил вывода.
Грамматика G = (VT, VN, P, S) называется контекстно-зависимой (КЗ), если каждое правило из P имеет вид ,
где = 1A2; = 12; A VN; (VT VN)+; 1,2 (VT VN)*.
Грамматику типа 1 можно определить как неукорачивающую либо как контекстно-зависимую.
Выбор определения не влияет на множество языков, порождаемых грамматиками этого класса, поскольку доказано, что множество языков, порождаемых неукорачивающими грамматиками, совпадает с множеством языков, порождаемых КЗ-грамматиками.
Тип 2.
Грамматика G = (VT, VN, P, S) называется контекстно-свободной (КС), если каждое правило из Р имеет вид A , где A VN, (VT VN)+.
Грамматика G = (VT, VN, P, S) называется укорачивающей контекстно-свободной (УКС), если каждое правило из Р имеет вид A , где A VN,
(VT VN)*.
Грамматику типа 2 можно определить как контекстно-свободную либо как укорачивающую контекстно-свободную.
Возможность выбора обусловлена тем, что для каждой УКС-грамматики существует почти эквивалентная КС-грамматика.
ТИП 3.
Грамматика G = (VT, VN, P, S) называется праволинейной, если каждое правило из Р имеет вид A tB либо A t, где A VN, B VN, t VT.
Грамматика G = (VT, VN, P, S) называется леволинейной, если каждое правило из Р имеет вид A Bt либо A t, где A VN, B VN, t VT.
Грамматику типа 3 (регулярную, Р-грамматику) можно определить как праволинейную либо как леволинейную.
Выбор определения не влияет на множество языков, порождаемых грамматиками этого класса, поскольку доказано, что множество языков, порождаемых праволинейными грамматиками, совпадает с множеством языков, порождаемых леволинейными грамматиками.
Очевидно, что в примере 2.3 грамматика G2 является неукорачивающей, грамматика G3 - контекстно-свободной, грамматика G4 - праволинейной.
Соотношения между типами грамматик:
любая регулярная грамматика является КС-грамматикой;
любая регулярная грамматика является УКС-грамматикой;
любая КС-грамматика является КЗ-грамматикой;
любая КС-грамматика является неукорачивающей грамматикой;
любая КЗ-грамматика является грамматикой типа 0;
любая неукорачивающая грамматика является грамматикой типа 0.
Замечание: УКС-грамматика, содержащая правила вида A , не является КЗ-грамматикой и не является неукорачивающей грамматикой.
Язык L(G) называется языком типа k, если его можно описать грамматикой типа k.
Соотношения между типами языков:
каждый регулярный язык является КС-языком, но существуют КС-языки, которые не являются регулярными (например, L = {anbn | n>0});
каждый КС-язык является КЗ-языком, но существуют КЗ-языки, которые не являются КС-языками (например, L = {anbncn | n>0});
каждый КЗ-язык является языком типа 0.
Замечание: УКС-язык, содержащий пустую цепочку, не является КЗ-языком.
Следует отметить, что если язык задан грамматикой типа k, то это не значит, что не существует грамматики типа k’ (k’>k), описывающей тот же язык. Поэтому, когда говорят о языке типа k, обычно имеют в виду максимально возможный номер k.
Пример 2.6
КЗ-грамматика G1 = ({0,1}, {A,S}, P1, S) и
КС-грамматика G2 = ({0,1}, {S}, P2, S), где
P1={ S 0A1, 0A 00A1, A P2={S 0S1 | 01},
описывают один и тот же язык L = L(G1) = L(G2) = { 0n1n | n>0}.
Язык L является КС-языком, так как существует КС-грамматика, его описывающая. Но он не является регулярным языком, потому что не существует регулярной грамматики, описывающей этот язык [3].
Пример 2.7
Примеры грамматик и языков различных типов.
1) Грамматика G1=({a, b},{A, B, C, D, F, S}, P1, S), где
P1={ S aaCFD, F AFB | AB, AB bBA, Ab bA, AD D, Cb bC,
CB C, bCD };
L1(G1)
= {a2
b
|
n
1} – это язык типа 0.
2) Грамматика G2=({0, 1}, {А, В, S}, P2 , S), где
Р2={S ASB | AB, AB BA, A 0, B 1}
L2(G2)={цепочки из 0 и 1 с одинаковым числом 0 и 1} – это язык типа 1.
3) Грамматика G3=({a, b, c}, {Q, S}, { S aQb | accb, Q cSc}, S);
L3(G3) = {(ac)n (cb)n | n > 0} - это язык типа 2.
4) Грамматика G4=({a, b, }, {А, В, S}, P4, S);
P4={ S A| B, A a | Ba, B b | Bb | Ab }
L4(G4) = {| {a,b}+, где нет двух рядом стоящих а} - язык типа 3.
