Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
248
Добавлен:
31.10.2018
Размер:
3 Мб
Скачать
☆

2.8 Способы построения лексических анализаторов

Имеется три основных способа реализации лексического анализатора.

  1. Использование генератора лексических анализаторов, такого как LЕХ, для создания лексического анализатора по спецификациям, основанным на регулярных выражениях. В этом случае генератор предоставляет функции для чтения и буферизации ввода.

  2. Написание лексического анализатора на подходящем языке программирования с использованием возможностей ввода – вывода этого языка для чтения входной информации.

  3. Написание лексического анализатора на языке ассемблера и явное управление процессом чтения входной информации.

Эти методы перечислены в порядке усложнения их реализации. К сожалению, более трудные для реализации подходы часто дают более быстрые лексические анализаторы [3].

LEX — программа для генерации лексических анализаторов. Входной язык содержит описания лексем в терминах регулярных выражений. Результа­том работы LEX является программа на некотором языке программирования, которая читает входной файл (обычно это стандартный ввод) и выделяет из него последовательности символов (лексемы), соответствующие заданным регуляр­ным выражениям.

Принцип работы LEX достаточно прост: на вход ей подается текстовый файл, содержащий описания нужных лексем в терминах регулярных выражений, а на выходе получается файл с текстом исходной программы сканера, на заданном языке программирования (обычно — на С). Текст исходной программы сканера может быть дополнен вызовами любых функций из любых библиотек, поддер­живаемых данным языком и системой программирования. Таким образом, LEX позволяет значительно упростить разработку лексических анализаторов, практически сводя эту работу к описанию требуемых лексем в терминах регулярных выражений.

Вопросы

1. Что представляет собой входной алфавит следующих языков программирования: Pascal, C, Lisp?

2. Какие существуют соглашения по использованию пробелов в каждом из языков, указанных в п.1?

3. Какую роль выполняет лексический анализ в процессе компиляции?

4. Как могут быть связаны между собой лексический и синтаксический анализ?

5. Почему большинство современных компиляторов используют фазу лексического анализа, при том, что она является необязательной?

3. Определение лексем

В определении лексем важную роль играют регулярные выражения. Каждый шаблон соответствует множеству строк, так что регулярные выражения можно рассматривать как имена таких множеств.

3.1 Строки и языки

Алфавит, или класс символов, обозначает любое конечное множество символов. Типичным примером символов могут служить буквы или алфавитно-цифровые символы. Множество {0,1} представляет собой бинарный алфавит. ASCII является примером компьютерного алфавита.

Строка над некоторым алфавитом – это конечная последовательность символов, взятых из алфавита. В теории языков термин предложение и слово часто используются как символы термина “строка”. Длина строки s, обычно обозначаемая как │s│, равна количеству символов в строке. Например, длина строки banana равна шести.

Пустая строка, обозначаемая как λ ( или ε), представляет собой специальную строку нулевой длины.

Язык обозначает произвольное множество строк над некоторым фиксированным алфавитом. Например, {λ} ­- множество, содержащее только пустую строку.