- •Описание атрибутно-транслирующих грамматик
- •1.Грамматика раздела описания программы
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
- •4. Грамматика раздела описания типов
- •5. Грамматика раздела описания переменных
- •8. Грамматика описания операторов
- •9. Грамматика видов операторов
- •10. Грамматика операторов ввода и вывода
- •11. Грамматика оператора присваивания
- •12. Грамматика операторов цикла, условного оператора и оператора безусловного перехода
- •13. Грамматика операторов над списком
- •14. Грамматика логических выражений
- •15. Грамматика арифметических выражений
- •16. Грамматика вызовов функций
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
4. Грамматика раздела описания типов
Входные символы:
Имя символа |
Семантика |
Атрибуты |
TypeDesc |
Раздел описания типов |
|
ManyTypeDef |
Последовательность описаний типов |
|
TypeDef |
Одно описание типа |
|
Typeadr |
Правая часть описания составного или переименованного типа. Атрибут adr– адрес этого типа в таблице пользовательских типов |
adr- синтезированный |
Namesbeg, move |
Перечень имен полей в таблице идентификаторов. Имена идут подряд, начиная с адресаbeg. Количество имен определяет атрибутmove |
beg, move – синтезированные |
FNamesbs, vs |
Перечень идущих подряд секций в таблице секций. Атрибут bs– адрес первой секции. Атрибутvs – количество секций в блоке |
bs, vs – синтезированные |
Fielda |
Одна секция – т.е множество полей записи, принадлежащих одному типу. Например, секция alpha,beta,gamma:integer. Атрибутa– адрес секции в таблице секций |
a-синтезированный |
Idname |
Идентификатор. Атрибут соответствует входному символу |
name -синтезированный |
Intname |
Целое без знака. Атрибут соответствует входному символу |
name -синтезированный |
Операционные символы:
Имя символа |
Семантика |
Атрибуты |
{ЗАПИСАТЬ ИДЕНТИФИКАТОР} id, adr |
Вписывает в таблицу идентификаторов новый идентификатор с именем idпо адресуadr. Графы «значение» и «тип» не заполняются. Если идентификатор с именемidуже присутствует в таблице идентификаторов, то синтаксическая ошибка |
id – унаследованный,adr- синтезированный |
{ЗАРЕЗЕРВИРОВАТЬ}id |
Идентификатор по имени idв таблице идентификаторов резервируется как имя типа или имя поле, т.е теперь он не может принимать значение |
id -унаследованный |
КОПИРОВАТЬ ТИП}old,new, adr |
В таблице пользовательских типов появляется новый тип с именем newи адресомadr. Структура этого типа полностью аналогична структуре типа с именемold |
old,new-унаследованные,adr– синтезированный |
{КОПИРОВАТЬ ЦЕЛЫЙ}adr |
В таблице пользовательских типов появляется новый тип с адресом adr. Поле «имя типа» не заполняется. Поле «Структура типа» заполняется аналогично структуре типаinteger |
adr - синтезированный |
{КОПИРОВАТЬ ВЕЩЕСТВЕННЫЙ}adr |
В таблице пользовательских типов появляется новый тип с адресом adr. Поле «имя типа» не заполняется. Поле «Структура типа» заполняется аналогично структуре типаreal |
adr - синтезированный |
{КОПИРОВАТЬ БУЛЕВСКИЙ}adr1 |
В таблице пользовательских типов появляется новый тип с адресом adr. Поле «имя типа» не заполняется. Поле «структура типа» заполняется аналогично структуре типаreal |
adr - синтезированный |
{НАЗВАТЬ ТИП}name, adr |
В таблице пользовательских типов по адресу adrв поле «имя типа» вставляется значение атрибутаname. |
name, adr – унаследованные |
{СОЗДАТЬ ДИАПАЗОН}n1, n2, tp, adr |
Создается пользовательский тип со структурой диапазонного типа с начальным значением n1 и конечным значениемn2. Атрибутtpопределяет, целые лиn1 иn2 или вещественные. Если их типы не совпадают, то синтаксическая ошибка. Структура записывается в поле «структура типа» таблицы пользовательских типов по адресуadrПоле «имя типа» не заполняется. |
n1,n2,tp– унаследованные,adr– синтезированный. |
{СОЗДАТЬ ПЕРЕЧИСЛЕНИЕ}beg, move, adr |
Создается пользовательский тип со структурой перечислимого типа. Все значения перечислимого типа описываются в таблице идентификаторов подряд, начиная с адреса beg. Количество значений выражает атрибутmove. Атрибутadrобозначает адрес нового типа в таблице пользовательских типов. Поле «имя типа» не заполняется. |
beg,move– унаследованные,adr– синтезированный |
{CОЗДАТЬ ЗАПИСЬ}b, v, adr |
Создается пользовательский тип со структурой записи по адресу adrв таблице пользовательских типов. Поля записи копируются из таблицы идентификаторов и из таблицы секций. Атрибутb– адрес первой нужной секции в таблице секций, атрибутv–количество секций. В секциях содержатся данные о типах и названиях полей. Поле «имя типа» не заполняется. |
b,v– унаследованные,adr– синтезированный |
{СОЗДАТЬ СПИСОК}tp, adr |
По адресу adrв таблице пользовательских типов создается новый тип со структурой списка элементов типа с именемtp. Поле «имя типа» не заполняется. |
tp–унаследованный,adr - синтезированный |
{СОЗДАТЬ СЕКЦИЮ}t, start, v, n |
В таблице секций по адресу nсоздается новая секция. Атрибутt– тип элементов секции, атрибутstart– адрес таблицы идентификатора, где начинается перечисление имен полей данной секции, атрибутv- количество имен в секции |
t,start,v– унаследованные,n- синтезированный |
Правила:
TypeDesc->typeManyTypeDef
TypeDef->Idname=Typeadr{НАЗВАТЬ ТИП}name1, adr1{ЗАПИСАТЬ ИДЕНТИФИКАТОР}name2, adr2 {ЗАРЕЗЕРВИРОВАТЬ}id
name1, name2, id <- name
adr1 <- adr
adr2 <- НовыйИдентификатор
TypeDef -> Idname1 = Idname2 {КОПИРОВАТЬ ТИП}old,new, adr {ЗАПИСАТЬ ИДЕНТИФИКАТОР}name3, adr1 {ЗАРЕЗЕРВИРОВАТЬ}id
old, name3, id <- name1
new <- name2
adr <- НовыйТип
adr1 <- НовыйИдентификатор
ManyTypeDef -> ManyTypeDef ; TypeDef
ManyTypeDef -> TypeDef
Typeadr -> integer {КОПИРОВАТЬ ЦЕЛЫЙ}adr1
adr1 <- НовыйТип
adr<-adr1
Typeadr->real{КОПИРОВАТЬ ВЕЩЕСТВЕННЫЙ}adr1
adr1 <- НовыйТип
adr <- adr1
Typeadr -> boolean {КОПИРОВАТЬ БУЛЕВСКИЙ}adr1
adr1 <- НовыйТип
adr <- adr1
Typeadr -> Intname1 .. Intname2 {СОЗДАТЬ ДИАПАЗОН}n1, n2, tp, adr1
n1 <- name1
n2 <- name2
tp<- integer
adr1 <- НовыйТип
adr <- adr1
Typeadr -> Numname1 .. Numname2 {СОЗДАТЬ ДИАПАЗОН}n1, n2, tp, adr1
n1 <- name1
n2 <- name2
tp<- real
adr1 <- НовыйТип
adr <- adr
Typeadr -> ( Namesbeg, move ) {СОЗДАТЬ ПЕРЕЧИСЛЕНИЕ}beg1, move1,adr1
beg1 <- beg
move1 <- move
adr1 <- НовыйТип
adr <- adr1
Typeadr -> record FNamesbs, vs end {CОЗДАТЬ ЗАПИСЬ}b, v, adr1
b <- bs
v <- vs
adr1 <- НовыйТип
adr <- adr1
Typeadr -> list of Idname {СОЗДАТЬ СПИСОК}tp, adr1
tp <- name
adr <- НовыйТип
adr <- adr1
Typeadr -> list of integername {СОЗДАТЬ СПИСОК}tp, adr1
tp <- name
adr <- НовыйТип
adr <- adr1
Typeadr -> list of realname {СОЗДАТЬ СПИСОК}tp, adr1
tp <- name
adr <- НовыйТип
adr <- adr1
Typeadr -> list of booleanname {СОЗДАТЬ СПИСОК}tp, adr1
tp <- name
adr<- НовыйТип
adr<-adr1
Namesbeg, move ->Idname {ЗАПИСАТЬ ИДЕНТИФИКАТОР}id, adr{ЗАРЕЗЕРВИРОВАТЬ}id1
id, id1 <- name
adr <-НовыйИдентификатор
beg <- adr
move <- 1
Namesbeg1, move1 -> Namesbeg, move Idname {ЗАПИСАТЬ ИДЕНТИФИКАТОР}id, adr {ЗАРЕЗЕРВИРОВАТЬ}id1
id <- name
adr <- НовыйИдентификатор
beg1 <- beg
move1 <- move + 1
id1 <- id
FNamesbs, vs -> Fielda
bs <- a
vs <- 1
FNamesbs1, vs1 -> FNamesbs, vs ; Fielda
bs1 <- bs
vs1 <- vs + 1
Fielda -> Namesbeg, move : Idname {СОЗДАТЬ СЕКЦИЮ}t, start, v, n
t <- name
start < beg
v <- move
n <- НоваяСекция
a <- n
Fielda -> Namesbeg, mov : integername {СОЗДАТЬ СЕКЦИЮ} t, start, v, n
t <- name
start < beg
v <- move
n <- НоваяСекция
a <- n
Fielda -> Namesbeg, mov : realname {СОЗДАТЬ СЕКЦИЮ} t, start, v, n
t <- name
start <- beg
v <- move
n <- НоваяСекция
a <- n
Fielda -> Namesbeg, mov : booleanname {СОЗДАТЬ СЕКЦИЮ} t, start, v, n
t <- name
start < beg
v <- move
n <- НоваяСекция
a <- n