Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы по СПО.doc
Скачиваний:
6
Добавлен:
30.10.2018
Размер:
370.18 Кб
Скачать

Содержание отчета

    1. Система кодирования;

    2. Таблица заранее предопределенных лексем и их кодов;

    3. Алгоритм сканирования;

    4. Листинг программы.

Контрольные вопросы

  1. Кодируются ли комментарии?

  2. Какие таблицы формируются при кодировании?

  3. В чем достоинство подхода к формированию таблиц отсортированных лексем?

  4. На какой фазе компиляции проводится лексическое сканирование?

  5. Является ли лексемой Турбо-Паскаля точка?

Лабораторная работа №6

Свертка выражений

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

Введение

Любое арифметическое и/или логическое выражение также может быть представлено в виде синтаксического дерева. Визуально такое представление удобно для просмотра, но на практике выражения хранятся в машинном виде [4]. А для такого хранения больше подходит польская (префиксная) запись выражений. Она строится с учетом приоритета операций и скобок. Например, инфиксное выражение а + b * c в польской записи имеет вид

+(a * (b, c)).

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

a := b * (c – d) + 2 * b * (c – d – 100)

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

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

Таблица 6.1

Результат

Операция

Операнд1

Операнд2

R1

-

с

d

R2

-

c

d

R3

-

R3

100

R4

*

b

R1

R5

*

2

b

R6

*

R5

R3

a

+

R4

R6

В процессе заполнения такой таблицы проверяется синтаксис выражения, а само представление упрощает переход к машинному языку, который строится на основе двух- или трехадресных команд. Этот переход производится путем редукции. Для рассматриваемого примера она будет иметь вид (см. табл. 6.1):

a := b * R1 + 2 * b * (c – d – 100)

a := b * R1 + 2 * b * (R2 – 100)

a := b * R1 + 2 * b * R3

a := R4 + 2 * b * R3

a := R4 + R5 * R3

a := R4 + R6

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

Здесь же можно увидеть, в чем заключается один из вариантов оптимизации программы: в данном примере время работы программы можно сократить за счет устранения дублирования вычислений c – d.

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

Следующий вариант – оптимизация булевых выражений:

If a OR b Or c THEN …

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

Выполнение лабораторной работы

  1. В соответствии с вариантом выбрать из табл. 6.2 исходной выражение.

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

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

  4. Определить возможные варианты оптимизации и произвести ее.

Таблица 6.2

№ п/п

АС

ВС

1

(a>9) or ((x/4.5-y3)<a) and (b=4)

x+2*y/(cos(a-7.8)+x)-ln(3a)

2

8.9+sin(x-2*y*(a-6)x)/ey

(4.9-y(3x+2y-8))*cos3(a-x)

3

not(a>8) and (sin(4(x+y)<>b) and true

(a+6.9)/(b-3y) <= ((xa+y)/xy-5)

4

(3/x-y/7) >= (ax-by)/a3

5

a2+b3-2abcos(x-a/b)

sin(/2+x)-cos(|y+x|)2(a+b)

6

not(x(x-3)(x-y)/6 < (a(a-b)/2) or (x >y)

x3+3a2b-3ab2-y3 >= 6

7

(x=(a/(a2+b2)) or (y=(a/(a2+b2)) or (a>=b))

cos(x)-(a2-b2)1/2+sin(y-a)

8

cos2x+cos2y-sin2a+10cos3(b+2)

(cos4x >= (cos4x+4cos2x-3y)) and (a/2 <=2b)

9

x5-3x4+8/a3-16y2+15b

5x4-12y3*24b2+32a

10

((-b+(b2-4ac)1/2/(2a) >0) and true

(-a/2-(b2/4+x3/27)1/2)1/3

11

x2-8a(a2+ya-b+y2/4)

y2-(2a)1/2+(x/2+a+b/(2(2a)1/2)

12

(ax+b)/(x2+yx+sin(ax))

2-x+2y+7x2/y3

13

b2y2+xy3+(7y)1/2-11+a

(2+y)3+|x|+7b3x2

14

(-11+(7y)1/2)*(1+y3)x > (ba)2

ax2+2axy+by-a <= 0

15

aln(tg(/4+x/2)-asin(x)

a(1+y)sin(by)-absin((1+y)b)

16

(x2+y2)2-2a2(x2-y2)

(a>9) or ((x/4-y3)<a) and (sin(4(x+y) < b)

17

(x2-4)/(y2-a-2)eb

8.9+(ax-by)/a3-2abcos(x-a/b)

18

(1/x-3)/(ln(x)+(y-1)/a)*|b|

sin(x-2*y*(a-6)x)- a2+b3

19

ln|(a+x)/(a-y)|/(2b)*sin(x)

not(x(x-3)(x-y)/6<= ((xa+y)/xy-5)

20

ln|sin(x2-cos2(y)+b)|*(x+a)

x=(a/(a2+b2)) or (a/2 <=2b)

21

ln(x+(a2+y2))/(1-x2/b2)

cos2x+cos2y-sin2a+8/a3-16y2+15b

22

ln(x2+1)/4-ln|x+1|/2+(x-1)/(2(x2+1))

(xy3+(7y)1/2)/(y2-a-2)eb

23

2(a1/2y2+by+xa1/2)/(2*x+b)

(4.9-y(3x+2y-8))*x5-3x4+8

24

|easin(x2-y/6)|+b

(x2+y2)2-|x|+7b3x2