Лекции 8-9 - Программирование

advertisement
Лекции 8, 9
9 октября 2015 г.
main.
cpp
Лексический анализ
Учимся читать текст программы по словам
лексемы
Синтаксический анализ
Строим из слов предложения. Разбираем их
смысл
атомы
компилятор
Глобальная оптимизация
Выбрасываем все лишнее и избыточное
атомы
Генерация кода
Переводим на другой язык
инструкции
Локальная оптимизация
инструкции
main.
obj
Выбрасываем все лишнее и избыточное
Опр. 1: Лексический анализ – этап трансляции, на котором исходная последовательность символов
превращается в последовательность лексем.
Опр. 2: Лексема – группа символов входной последовательности, идентифицируемая как одна
лексическая единица языка.
Опр. 3: Токен – структура данных, которая порождается на основе считанной лексемы. Поток
токенов является результатом работы лексического анализатора.
поток символов
S
U
M
=
S
U
M
+
U
N
I
T
*
1
.
2
E
-
1
2
;
S
U
M
=
S
U
M
+
U
N
I
T
*
1
.
2
E
-
1
2
;
поток лексем
sum
=
sum
+
unit
*
1.2e-12
;
=
id, 0
+
id, 1
*
num, 1.2e-12
;
поток токенов
id, 0
Токен
Числовая константа
Строковая константа
Идентификатор
сложение
равенство
присваивание
…
Лексемы
3.14
0
-4
5422
34.5e-14
“Hello, world!”
i
j
sum
unit
factorial
+
==
=
…
поток символов
S
U
M
=
S
U
M
+
id (0)
+
U
N
I
T
*
1
.
2
E
-
1
2
;
поток лексем (токенов)
id (0)
=
Таблица символов
Имя
sum
unit
Код
0
1
id (1)
*
num (1.2e-12)
;
Язык
Естественный
Формальный
Опр. 4: Алфавит ∑ – множество символов языка.
Опр. 5: Строка – последовательность символов заданного алфавита.
Опр. 6: Формальный язык – множество конечных строк над конечным алфавитом.
Пример 1:
a. {0, 10, 1011}
b. {}
c. {ε, 0, 00, 000, 0000, 00000, …}
d. Множество всех строк из нулей и единиц, имеющих четное количество единиц.
Опр. 7: Распознаватель языка – программа, которая принимает на вход слово, а на выход выдает
один из двух ответов – принадлежит ли это слово распознаваемому языку или нет.
Способы задания (определения) формальных языков:
• словесное описание языка
• конечный автомат
• регулярные выражения
• грамматики
• …
словесное описание
грамматики
конечные автоматы,
регулярные выражения
Опр. 8’ (неформальное): Конечный автомат – это абстрактная машина, которая начинает
работу в состоянии q0, последовательно считывая по одному символу входного слова. Считанный
символ переводит автомат в новое состояние в соответствии с функцией переходов. Читая
входную цепочку символов x и делая переходы из состояния в состояние, автомат после
прочтения последнего символа входного слова окажется в некотором состоянии q'. Если это
состояние является заключительным, то говорят, что автомат допустил слово x.
Опр. 8: Конечный автомат – это пятерка <∑,Q,q0,F,δ>, где
1. ∑ - входной алфавит,
2. Q – множество состояний,
3. q0 – начальное состояние,
4. F ⊂ Q – множество принимающих состояний,
5. δ – функция переходов:
𝛿: 𝑄 × ∑ → 𝑄
Пример 2:
Опр. 9: Детерминированный конечный автомат (ДКА) – это КА, который по любой паре
(состояние, символ) дает ровно одно новое состояние.
Опр. 10: Язык КА – это все множество слов, принимаемых автоматом.
Опр. 11: Регулярное выражение – формула, состоящая из множеств и символов трех операций:
• объединения: +
• конкатенации: ∙
• замыкания: *
Опр. 12: Замыкание определяется следующим
образом:
• L0 = {ε}
• L1 = L
• L2 = L∙L
• …
• Ln = L∙Ln-1
• L* = L0 + L1 + L2 + L3 + …
Опр. 13: Конкатенация двух строк – это
строка, получаемая в результате склеивания
двух исходных строк.
Опр. 14: Конкатенация двух языков есть
множество, сформированное конкатенацией
каждой строки из первого множества и
каждой строки из второго.
Пример 3: {abc, ab, ba} + {ba, bb} = {abc, ab, ba, bb}
Пример 4: abc ∙ ba = abcba
Пример 5: {ab, a, c} x {b, ε} =
Пример 6: 0* = {ε, 0, 00, 000, 0000, …}
{abb, ab, a, cb, c}
Пример 7:
1. (01)* = {ε, 01, 0101, 010101, 01010101, …}
2. 01* = {0, 01, 011, 0111, 01111, …}
3. (0 + 1)* = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100, …} – множество
всех строк из нулей и единиц
4. 1(0+1)*0 = {10, 100, 110, 1000, 1010, 1100, 1110, …} – множество всех строк из
нулей и единиц, начинающихся с единицы и заканчивающихся нулем.
5. 0*(10*1)*0* = все строки с четным количеством единиц
Пример 8:
(0*1)* = {ε, 1, 11, 111, 1111, …, 01, 0101, 010101, 01010101, …, 001, 001001,…}
Драйвер для КА на Питоне:
Упражнение 1
Какие из перечисленных ниже слов принадлежат языку, задаваемому автоматом:
1.
2.
3.
4.
5.
abab
bbb
aaab
aaa
ε
Упражнение 2
Какие строки принадлежат языку, задаваемому регулярным выражением (a+bb)*a:
1.
2.
3.
4.
5.
ε
aaa
ba
bba
abba
Упражнение 3
Напишите три строки из нулей и единиц, которые не принадлежат языку (0*1)*
Упражнение 4
Предположим, что язык L состоит из всех слов из нулей и единиц, содержащих четное количество 1.
Какие слова принадлежат этому языку?
a) 0101
b) 110211
c) 000
d) 010011
e) ε
Упражнение 5
Предположим язык L состоит из всех слов, содержащих одинаковое количество букв ‘a’, ‘b’ и ‘c’. Какие
строки принадлежат этому языку?
a) bca
b) accbab
c) ε
d) aaa
e) aabbcc
Упражнение 6
Написать КА в виде таблицы и графа для следующих языков:
1.
2.
3.
4.
5.
Строки нулей и единиц, содержащих нечетное количество нулей
Строки, содержащие три подряд идущие единицы
Строки, содержащие ровно три нуля
Строки, содержащие нечетное число нулей и четное число единиц
Идентификаторы – строки, начинающиеся с символа, и состоящие из
Упражнение 7
Перечислите по шесть строк из языков, задаваемых следующими регулярными выражениями:
1. (a(b+c)*)*d
2. (a+b)*(c+d)
3. (a*b*)*
Упражнение 8
Напишите регулярные выражения для языков из упражнения 6
Упражнение 9
Напишите КА для следующих языков:
1. (a+b)*c
2. (aa)*(bb)*c
3. (a*b*)*
4. (a+bb+c)a*
5. ((a+b)(c+d))*
Упражнение 10
Опишите в словесной форме языки, задаваемые следующими КА:
Download