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

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 равна шести.

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

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