- •Описание атрибутно-транслирующих грамматик
- •1.Грамматика раздела описания программы
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
- •4. Грамматика раздела описания типов
- •5. Грамматика раздела описания переменных
- •8. Грамматика описания операторов
- •9. Грамматика видов операторов
- •10. Грамматика операторов ввода и вывода
- •11. Грамматика оператора присваивания
- •12. Грамматика операторов цикла, условного оператора и оператора безусловного перехода
- •13. Грамматика операторов над списком
- •14. Грамматика логических выражений
- •15. Грамматика арифметических выражений
- •16. Грамматика вызовов функций
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
5. Грамматика раздела описания переменных
Входные символы:
Имя символа |
Семантика |
Атрибуты |
VarDesc |
Раздел описания переменной |
|
ManyVarDef |
Перечень определений |
|
VarDef |
Определение ряда переменных одного типа |
|
VarNamesbeg, move |
Перечень имен переменных. Атрибутbeg– адрес первой переменной в перечне. Атрибутmove – количество переменных в перечне |
beg, move - синтезированные |
Idname |
Идентификатор. Атрибут соответствует входному символу |
name -синтезированный |
integername, realname, booleanname |
Ключевое слово – имя типа. Атрибут соответствует входному символу |
name -синтезированный |
|
|
|
Операционные символы:
Имя символа |
Семантика |
Атрибуты |
{ТИП ПЕРЕМЕННОЙ} typename,beg, move |
Устанавливает имя типа typenameдля перечня переменных, расположенных подряд в таблице идентификаторов,beg– адрес первой переменной в перечне,move– количество переменных (Каждой переменной соответствует строка в таблице идентификаторов). Если имя типа отсутствует в таблице пользовательских типов – синтаксическая ошибка |
typename, beg, move – синтезированные |
{ЗАПИСАТЬ ИДЕНТИФИКАТОР} id, adr |
Вписывает в таблицу идентификаторов новый идентификатор с именем idпо адресуadr. Графы «значение» и «тип» не заполняются. Если идентификатор с именемidуже присутствует в таблице идентификаторов, то синтаксическая ошибка |
id – унаследованный,adr- синтезированный |
Правила:
VarDesc->varManyVarDef
VarDef->VarNamesbeg, move :Idname{ТИП ПЕРЕМЕННОЙ}typename,beg1, move1
typename <- name
beg1 <- beg
move1 <- move
VarDef -> VarNamesbeg, move : integername {ТИП ПЕРЕМЕННОЙ}typename, beg1, move1
typename <- name
beg1 <- beg
move1 <- move
VarDef -> VarNamesbeg, move : realname {ТИП ПЕРЕМЕННОЙ}typename, beg1, move1
typename <- name
beg1 <- beg
move1 <- move
VarDef -> VarNamesbeg, move : booleanname {ТИП ПЕРЕМЕННОЙ}typename, beg1, move1
typename <- name
beg1 <- beg
move1 <- move
ManyVarDef -> VarDef
ManyVarDef -> ManyVarDef ; VarDef
VarNamesbeg, move -> Idname {ЗАПИСАТЬ ИДЕНТИФИКАТОР}id, adr
id <- name
adr <- НовыйИдентификатор
beg <- adr
move <- 1
VarNames beg, move -> VarNamesbeg1, move1 , Idname {ЗАПИСАТЬ ИДЕНТИФИКАТОР}id, adr
id<- name
adr = НовыйИдентификатор
beg <- beg1
move <- move1 +1
Грамматика меток
Символы грамматики
Имя символа |
Семантика |
Атрибуты |
Lb |
Метка с адресом bв таблице меток |
b - синтезированный |
Idname |
Идентификатор. Атрибут соответствует входному символу |
name -синтезированный |
Intname |
Целое без знака. Атрибут соответствует входному символу |
name -синтезированный |
{GETLABEL}id, a |
Из таблицы меток берется адрес a метки с именем id. |
id- унаследованный a- синтезированный |
Правила
Lb -> Idname {GETLABEL}id, a
id <- name
b <-a
Lb -> Intname {GETLABEL}id, a
id <- name
b <-a
Грамматика переменных
Входные символы:
Имя |
Семантика |
Атрибуты |
Vc |
Переменная с адресом cв таблице идентификаторов |
с-синтезированный |
Fp |
Поле переменной с адресом pв таблице идентификаторов |
p- синтезированный |
Операционные символы:
Имя символа |
Семантика |
Атрибуты |
{GETID}id, a |
Получить адрес aидентификатораcименемidв таблице идентификаторов |
a - синтезированный |
{ПОЛЕ ЗАПИСИ}q,r,res |
По адресам qпеременной иrимени поля в таблице пользовательских типов получить поле записи переменной и записать результат в поле таблицы промежуточных значений с адресомres |
q,r– унаследованные,res- синтезированный |
Правила
Vc->Fp
c<-p
Fp -> Idname {GETID}id, a
id <- name
p <- a
Fp1 -> Fp2 . Idname {GETID}id, a {ПОЛЕ ЗАПИСИ}q, r, res
id <- name
q <- p2
r <- a
res <- НоваяТриада
p1 <-res