Лекции 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 Опишите в словесной форме языки, задаваемые следующими КА: