- •Описание атрибутно-транслирующих грамматик
- •1.Грамматика раздела описания программы
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
- •4. Грамматика раздела описания типов
- •5. Грамматика раздела описания переменных
- •8. Грамматика описания операторов
- •9. Грамматика видов операторов
- •10. Грамматика операторов ввода и вывода
- •11. Грамматика оператора присваивания
- •12. Грамматика операторов цикла, условного оператора и оператора безусловного перехода
- •13. Грамматика операторов над списком
- •14. Грамматика логических выражений
- •15. Грамматика арифметических выражений
- •16. Грамматика вызовов функций
- •2. Грамматика раздела описания меток
- •3. Грамматика раздела описания констант
3. Грамматика раздела описания констант
Входные символы:
Имя символа |
Семантика |
Атрибуты |
ConsDesc |
Раздел описания констант |
|
ManyConsDef |
Последовательность определений констант |
|
ConsDef |
Одно определение константы |
|
Idname |
Идентификатор. Атрибут соответствует входному символу |
name -синтезированный |
Операционные символы:
Имя символа |
Семантика |
Атрибуты |
{ВЫЗОВ EQ}a, {ВЫЗОВ Condition}a |
Вызовы соответствующих ДМП-процессоров. Результаты их работы запоминаются как атрибут a |
a-синтезированный |
{ЗАПИСАТЬ ИДЕНТИФИКАТОР} id, adr |
Вписывает в таблицу идентификаторов новый идентификатор с именем id по адресу adr. Графы «значение» и «тип» не заполняются. Если идентификатор с именем id уже присутствует в таблице идентификаторов, то синтаксическая ошибка |
id – унаследованный, adr- синтезированный |
{ОПРЕДЕЛИТЬ ТИП}d, adr |
В таблице идентификаторов находит идентификатор по адресу adr и вписывает в поле «тип» значение типа по адресу d в таблице промежуточных значений (обычно это integer, real, boolean) |
d, adr - унаследованные |
{ПРИСВОИТЬ} left, flag, right |
В таблице идентификаторов ищется переменная по адресу left. Значение по адресу right ищется в таблице идентификаторов, если flag = 1 или в таблице промежуточных значений, если flag = 0. Если имя типа переменной и имя типа найденного значения не совпадают, то синтаксическая ошибка. Если переменная по адресу left помечена как «константа» или «метка», то синтаксическая ошибка. Иначе в поле «значение» переменной записывается содержимое поля «значение» по адресу right. |
left, right - унаследованные |
{ЗАКРЕПИТЬ}name |
B таблице идентификаторов идентификатор с именем name помечается как «неизменяемый» |
name -унаследованный |
Правила:
ConsDesc -> const ManyConsDef
ManyConsDef -> ConsDef
ManyConsDef -> ManyConsDef ; ConsDef
ConsDef -> Idname := EQ {ВЫЗОВ EQ}c {ЗАПИСАТЬ ИДЕНТИФИКАТОР}name1, adr {ОПРЕДЕЛИТЬ ТИП}d, adr {ПРИСВОИТЬ} left, flag, right {ЗАКРЕПИТЬ}name2
d, right <- c
adr <- НовыйИдентификатор
adr1 <- adr
name1, left, name2 <- name
flag <- 0
ConsDef->Ida:=Condition{ВЫЗОВ Condition}c{ЗАПИСАТЬ ИДЕНТИФИКАТОР}name1, adr {ОПРЕДЕЛИТЬ ТИП}d, adr {ПРИСВОИТЬ} left, flag, right {ЗАКРЕПИТЬ}name2
d, right <- c
adr <- НовыйИдентификатор
adr1 <- adr
name1, left, name2 <- name
flag <- 0