- •Министерство образования и науки рф
- •Основы построения трансляторов Курс лекций по дисциплине «Системное программное обеспечение» Красноярск 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 Задачи
- •Литература
Контрольные вопросы
Какую роль выполняет лексический анализ в процессе компиляции?
Как связаны фазы лексического и синтаксического анализа?
Что такое таблица идентификаторов и для чего она предназначена?
Перечислите способы организации таблиц идентификаторов.
В чем заключается алгоритм бинарного поиска? Какие преимущества он дает по сравнению с простым перебором, каковы его недостатки?
В чем суть хеш-адресации? Что такое хеш-функции и для чего они используются?
Охарактеризуйте сущность, достоинства и недостатки метода цепочек.
Как могут быть скомбинированы различные методы организации хеш-таблиц?
Дайте определение конечного автомата. В чем отличие детерминированного и недетерминированного конечных автоматов?
Какие проблемы необходимо решить при построении сканера на основе конечного автомата?
Задачи
1. Построить регулярную грамматику, порождающую язык
L = {(abb)k| k 1},
по ней построить ДС, а затем по ДС написать на языке Си лексический анализатор для этого языка.
2. Построить ДС, по которой в заданном тексте, оканчивающемся на , выявляются все парные комбинации <>, <= и >= и подсчитывается их общее количество.
3. Дана регулярная грамматика:
S A
A Ab | Bb | b
B Aa
Определить язык, который она порождает; построить ДС; написать на языке Си лексический анализатор.
4. Пусть имеется переменная c и функция gc(), считывающая в с очередной символ анализируемой цепочки. Дана ДС с действиями:
Определить, что будет выдано на печать при разборе цепочки 1+101//p11+++1000/5?
Написать на языке Си лексический анализатор по этой ДС.
5. Написать на языке Си лексический анализатор, выделяющий из текста вещественные числа без знака (они определены как в Паскале) и преобразующий их из символьного представления в числовое.
6. Даны две грамматики G1 и G2:
G1: S 0C | 1B | G2: S 0D | 1B
B 0B | 1C | B 0C | 1C
C 0C | 1C C 0D | 1D |
D 0D | 1D
L1 = L(G1); L2 = L(G2).
Построить регулярную грамматику для:
L1L2
L1L2
Если разбор по ней оказался недетерминированным, найти эквивалентную ей грамматику, допускающую детерминированный разбор.
7. Написать леволинейную регулярную грамматику, эквивалентную данной праволинейной, допускающую детерминированный разбор.
a) S 0S | 0B b) S aA | aB | bA
B 1B | 1C A bS
C 1C | B aS | bB |
c) S aB d) S 0B
B aC | aD | dB B 1C | 1S
C aB C
D
8. Для данной грамматики
определить ее тип;
какой язык она порождает;
написать Р-грамматику, почти эквивалентную данной;
построить ДС и написать лексический анализатор на языке Си.
S 0S | S0 | D
D DD | 1A |
A 0B |
B 0A | 0
9. Написать лексический анализатор на языке Си по следующей грамматике:
a) S C b) S C
B B1 | 0 | D0 C B1
C B1 | C1 B 0 | D0
D D0 | 0 D B1
c) S A0
A A0 | S1 | 0
10. Грамматика G определяет язык L=L1L2, причем L1 L2 =. Написать регулярную грамматику G1, которая порождает язык L1L2 (см. §2.4, задача 20). Для нее построить ДС и написать лексический анализатор на языке Си.
S 0A | 1S
A 0A | 1B
B 0B | 1B |
11. Даны две грамматики G1 и G2, порождающие языки L1 и L2. Построить регулярные грамматики для
L1 L2
L1 L2
L1 L2 (см. §2.4, задача 20)
G1: S 0B | 1S G2: S B
B 0C | 1B | A B1 | 0
C 0B | 1S B A1 | C1 | B0 | 1
C A0 | B1
Для грамматики b) построить ДС и написать лексический анализатор на языке Си.
12. По данной грамматике G1 построить регулярную грамматику G2 для языка L1 L1 (см. §2.4, задача 20), где L1 = L(G1); по грамматике G2 – постоить ДС и лексический анализатор на языке Си.
G1: S 0S | 0B
B 1B | 1C
C 1C |
13. Написать регулярную грамматику, порождающую язык:
L = { | {0,1}* , где за каждой 1 непосредственно следует 0};
L = {11 | {0,1}+ , где между вхождениями 1 нечетное количество 0};
по ней построить ДС, а по ДС написать на языке Си лексический анализатор.
14. Построить лексический блок (преобразователь) для кода Морзе. Входом служит последовательность "точек", "тире" и "пауз" :
например, ..--. .- ...-. Выходом являются соответствующие буквы, цифры и знаки пунктуации. Особое внимание обратить на организацию таблицы.
