Пример содержания внутренних структур, сформированных компилирующей частью системы
Текст исходной программы (внешние данные)
program main;
var a,b;
procedure c(var d;e);
var a;
begin
end; {c}
procedure d(var e;f);
var b;
begin
c(b,f);
end; {d}
procedure g(h,var i);
var c;
procedure j(var k);
begin
end; {j}
begin
j(c);
d(h,c);
end; {g}
begin
d(a,b);
g(a,b);
end. {main}
Таблица имен блоков (внутренние данные)
Имя блока |
Ссылка на таблицу имен |
Ссылка на исполняемый код |
main |
1¸5 |
1¸3 |
c |
6¸8 |
4¸4 |
d |
9¸11 |
5¸6 |
g |
12¸15 |
7¸9 |
j |
16¸16 |
10¸10 |
Таблицы имен (внутренние данные)
имя |
тип |
|
1 |
a |
var |
2 |
b |
var |
3 |
c |
proc |
4 |
d |
proc |
5 |
g |
proc |
6 |
d |
paramv |
7 |
e |
param |
8 |
a |
var |
9 |
e |
paramv |
10 |
f |
param |
11 |
b |
var |
12 |
h |
param |
13 |
i |
paramv |
14 |
c |
var |
15 |
j |
proc |
16 |
k |
paramv |
Исполняемый код (внутренние данные)
1 |
d(a,b) |
2 |
g(a,b) |
3 |
stop |
4 |
return |
5 |
c(b,f) |
6 |
return |
7 |
j(c) |
8 |
d(h,c) |
9 |
return |
10 |
return |
Внешние выходные структуры компилирующей части системы – это таблицы символических имен для каждого блока программы. Они могут формироваться одновременно с вышеописанными внутренними структурами. В случае динамического формирования области видимости имен эти таблицы – просто фрагменты, из которых сформирована внутренняя таблица локальных имен. В случае статического формирования области видимости неоценимую помощь в построении таких таблиц окажет так называемый стек времени компиляции. Запись такого стека – это символическое имя со своими атрибутами. В процессе просмотра исходной программы при обнаружении начала описания блока (в нашем примере это – procedure или program) компилятор заносит в стек все локальные имена этого блока, а при обнаружении конца описания блока (в нашем примере это - end) компилятор удаляет из стека все локальные имена этого блока. Таблица имен блока формируется в момент рассмотрения компилятором этого блока. В нее записываются по одному все имена, находящиеся в этот момент в стеке.
Примеры содержания стека времени компиляции
1) Рассмотрение блока c
Содержание стека Таблица имен блока c
a var |
c |
a |
var |
c |
c param |
c |
e |
param |
c |
d paramv |
c |
d |
paramv |
c |
b var |
main |
b |
var |
main |
a var |
main |
2) Рассмотрение блока d
Содержание стека Таблица имен блока d
b var |
d |
b |
var |
d |
f param |
d |
f |
param |
d |
e paramv |
d |
e |
paramv |
d |
c proc |
main |
c |
proc |
main |
b var |
main |
a |
var |
main |
a var |
main |
При моделировании процесса выполнения программы аналогично формированию стека времени компиляции формируется стек времени выполнения программы (еще одна внутренняя структура). Занесение данных в стек происходит при обнаружении оператора вызова блока, удаление – при обнаружении оператора возврата из блока (в нашем примере это - return). В условиях динамического формирования области видимости имен текущее содержание такого стека позволяет определить видимые в исполняемом блоке имена аналогично тому, как это определяется по стеку времени компиляции в условиях статического формирования области видимости.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.