- •Описание атрибутно-транслирующих грамматик
- •1.Грамматика раздела описания программы
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
- •4. Грамматика раздела описания типов
- •5. Грамматика раздела описания переменных
- •8. Грамматика описания операторов
- •9. Грамматика видов операторов
- •10. Грамматика операторов ввода и вывода
- •11. Грамматика оператора присваивания
- •12. Грамматика операторов цикла, условного оператора и оператора безусловного перехода
- •13. Грамматика операторов над списком
- •14. Грамматика логических выражений
- •15. Грамматика арифметических выражений
- •16. Грамматика вызовов функций
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
13. Грамматика операторов над списком
Операционные символы
Имя символа |
Семантика |
Атрибуты |
{ВЫЗОВ EQ}a, {ВЫЗОВV}a, {ВЫЗОВCondition}a |
Вызовы соответствующих ДМП-процессоров. Результаты их работы запоминаются как атрибут a |
a-синтезированный |
{ДОБАВИТЬ}list, val, n |
В списке идентификаторов ищется значение переменной по адресу list. Еслиn= 1, то поиск по адресуvalпроизводится в таблице промежуточных значений, еслиn= 2 – в таблице идентификаторов. Далее, если типы значений по адресамlistиvalне совпадают, то ошибка, иначе в конец списка значений по адресуlistдобавляется один элемент, куда копируется значение из адресаval. |
val,list– унаследованные,n– синтезированный |
{КОНКАТЕНАЦИЯ}list1, list2 |
В таблице идентификаторов ищутся элементы по адресу list1 иlist2. Если эти переменные не списки или типы элементов этих списков не совпадают, то ошибка. Иначе список значений по адресуlist1 дополняется элементами спискаlist2 |
list1, list2– унаследованные |
{УДАЛИТЬ ЭЛЕМЕНТ} list, ind |
В таблице идентификаторов ищутся элементы по адресу listиind. Если переменная по адресуlistне список или переменная по адресуindне целая или отрицательная, то ошибка. Если количество элементов меньше заданного номера, ничего не удаляется. В противном случае из полученного списка удаляется элемент с полученным номером и перенумеровываются все элементы, с большими номерами (их номера уменьшаются на 1) |
|
Правила
OList -> add ( Ida , Intb ) {ДОБАВИТЬ}list, val, 1
list <- a
val <- b
OList -> add ( Ida , Numb ) {ДОБАВИТЬ}list, val, 1
list <- a
val <- b
OList -> add ( Ida , Bb ) {ДОБАВИТЬ}list, val, 1
list <- a
val <- b
OList -> add ( Ida , V {ВЫЗОВ V}c ) {ДОБАВИТЬ}list, val, 2
list <- a
val <- с
OList -> add ( Ida , EQ {ВЫЗОВ EQ}c ) {ДОБАВИТЬ} list, val, 1
list <- a
val <- c
OList -> add ( Ida , Condition {ВЫЗОВ Condition}c) {ДОБАВИТЬ}list, val, 1
list <- a
val <- c
OList -> concat ( Ida , Idb ) {КОНКАТЕНАЦИЯ}list1, list2
list1 <- a
list2 <- b
OList -> remove ( Ida , Intb ) {УДАЛИТЬ ЭЛЕМЕНТ}list, ind
list <- a
ind <- b
14. Грамматика логических выражений
Входные символы
Имя |
Семантика |
Атрибуты (все синтезированы) |
Conditiona |
Логическое выражение, значение которого хранится в таблице промежуточных значений по адресу a |
a |
Z1a |
Логическое слагаемое, значение которого хранится в таблице промежуточных значений по адресу a |
a |
Z2a |
Логический множитель, значение которого хранится в таблице промежуточных значений по адресу a |
a |
Z3a |
Логический терм, значение которого хранится в таблице промежуточных значений по адресу a |
a |
Z4a |
Логический операнд, значение которого хранится в таблице промежуточных значений по адресу а |
a |
F1a |
Остаток логической суммы, значение которого хранится в таблице промежуточных значений по адресу a |
a |
F2a |
Остаток логического произведения, значение которого хранится в таблице промежуточных значений по адресу a |
a |
Signa |
Знак сравнения. Его атрибут – адрес соответствующего знака (<, >=, <>) в таблице знаков операций |
a |
EQ |
Арифметическое выражение |
a |
Операционные символы:
Имя символа |
Семантика |
Атрибуты |
{ВЫЗОВ EQ}a, {ВЫЗОВV}a, {ВЫЗОВCondition}a |
Вызовы соответствующих ДМП-процессоров. Результаты их работы запоминаются как атрибут a |
a-синтезированный |
{НЕ}с, res |
Генерируется триада NOTc, которая записывается в таблице триад под адресомres |
С –унаследованный,res - синтезированный |
{И}m1, m2, res |
Генерируется триада ANDm1m2, которая записывается в таблице триад под адресомres |
m1,m2 – унаследованные, res– синтезированный |
{ИЛИ}m1, m2, res |
Генерируется триада ORm1m2, которая записывается в таблице триад под адресомres |
m1,m2 – унаследованные, res– синтезированный |
{СРАВНЕНИЕ}m1, m2, cod, res |
Генерируется триада по таблице сравнений, приведенной далее |
m1,m2,cod– унаследованные, res– синтезированный |
Таблица сравнений
Код операции (code) |
Тип первого операнда m1 Тип второго операнда m2 |
Генерируемая триада |
5 (=) |
Типы совпадают и равны integer |
=I m1 m2 |
5 (=) |
Типы совпадают и равны real |
=R m1 m2 |
5 (=) |
Типы совпадают и равны boolean |
=B m1 m2 |
5 (=) |
Типы не совпадают |
ОШИБКА |
6 (<>) |
Типы совпадают и равны integer |
<>I m1 m2 |
6 (<>) |
Типы совпадают и равны real |
<>R m1 m2 |
6 (<>) |
Типы совпадают и равны boolean |
<>B m1 m2 |
6 (<>) |
Типы не совпадают |
ОШИБКА |
7 (>) |
Типы совпадают и равны integer |
>I m1 m2 |
7 (>) |
Типы совпадают и равны real |
>R m1 m2 |
7 (>) |
Типы совпадают и равны boolean |
>B m1 m2 |
7 (>) |
Типы не совпадают |
ОШИБКА |
8 (<) |
Типы совпадают и равны integer |
<I m1 m2 |
8 (<) |
Типы совпадают и равны real |
<R m1 m2 |
8 (<) |
Типы совпадают и равны boolean |
<B m1 m2 |
8 (<) |
Типы не совпадают |
ОШИБКА |
9 (>=) |
Типы совпадают и равны integer |
>=I m1 m2 |
9 (>=) |
Типы совпадают и равны real |
>=R m1 m2 |
9 (>=) |
Типы совпадают и равны boolean |
>=B m1 m2 |
9 (>=) |
Типы не совпадают |
ОШИБКА |
10 (<=) |
Типы совпадают и равны integer |
<=I m1 m2 |
10 (<=) |
Типы совпадают и равны real |
<=R m1 m2 |
10 (<=) |
Типы совпадают и равны boolean |
<=B m1 m2 |
10 (<=) |
Типы не совпадают |
ОШИБКА |
Правила
Condition a -> Z1b F1c {ИЛИ}m1, m2, res
m1 <- b
m2 <- c
res = НоваяТриада
a <- res
Condition a -> Z1b
a <- b
Z1a -> Z2b F2 c {И}m1, m2, res
m1 <- b
m2 <- c
res = НоваяТриада
a <- res
Z1a -> Z2b
a<- b
Z2a -> Z3b
a <- b
Z3a -> not Z3b {НЕ}c, res
c <- b
res = НоваяТриада
a <- res
Z3a -> Z4b
a <- b
Z4a -> V {ВЫЗОВ V}c
c= Новая Триада
a<-c
Z4a -> Bb
a <- b
Z4a -> (EQ {ВЫЗОВ EQ}c1 Sgncd EQ {ВЫЗОВ EQ}c2 ) {СРАВНЕНИЕ}m1, m2, cod, res
m1 <- c1
m2 <- c2
cod <- cd
res = НоваяТриада
a <- res
Z4a -> (Condition {ВЫЗОВ Condition}c )
с = НоваяТриада
a <- c
Z4a -> ( Condition {ВЫЗОВ Condition}c1 Sgncd Condition {ВЫЗОВ Condition}c2) {СРАВНЕНИЕ}m1, m2, cod, res
с1, с2 = НоваяТриада
m1 <-c1
m2 <-c2
cod <- cd
res = НоваяТриада
a <- res
F1a -> or Z1b F1c {ИЛИ}m1, m2, res
m1 <- b
m2 <- c
res = НоваяТриада
a <-res
F1a-> or Z1b
a <- b
F2a -> and Z2b F2c {И}m1, m2, res
m1 <- b
m2 <- c
res = НоваяТриада
a <- res
F2a -> and Z2b
a <- b
Sgncd-> < code
cd <- code
Sgncd-> > code
cd <- code
Sgncd-> = code
cd <- code
Sgncd-> <> code
cd <- code
Sgncd-> <= code
cd <- code
Sgncd-> >=code
cd <- code