Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик по ТЯП. Вариант 5.doc
Скачиваний:
16
Добавлен:
01.05.2014
Размер:
975.87 Кб
Скачать

15. Грамматика арифметических выражений

Входные символы

Имя

Семантика

Атрибуты

EQa

Арифметическое выражение. В таблице триад по адресуaлежит значение этого выражения

a – синтезированный

T1b

Слагаемое со значением по адресу bв таблице триад

b– синтезированный

T2b

Множитель со значением по адресу bв таблице триад

b– синтезированный

E1cd, t

Остаток суммы со знаком операции. Атрибут cd– код знака операции, атрибутt– адрес в таблице триад, по которому хранятся значения остатка

сd, t - синтезированные

E2 cd, t

Остаток произведения со знаком операции. Атрибут cd– код знака операции, атрибутt– адрес в таблице триад, по которому хранятся значения остатка

сd, t – синтезированные

V

Переменная

CallFunc

Вызов функции

Операционные символы:

Имя символа

Семантика

Атрибуты

{ВЫЗОВ EQ}a, {ВЫЗОВV}a, {ВЫЗОВCondition}a

Вызовы соответствующих ДМП-процессоров. Результаты их работы запоминаются как атрибут a

a-синтезированный

{ОПЕРАЦИЯ} m1, m2, code, res

В соответствии с кодом операции codeгенерируется триада, адрес которойres, параметры –m1 иm2. Схема генерации показана в таблице

m1,m2,code– унаследованные,res– синтезированный

Таблица генерации триад для арифметических выражений

Код операции (code)

Тип первого операнда m1

Тип второго операнда m2

Генерируемая триада

1 (+)

integer

integer

+I m1 m2

1 (+)

integer

real

ОШИБКА

1 (+)

Real

integer

ОШИБКА

1 (+)

Real

real

+R m1 m2

2 (-)

integer

integer

-I m1 m2

2 (-)

integer

real

ОШИБКА

2 (-)

Real

integer

ОШИБКА

2 (-)

Real

real

-R m1 m2

3 (*)

integer

integer

*I m1 m2

3 (*)

integer

real

ОШИБКА

3 (*)

Real

integer

ОШИБКА

3 (*)

Real

real

*R m1 m2

4 (\)

integer

integer

\I m1 m2

4 (\)

integer

real

ОШИБКА

4 (\)

Real

integer

ОШИБКА

4 (\)

Real

real

\R m1 m2

Правила

EQ a -> T1b E1cd, t {ОПЕРАЦИЯ}m1, m2, code, res

m1 <- b

m2 <- t

code <- cd

res = НоваяТриада

a <- res

EQ a -> T1b

a <- b

E1cd, t -> +code T1b E1cd1, t1 {ОПЕРАЦИЯ}m1, m2, code1, res

cd <- code

m1 <- b

m2 <- t1

code1 <- cd1

res = НоваяТриада

t <- res

E1cd, t -> +code T1b

cd <- code

t <- b

E1cd, t -> - code T1b E1cd1, t1 {ОПЕРАЦИЯ}m1, m2, code1, res

cd <- code

m1 <- b

m2 <- t1

code1 <- cd1

res = НоваяТриада

t <- res

E1cd, t -> -code T1b

cd<- code

t <- b

E2cd, t -> * code T2b E2cd1, t1 {ОПЕРАЦИЯ}m1, m2, code1, res

cd <- code

m1 <- b

m2 <- t1

code1 <- cd1

res = НоваяТриада

t <- res

E2cd, t -> *code T2b

cd <- code

t <- b

E2cd, t -> \code T2b E2cd1, t1 {ОПЕРАЦИЯ}m1, m2, code1, res

cd <- code

m1 <- b

m2 <- t1

code1 <- cd1

res = НоваяТриада

t <- res

E2cd, t -> \ code T2b

cd <-code

t <- b

T1a -> T2b E2cd, t {ОПЕРАЦИЯ}m1, m2, code, res

m1 <- b

m2 <- t

code <- cd

res = НоваяТриада

a <- res

T1a -> T2b

a <- b

T2a -> Vb {ВЫЗОВ V}с

a, b <- c

T2a -> Int b

a <- b

T2a -> Num b

a <- b

T2a -> CallFunc {ВЫЗОВ CallFunc}c

c <- НоваяТриада

a <- c

T2a -> ( EQb ) {ВЫЗОВ EQ}c

с <- НоваяТриада

a, b <- c