Слайд 1Лексический анализатор
Лекция 2
Слайд 2Если рассмотреть процесс компиляции более детально, можно увидеть, что он
представляет собой последовательность фаз, каждая из которых преобразует одно из
представлений исходной программы в другое.
Типичное разложение компилятора на фазы приведено на рис. 1.6.
На практике некоторые фазы могут объединяться, а межфазное промежуточное представление может не строиться явно.
Таблица символов, в которой хранится информация обо всей исходной программе, используется всеми фазами компилятора.
Некоторые компиляторы содержат фазу машинно-независимой оптимизации между анализом и синтезом. Назначение этой оптимизации — преобразовать промежуточное представление, чтобы синтез мог получить более качественную целевую программу по сравнению с той, которая может быть получена из неоптимизированного промежуточного представления. Поскольку оптимизация необязательна, некоторые фазы оптимизации, показанные на рис. 1.6, в компиляторе могут отсутствовать.
Слайд 3ФАЗЫ КОМПИЛЯТОРА
Первая фаза компиляции называется лексическим анализом или сканированием.
Лексический
анализатор читает поток символов, составляющих исходную программу, и группирует эти
символы в значащие последовательности, называющиеся лексемами. Для каждой лексемы анализатор строит выходной токен (token) вида
(имя токена, значение_атрибута)
Он передается последующей фазе, синтаксическому анализу. Первый компонент токена, имя_токена, представляет собой абстрактный символ, использующийся во время синтаксического анализа, а второй компонент, значение атрибута, указывает на запись в таблице символов, соответствующую данному токену.
Информация из записи в таблице символов необходима для семантического анализа и генерации кода. Предположим, например, что исходная программа содержит инструкцию присваивания
position = initial + rate * 60
Слайд 4терминология
Лексема (лексическая единица языка) — это структурная единица языка, которая
состоит из элементарных символов языка и не содержит в своем
составе других структурных единиц языка. Лексемами языков естественного общения являются слова .
Результатом работы лексического анализатора является перечень всех найденных в тексте исходной программы лексем. Этот перечень лексем можно представить в виде таблицы, называемой таблицей лексем.
Каждой лексеме в таблице лексем соответствует некий уникальный условный код, зависящий от типа лексемы, и дополнительная служебная информация. Кроме того, информация о некоторых типах лексем, найденных в исходной программе, должна помещаться в таблицу идентификаторов (или в одну из таблиц идентификаторов, если компилятор предусматривает различные таблицы идентификаторов для различных типов лексем).
Слайд 5Основные понятия лексического анализа
Лексический анализ всегда предшествует синтаксическому анализу и
заключается в предварительной обработке программы и ее перекодировании к виду,
удобному для синтаксического анализа. Лексический анализ принято отделять от синтаксического анализа для сокращения времени компиляции, поскольку синтаксис (морфология) слов всегда проще, чем синтаксис программ.
Лексический анализ сводится к разбиению текста программы на лексические единицы (слова, лексемы) – конструкции, которые выступают в качестве терминальных символов для синтаксического анализа. Лексемы еще иногда называют символами или атомами.
Большинство лексем в языках программирования можно сгруппировать в следующие классы:
- класс идентификаторов;
- класс служебных слов;
- класс констант (числовых или символьных);
- класс операций (одно-, дву- или многолитерных);
- класс разделителей (однолитерных или двулитерных).
В лексическом анализе лексема представляется в виде пары (класс, значение). Значение может быть непосредственным (литеральным) или представлять собой ссылку на некоторую таблицу, в которой хранятся значения лексем.
Слайд 8ВИШНЯКОВ Ю.М.
БАЛАБАЕВА И.Ю.
Руководство к циклу лабораторных работ по курсу
«Теория языков
программирования и методы трансляции»
Таганрог ЮФУ 2008
Каждый вариант задания представляет собой
пару: входной язык и машинный, или выходной, язык (см. табл. 5.1). В качестве входного языка предлагается один из языков программирования высокого уровня, в который должно быть обязательно включено следующее подмножество языковых конструкций и операторов:
- идентификаторы;
- числовые константы целого типа и вещественного типа, представленные с фиксированной и плавающей точкой;
- символьные (строковые) константы;
- переменные с индексами (массивы и элементы массивов);
- комментарии (строчные и блочные);
- имена функций пользователя;
- арифметические операции;
- операции сравнения (меньше, больше, равно, не равно, меньше или равно, больше или равно);
- операторы описания данных (идентификаторов и массивов);
- операторы описания процедур и функций (если предусмотрены в языке);
- операторы условного и безусловного перехода;
- метки (если предусмотрены в языке).
В качестве машинного языка предлагаются различные языки высокого уровня и язык Ассемблера (см. таблицу 5.1).
Слайд 10Постановка задачи
Построение программы лексического анализатора, корректно распознающего все перечисленные выше
лексемы и формирующего таблицы лексем и внутреннее представление проанализированного текста.
На
вход программы подается файл, содержащий тест на входном языке программирования. Результатом работы программы должен быть файл, содержащий последовательность кодов лексем входной программы, а также один или несколько файлов, содержащие все таблицы лексем.
Отчет по работе должен содержать описание правил записи перечисленных выше элементов заданного входного языка, стандартные таблицы лексем, диаграмма состояний сканера, листинг программы и комментарии к нему, пример лексического разбора.