Книга: Давайте создадим компилятор!
Таблица идентификаторов
Таблица идентификаторов
Существует одна проблема с компилятором в его текущем состоянии: он ничего не делает для сохранения переменной когда мы ее объявляем. Так что компилятор совершенно спокойно распределит память для нескольких переменных с тем же самым именем. Вы можете легко убедиться в этом набрав строку типа
pvavavabe.
Здесь мы объявили переменную A три раза. Как вы можете видеть, компилятор бодро принимает это и генерирует три идентичных метки. Не хорошо.
Позднее, когда мы начнем ссылаться на переменные, компилятор также будет позволять нам ссылаться на переменные, которые не существуют. Ассемблер отловит обе эти ошибки, но это совсем не кажется дружественным поведением – передавать такую ошибку ассемблеру. Компилятор должен отлавливать такие вещи на уровне исходного языка.
Так что даже притом, что нам не нужна таблица идентификаторов для записи типов данных, мы должны установить ее только для того, чтобы проверять эти два условия. Так как пока мы все еще ограничены односимвольными именами переменных таблица идентификаторов может быть тривиальной. Чтобы предусмотреть ее сначала добавьте следующее объявление в начало вашей программы:
var ST: array['A'..'Z'] of char;
и вставьте следующую функцию:
{–}
{ Look for Symbol in Table }
function InTable(n: char): Boolean;
begin
InTable := ST[n] <> ' ';
end;
{–}
Нам также необходимо инициализировать таблицу пробелами. Следующие строки в Init сделают эту работу:
var i: char;
begin
for i := 'A' to 'Z' do
ST[i] := ' ';
...
Наконец, вставьте следующие две строки в начало Alloc:
if InTable(N) then Abort('Duplicate Variable Name ' + N);
ST[N] := 'v';
Это должно все решить. Теперь компилятор будет отлавливать двойные объявления. Позднее мы также сможем использовать InTable при генерации ссылок на переменные.
- Таблица 1.1. Методы организации таблиц идентификаторов
- Таблица процессов
- Назначение таблиц идентификаторов
- Таблица 1.2. Варианты заданий
- Таблица лексем и содержащаяся в ней информация
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Безопасная работа с внешними таблицами
- Урок 5.6. Работа с таблицами
- Общее понятие об электронных таблицах
- Итоговые вычисления в таблицах
- Практическая работа 52. Итоговые вычисления в таблицах
- Режимы работы с таблицами