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

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