Лабораторные работы

по программированию для студентов

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта
Главная Теория языков программирования Проектирование лексического анализатора

Проектирование лексического анализатора

E-mail Печать PDF

Цель работы: изучение основных понятий теории регулярных грамматик, ознакомление с назначением и принципами работы лексических анализаторов (сканеров), получение практических навыков построения сканера на примере заданного простейшего входного языка.

Для выполнения лабораторной работы требуется написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов и значений. Текст на входном языке задается в виде символьного (текстового) файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок, которые могут быть обнаружены на этапе лексического анализа.
Длину идентификаторов и строковых констант считать ограниченной 32 символами. Программа должна допускать наличие комментариев неограниченной длины во входном файле. Форму организации комментариев предлагается выбрать самостоятельно.

Итак, было получено задание создать лексический анализатор алгебраических выражений:

Пример содержания входного файла text.txt:

b=d*3.14+b+2.5E+3+(bcd+d);
//dsa+45+3;
Q+2E+6+2.5/3;
A+D+5;
/*
a+b+e+2E+3;
b+(b+0.23E-2);
*/
C=F+(d+Q+23);

Требуется создать программу, которая читает файл и строит из заданных выражений лексемы (слова) исходного языка.

Купить исходный код на С++ данной программы через plati.ru (50 руб)

Пример работы программы:

Купить исходный код на С++ данной программы через plati.ru (50 руб)

 

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Лексический анализатор (или сканер) - это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического анализа и разбора.
С теоретической точки зрения лексический анализатор не является обязательной, необходимой частью компилятора. Его функции могут выполняться на этапе синтаксического разбора. Однако существует несколько причин, исходя из которых в состав практически всех компиляторов включают лексический анализ. Эти причины заключаются в следующем:
•    упрощается работа с текстом исходной программы на этапе синтаксического разбора и сокращается объем обрабатываемой информации, так как лексический анализатор структурирует поступающий на вход исходный текст программы и выкидывает всю незначащую информацию;
•    для выделения в тексте и разбора лексем возможно применять простую, эффективную и теоретически хорошо проработанную технику анализа, в то время как на этапе синтаксического анализа конструкций исходного языка используются достаточно сложные алгоритмы разбора;
•    сканер отделяет сложный по конструкции синтаксический анализатор от работы непосредственно с текстом исходный программы, структура которого может варьироваться в зависимости от версии входного языка - при такой конструкции компилятора при переходе от одной версии языка к другой достаточно только перестроить относительно простой сканер.
Функции, выполняемые лексическим анализатором, и состав лексем, которые он выделяет в тексте исходной программы, могут меняться в зависимости от версии компилятора. В основном лексические анализаторы выполняют исключение из текста исходной программы комментариев и незначащих пробелов, а также выделение лексем следующих типов: идентификаторов, строковых, символьных и числовых констант, ключевых (служебных) слов входного языка.
В простейшем случае фазы лексического и синтаксического анализа могут выполняться компилятором последовательно. Но для многих языков программирования информации на этапе лексического анализа может быть недостаточно для однозначного определения типа и границ очередной лексемы. Иллюстрацией такого случая может служить пример оператора программы на языке Фортран, когда по части текста DO 10 I=1... невозможно определить тип оператора (а соответственно, и границы лексем). В случае DO 10 I=1.15 - это будет присвоение вещественной переменной DO10I значения константы 1.15 (пробелы в Фортране игнорируются), а в случае DO 10 I=1,15 - это цикл с перечислением от 1 до 15 по целочисленной переменной I до метки 10.
В большинстве компиляторов лексический и синтаксический анализаторы - это взаимосвязанные части. Лексический разбор исходного текста в таком варианте выполняется поэтапно так, что синтаксический анализатор, выполнив разбор очередной конструкции языка, обращается к сканеру за следующей лексемой. При этом он может сообщить информацию о том, какую лексему следует ожидать. В процессе разбора может даже происходить “откат назад”, чтобы выполнить анализ текста на другой основе. В дальнейшем будем исходить из предположения, что все лексемы могут быть однозначно выделены сканером на этапе лексического разбора.
Работу синтаксического и лексического анализаторов можно изобразить в виде схемы на рис. 2.

Рис. 2.  Взаимодействие синтаксического и лексического анализаторов.

Рис. 2.  Взаимодействие синтаксического и лексического анализаторов.

Например имеем исходный код:

begin
for i:=1 to N do
fg := fg * 0.5

Таблица 1: Таблица лексем программы

Лексема Тип лексемы Значение
begin Ключевое слово X1
for Ключевое слово X2
i Идентификатор i : 1
:= Знак присваивания
1 Целочисленная константа 1
to Ключевое слово X3
N Идентификатор N : 2
do Ключевое слово X4
fg Идентификатор fg : 3
:= Знак присваивания
fg Идентификатор fg : 3
* Знак арифметической операции
0.5 Вещественная константа 0.5

Купить исходный код на С++ данной программы через plati.ru (50 руб)

Обновлено 19.03.2013 08:14  

Добавить комментарий


Защитный код
Обновить


Поиск

Войти

Ваше мнение:

Нужно ли программисту учиться в университете?
 

Опрос

Кто круче?