- •Описание атрибутно-транслирующих грамматик
- •1.Грамматика раздела описания программы
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
- •4. Грамматика раздела описания типов
- •5. Грамматика раздела описания переменных
- •8. Грамматика описания операторов
- •9. Грамматика видов операторов
- •10. Грамматика операторов ввода и вывода
- •11. Грамматика оператора присваивания
- •12. Грамматика операторов цикла, условного оператора и оператора безусловного перехода
- •13. Грамматика операторов над списком
- •14. Грамматика логических выражений
- •15. Грамматика арифметических выражений
- •16. Грамматика вызовов функций
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
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