Лекция 7 Компиляторы Компилятор – это программа, которая считывает текст программы, написанной на исходном языке, и транслирует (переводит) его в эквивалентный текст на другом языке (объектном языке). Одним из важных моментов трансляции является сообщение пользователю о наличии ошибок в исходной программе. Компиляция состоит из двух частей: анализа и синтеза. Анализ – это разбиение программы на составные части и создание промежуточного представления. Синтез – конструирование требуемой объектной программы из промежуточного представления (генерация кода). При компиляции анализ состоит из трех фаз: • лексический анализ • синтаксический анализ • семантический анализ. Фазы компилятора Программа на исходном языке Лексический анализ Синтаксический анализ Программы работы с таблицей имен и констант Семантический анализ Оптимизация программы Генерация кода Программа на объектном языке рис 1 Обработчик ошибок ЛЕКСИЧЕСКИЙ АНАЛИЗ Программа на исходном языке Лексический анализ Синтаксический анализ Семантический анализ рис 2 Лексический анализатор работает в режиме «Дай лексему» Задачей лексического анализатора также является удаление комментариев из текста программы и лишних пробелов (не играющих никакой роли в программе). Лексический анализатор определяет лишь некоторые ошибки, поскольку он рассматривает исходный текст программы в ограниченном контексте. Лексический анализатор также может проверить некоторые ограничения реализации, например, ограничения на длину имен в тексте программы, ограничения на числа. Тело лексического анализатора реализует диаграмму переходов соответствующего конечного автомата. Из начального состояния такого конечного автомата существуют переходы по символам-началам лексем разных классов к состояниям конечных автоматов, анализирующих лексему отдельного класса. Фрагмент программы лексического анализатора. Анализатор работает в режиме «дать лексему» (рис. 2). Он распознает числа, идентификаторы и ключевые слова. Анализатор реализует конечный автомат, диаграмма переходов буква 2 1 Буква или цифра начало 3 цифра цифра цифра 4 точка цифра Рис.3. Диаграмма для конечного автомата 5 2. СИНТАКСИЧЕСКИЙ АНАЛИЗ Задачей синтаксического анализа является проверка правильности структуры программы, которая описывается уже контекстно-свободной грамматикой. Моделью синтаксического анализатора является автомат с магазинной памятью. Методы синтаксического анализа классифицируются как восходящие и нисходящие. Восходящие анализаторы строят дерево разбора снизу (от листьев) вверх (к корню), а нисходящие – сверху (от корня) вниз (к листьям). Классификация грамматик по Хомскому Линейные грамматики. Определение1. Грамматика G = (N, , P, S) называется линейной, если все ее правила имеют вид либо , где N, N, *, *. Определение2. Грамматика G = (N, , P, S) называется право линейной, если все ее правила имеют вид либо , где N, N, *. Определение3. Грамматика G = (N, , P, S) называется лево линейной, если все ее правила имеют вид либо , где N, N, *. Определение 4. Грамматика G = (N, , P, S) называется правоавтоматной, если все ее правила имеют вид либо , где N, N, , и допускается правило S . Определение 5. Грамматика G = (N, , P, S) называется левоавтоматной, если все ее правила имеют вид либо , где N, N, , и допускается правило S . Контексно-свободные грамматики Определение 6. Грамматика G = (N, , P, S) называется контекстно-свободной (или бесконтекстной) (КС-грамматикой), если все ее правила имеют вид , где N, а (N)*. Определение 7. Дерево вывода в КСграмматике G = (N, , P, S) – помеченное упорядоченное дерево, каждая вершина которого помечена символом из множества N {}, причем если некоторая вершина помечена символом A, а ее прямые потомки - символами X1, X2, … , Xn , то A X1X2 … Xn - правило этой грамматики. Поскольку синтаксический анализатор – это программа для компьютера, то он должен работать в тех условиях, которые задает компьютер.