- •0. Оглавление
- •1.2. Соглашения об обозначениях
- •2) Описания
- •1.5. Выражения
- •5) Аддитивные операторы
- •1) Оператор-выражение
- •2) Составной оператор
- •3) Условный оператор
- •Атрибутная грамматика
- •Семантические процедуры
- •2.2. Подграмматика описаний
- •Атрибутная грамматика
- •Семантические процедуры
- •2.3. Основная грамматика
- •Атрибутная грамматика
- •Семантические процедуры
- •Приложение 1. Таблицы лексем
- •Приложение 2. Описания триад
Семантические процедуры
{переход}A
Если А отсутствует в таблице меток, добавить её туда и проинициализировать нулями.
Сгенерировать триаду jmp A.адрес.
Если A.адрес == 0, добавить адрес сгенерированной триады в A.список_триад.
{переход_0}A1,A2
Аналогично {переход}, только генерировать триаду jz A1,A2
{метка}A
Если A отсутствует в таблице меток, добавить её туда.
Если A уже есть в таблице иA.адрес == 0, установитьA.адрес в адрес текущей триады и исправить на выходной ленте все триады из списка триад, требующих уточнения.
Исключительная ситуация:
В таблице меток уже есть метка с данным именем и A.адрес не ноль.
{выход}A
Сгенерировать ret A.
Исключительная ситуация:
A имеет тип, отличный от int.
{ввод}A
Если A – переменная типа int, сгенерировать триаду rdi A.
Если A – переменная типа double, сгенерировать триаду rdd A.
Если A – переменная типа vector[n], сгенерировать триады
rdd A+i } для всех i от 0 до n-1
Исключительная ситуация:
A – не простая переменная или вектор.
{вывод}A
Если A – переменная типа int, сгенерировать триаду wri A.
Если A – переменная типа double, сгенерировать триаду wrd A.
Если A – переменная типа vector[n], сгенерировать триады
wrd A+i } для всех i от 0 до n-1
Исключительная ситуация:
A – не простая переменная или вектор.
{уид}R
R = уникальный идентификатор.
Приложение 1. Таблицы лексем
класс |
индекс |
атрибут |
const |
0 |
|
else |
0 |
|
goto |
0 |
|
if |
0 |
|
input |
0 |
|
len |
0 |
|
limited |
0 |
|
output |
0 |
|
return |
0 |
|
typedef |
0 |
|
vector |
0 |
|
while |
0 |
|
[ |
0 |
|
] |
0 |
|
{ |
0 |
|
} |
0 |
|
( |
0 |
|
) |
0 |
|
.. |
0 |
|
! |
0 |
|
= |
0 |
|
аддитивные |
0 |
+ |
1 |
- | |
мультипликативные |
0 |
* |
1 |
/ | |
отношения |
0 |
< |
1 |
> | |
2 |
<= | |
3 |
>= | |
4 |
== | |
5 |
!= | |
&& |
0 |
|
|| |
0 |
|
e (выражение) |
0 |
значение выражения (тип и адрес или значение) |
dec (описания) |
0 |
|
класс |
индекс |
атрибут | ||
type (тип) |
0 |
int | ||
1 |
double | |||
... |
пользовательские типы | |||
idv (переменная, не вектор) |
... |
индекс типа | ||
ivc (вектор) |
... |
индекс типа | ||
con (константа) |
... |
индекс типа и значение | ||
lab |
... |
идентификатор |
адрес помеченной триады (0, если метка ещё не объявлена) |
список триад перехода, требующих уточнения |
Тип хранится в следующем виде:
поле |
тип поля |
комментарий |
размерность массива |
целое |
= 0, если это не массив |
границы массива |
массив из 16 целых |
игнорируется, если это не массив |
тип элементов |
целое |
0 int, 1double,2 limited, 3vector |
диапазон |
два целых |
игнорируется, если не limited |
размерность вектора |
целое |
если это не вектор, поле игнорируется |
спец. |
целое |
1const, 2 typedef |
Например, следующему объявлению:
vector[3] basis[3];
соответствует тип {0, 1, {3, 0, …, 0}, 2, 3}.