Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Metodichka_1

.pdf
Скачиваний:
12
Добавлен:
16.03.2015
Размер:
366.69 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ высшего профессионального образования

«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П.КОРОЛЕВА

(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ

Е. В. Мясников

Основы трансляции языков программирования Лабораторный практикум

Электронное учебное пособие

Самара

2011

Автор: МЯСНИКОВ Евгений Валерьевич

Пособие представляет собой сборник методических указаний к лабораторным работам. В сборник включены краткие теоретическими сведения, необходимые для выполнения лабораторных работ, задания на лабораторные работы, примеры выполнения таких заданий и необходимая справочная информация. Задания на лабораторные работы способствуют усвоению теоретического материала и выработке практических навыков по дисциплине. В процессе выполнения лабораторных работ студенты осваивают три важнейших этапа трансляции: лексический, синтаксический и семантический анализ. В

завершение курса лабораторных работ студентам предлагается реализовать интерпретатор.

Пособие предназначено для студентов факультета информатики, направление 010400

Прикладная математика и информатика, бакалавриат (010400.62)/магистратура (010400.68,

магистерская программа Технологии параллельного программирования и суперкомпьютинг).

2

Оглавление

 

ОГЛАВЛЕНИЕ..................................................................................................................................................

3

1. ЛАБОРАТОРНАЯ РАБОТА №1 ................................................................................................................

4

1.1 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ЛАБОРАТОРНОЙ РАБОТЫ ..................................................................................

4

1.2

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ.......................................................................................................

9

1.3

ПРИМЕР ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ .......................................................................................

9

1.4

СОДЕРЖАНИЕ ОТЧЕТА ..............................................................................................................................

16

1.5

КОНТРОЛЬНЫЕ ВОПРОСЫ .........................................................................................................................

17

2 ЛАБОРАТОРНАЯ РАБОТА №2 ...............................................................................................................

18

2.1 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ЛАБОРАТОРНОЙ РАБОТЫ ................................................................................

18

2.2

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ.....................................................................................................

22

2.3

ПРИМЕР ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ .....................................................................................

22

2.4

СОДЕРЖАНИЕ ОТЧЕТА ..............................................................................................................................

27

2.5

КОНТРОЛЬНЫЕ ВОПРОСЫ .........................................................................................................................

28

3 ЛАБОРАТОРНАЯ РАБОТА №3 ...............................................................................................................

29

3.1 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ЛАБОРАТОРНОЙ РАБОТЫ ................................................................................

29

3.2

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ.....................................................................................................

34

3.3

ПРИМЕР ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ .....................................................................................

34

3.4

СОДЕРЖАНИЕ ОТЧЕТА ..............................................................................................................................

42

3.5

КОНТРОЛЬНЫЕ ВОПРОСЫ .........................................................................................................................

42

4 ЛАБОРАТОРНАЯ РАБОТА №4 ...............................................................................................................

44

4.1 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ЛАБОРАТОРНОЙ РАБОТЫ ................................................................................

44

4.2

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ.....................................................................................................

48

4.3

ПРИМЕР ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ .....................................................................................

48

4.4

СОДЕРЖАНИЕ ОТЧЕТА ..............................................................................................................................

51

4.5

КОНТРОЛЬНЫЕ ВОПРОСЫ .........................................................................................................................

52

5 ВАРИАНТЫ ЗАДАНИЙ.............................................................................................................................

53

6 БИБЛИОГРАФИЧЕСКИЙ СПИСОК .....................................................................................................

58

7 СПРАВОЧНАЯ ИНФОРМАЦИЯ.............................................................................................................

59

7.1

СТАНДАРТНЫЙ ЗАГОЛОВОЧНЫЙ ФАЙЛ <CTYPE.H> .................................................................................

59

3

1. Лабораторная работа №1

Тема лабораторной работы: Построение лексического анализатора.

1.1 Теоретические основы лабораторной работы

Лексическим анализом будем называть процесс перевода исходного текста программы в последовательность лексем. За выполнение лексического анализа отвечает лексический анализатор (сканер).

Лексемами будем считать минимально значимые с точки зрения синтаксиса языка единицы. В зависимости от языка, можно выделить различные типы лексем. Тем не менее,

для языков высокого уровня можно определить следующие основные элементы:

-ключевые слова (begin, while, for),

-идентификаторы (i, j, myfunction),

-константы (123, 1E-5, “name”),

-знаки операций (:=, ++, <<),

-разделители (, ; .)

В процессе лексического анализа комментарии и незначащие символы никак не учитываются, и на выходе лексического анализатора формируется последовательность лексем, которая может быть подана на вход синтаксического анализатора.

В самом анализаторе лексема описывается типом лексемы и некоторой информацией,

которая может зависеть от типа лексемы. Для хранения информации по лексемам таких типов, как идентификаторы и константы, организуются отдельные таблицы. Данные этих таблиц будут использоваться на следующих этапах трансляции.

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

Другим способом может быть определение типа лексемы по первому значащему символу,

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

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

4

признак того, является ли данная лексема разделителем (например, знаки операций, как правило, являются разделителями) и т.д.

После распознавания типа лексемы, для идентификаторов и констант проверяется,

есть ли уже такой идентификатор или константа в таблице идентификаторов или констант.

Если такого идентификатора или константы еще нет, то в соответствующую таблицу помещается необходимая информация. После этого производится формирование выходной лексемы с сопутствующей информацией (тип лексемы, индекс в таблице идентификаторов или констант, положение лексемы в исходном тексе программы и т.д.).

Как было сказано выше, построение лексического анализатора производится , как построение анализатора автоматного языка. Построение такого анализатора производится по следующей схеме:

1)составление автоматной грамматики, описывающей цепочки входного языка (или эквивалентного конечного автомата),

2)в том случае, если грамматика является недетерминированной, приведение ее к детерминированной форме (или построение эквивалентного детерминированного конечного автомата),

3)приведение грамматики ко вполне детерминированной форме,

4)написание программы

Рассмотрим перечисленные этапы более подробно, но вначале дадим необходимые определения.

Грамматикой называется четверка

(S,VN,VT,R)

где S – начальный символ грамматики,

VN - множество нетерминальных символов грамматики,

VT множество терминальных символов грамматики, определяемое алфавитом языка

R – множество правил грамматики.

Каждое правило грамматики в общем случае записывается в виде αβ, где α, β произвольные цепочки, составленные из терминальных и нетерминальных символов грамматики. Нас, тем не менее, здесь будет интересовать очень узкий класс грамматик,

называемых автоматными грамматиками.

Автоматной называется грамматика, все правила которой имеют вид: A→aB, A→a,

где A, B – нетерминальные символы, a – терминальный символ. Правила вида A→a

называют заключительными (терминальными) правилами.

Так, например, автоматная грамматика для описания целочисленных констант имеет вид:

5

S→0S|1S|…|9S|0|1|…|9

Автоматная грамматика для описания идентификаторов:

S→aA|bA|…|zA

A→0A|1A|…|9A|0|1|…|9|aA|bA|…|zA|a|b|…|z

Альтернативой формой задания языка по отношению к автоматной грамматике является описание языка с использованием конечного автомата. Конечный автомат представляет собой пятерку

(Σ, Q, q0, δ, F),

где Σ - конечное множество допустимых входных символов (алфавит),

Q – множество состояний автомата,

q0 множество начальных состояний автомата, δ - функция переходов,

F - множество допускающих состояний автомата.

По автоматной грамматике конечный автомат может быть построен элементарно. Для этого можно руководствоваться следующими правилами:

1) производят замену терминальных правил A→a на правила вида A→aF, где F –

новый нетерминальный символ;

2) множеству терминальных символов грамматики VT ставят в соответствие алфавит конечного автомата Σ, множеству нетерминальных символов грамматики VN - множество состояний автомата Q, начальному символу грамматики S - начальное состояние автомата q0,

нетерминальному символу F - допускающее состояние автомата F;

3) Функцию перехода δ определяют следующим образом: δ(A,a) := {B|A→aB}.

Для приведенного выше примера описания идентификаторов функция перехода,

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

S

A

F

 

 

 

a,b…z A

A, F

 

 

 

 

0,1…9

A, F

 

 

 

 

 

 

1

В контексте построения программы анализа большое значение имеет то, в какой форме представлена автоматная грамматика. Дело в том, что программа может быть непосредственно написана лишь по грамматике, представленной во вполне

6

детерминированной форме, в то время как исходная грамматика часто представлена в недетерминированной форме. Дадим определения формам грамматики.

Говорят, что автоматная грамматика представлена в детерминированной форме, если для любого заданного нетерминального символа A и любого заданного терминального символа a существует не более одного правила A→aX (X – нетерминальный символ). В

противном случае автоматная грамматика представлена в недетерминированной форме.

Говорят, что автоматная грамматика представлена во вполне детерминированной форме, если для любого заданного нетерминального символа A и любого заданного

терминального символа a существует единственное правило A→aX (X – нетерминальный

символ).

Аналогичные определения можно дать и для конечных автоматов. Конечный автомат является детерминированным (ДКА), если множество начальных q0 состояний состоит из единственного начального состояния, а функция переходов δ(q,a) возвращает не более одного состояния для любых q, a. В противном случае мы имеем дело с недетерминированным конечным автоматом (НКА).

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

Учитывая, что для каждой автоматной грамматики существует эквивалентный ей конечный автомат, сформулируем этот алгоритм, как алгоритм перехода от НКА к ДКА.

Пусть (Σ, Q, q0, δN, FN) – исходный НКА, (Σ, P, p0, δD, FD) – искомый ДКА,

эквивалентный исходному. Тогда алгоритм перехода может быть записан следующим образом:

1.Создадим заготовку таблицы переходов искомого автомата и добавим в нее

столбец, соответствующий начальному состоянию p0 ДКА, помечая его в шапке таблицы множеством начальных состояний НКА: p0 := {qi|qi q0}.

2.В том случае, если для некоторого состояния ДКА px, помеченного множеством состояний НКА Qx функция переходов еще не вычислена, вычисляем ее следующим

образом:

δD(px,a) := {δN(qi,a)|qiQx}, a Σ.

Другими словами для каждого символа a алфавита Σ, помечаем соответствующую ячейку δD(px,a) ДА множеством всех состояний δN(qi,a) НКА, достижимых по символу a из тех состояний qi НКА, которыми помечен текущий рассматриваемый столбец px ДА.

7

3.Для каждого вычисленного на шаге 2 множества dD(px,a) проверяем, существует ли

втаблице ДА столбец, обозначенный этим множеством. Если такого столбца нет, то создаем его, включая в множество состояний ДКА новое состояние, помеченное как dD(px,a).

4.Повторяем шаги 2 и 3 до тех пор, пока все переходы dD(px,a) не будут вычислены и порождение новых столбцов (состояний) ДКА не будет прекращено.

5.Определяем заключительные состояния ДКА. Для этого помечаем столбец px ДКА как допускающее состояние, если он содержит хотя бы одно допускающее состояние НКА,

т.е.

FD={pi|qjÎpiÈ qjÎFN}.

С использованием приведенного выше алгоритма, например, НКА следующего вида:

 

¯

 

¯

 

 

 

 

 

 

 

 

 

A

B

C

D

 

 

 

 

 

 

 

a

A,B

 

A

 

 

 

 

 

 

 

 

b

 

B,D

 

 

 

 

 

 

 

 

 

c

 

 

C,B

 

 

 

 

 

 

 

 

 

 

 

 

1

 

будет преобразован к следующему ДКА

 

 

¯

 

 

 

 

 

 

 

 

 

 

 

{A,C}

{A,B}

{C,B}

{A}

{B,D}

 

 

 

 

 

 

a

{A,B}

{A,B}

{A}

{A,B}

 

 

 

 

 

 

 

b

 

{B,D}

{B,D}

 

{B,D}

 

 

 

 

 

 

c

{C,B}

 

{C,B}

 

 

 

 

 

 

 

 

 

 

 

 

 

1

Переход от детерминированной формы ко вполне детерминированной форме осуществляется достаточно просто. Для этого в грамматику вводят так называемый ошибочный нетерминальный символ E и для каждого нетерминального символа A (A¹E È A¹F) добавляют правила A®aE для тех терминальных символов a, которые еще не участвуют в правилах для A:

R=RÈ{ A®aE | (A¹E) È (A¹F) È (A®aB Ï R) }, A,BÎVN, aÎVN.

В таблице переходов ДКА это аналогично введению дополнительного ошибочного состояния и заполнению пустых клеток переходами в новое ошибочное состояние.

Для написания программы удобно использовать граф переходов, построенный по грамматике или ДКА.

8

1.2 Задание на лабораторную работу

Составить автоматную грамматику и на ее основе реализовать лексический анализатор языка, цепочки которого имеют вид, указанный в задании. Лексический анализатор должен преобразовывать исходный текст в последовательность лексем. По результатам работы анализатора должны формироваться таблицы идентификаторов и констант.

1.3 Пример выполнения лабораторной работы

Пусть необходимо построить лексический анализатор для цепочек следующего вида: while <условие> do <оператор> end

<условие> → <сравнение>|<условие><логическая операция><сравнение> <сравнение> → <операнд>|<операнд><операция сравнения><операнд>

<операция сравнения> → <|<=|<>

<операнд> → <идентификатор>|<константа>

<логическая операция> → and|or

<оператор> → <идентификатор> = <арифметическое выражение> <арифметическое выражение> → <операнд>|

<арифметическое выражение><арифметическая операция><операнд>

<арифметическая операция> → +|-

Пример цепочки

while a < b and b <= c do b=b+c-20 end

Решение

Очевидно, в задании описан цикл с предусловием некоторого языка. В качестве алфавита выступают буквы латинского алфавита, цифры, другие значащие символы (+,- ,=,<,>) и незначащие символы (пробел, табуляция, возврат коретки, перевод строки).

Исходя из задания, можно выделить следующие базовые синтаксические элементы

языка:

-ключевые (зарезервированные) слова (while, do, end, and, or)

-идентификаторы,

-константы,

-специальные символы (+,-,<,<=,<>,=).

При этом идентификаторы состоят из букв и цифр и обязательно начинаются с буквы,

константы - только из цифр, специальные символы - могут состоять из одного или двух символов алфавита.

9

При разработке лексического анализатора примем, что перечисленные базовые элементы языка разделяются в программе произвольным количеством незначащих символов,

при этом роль разделителя могут играть специальные символы. Другими словами специальные символы могут следовать непосредственно за другим элементом языка, ровно,

как и любой элемент языка может следовать за специальным символом, не будучи отделенным от него незначащими символами.

На основе выделенных базовых элементов можно составить таблицу терминальных символов языка.

Таблица 1.1 - Таблица терминальных символов:

Индекс

Символ

Категория

Тип

комментарий

 

 

 

 

 

0

while

ключевое слово

while

начало заголовка

 

 

 

 

цикла

 

 

 

 

 

1

do

ключевое слово

do

начало тела цикла

 

 

 

 

 

2

end

ключевое слово

end

конец тела цикла

 

 

 

 

 

3

and

ключевое слово

and

логическое "И"

 

 

 

 

 

4

or

ключевое слово

or

логическое "ИЛИ"

 

 

 

 

 

5

<

специальные

rel

операция

 

 

символ

 

сравнения

 

 

 

 

"строго меньше"

 

 

 

 

 

6

<=

специальные

rel

операция

 

 

символ

 

сравнения

 

 

 

 

"меньше или

 

 

 

 

равно"

 

 

 

 

 

7

<>

специальные

rel

операция

 

 

символ

 

сравнения

 

 

 

 

"неравно"

 

 

 

 

 

8

==

специальные

rel

операция

 

 

символ

 

сравнения "равно"

 

 

 

 

 

9

=

специальные

as

операция

 

 

символ

 

присваивания

 

 

 

 

 

10

+

специальные

ao

операция сложения

 

 

символ

 

 

 

 

 

 

 

11

-

специальные

ao

операция

 

 

символ

 

вычитания

 

 

 

 

 

10