Книга: Давайте создадим компилятор!
Распределение памяти
Распределение памяти
В других программах, подобных этой, включая сам компилятор TINY, мы уже обращались к вопросу объявления глобальных переменных и кода, генерируемого для них. Давайте создадим здесь урезанную версию «компилятора», чья единственная функция – позволить нам объявлять переменные. Помните, синтаксис для объявления:
<data decl> ::= VAR <identifier>
Снова, мы можем вытащить массу кода из предыдущих программ. Следующий код – это урезанные версии тех процедур. Они значительно упрощены, так как я удалил такие тонкости как списки переменных и инициализаторы. Обратите внимание, что в процедуре Alloc новый вызов AddEntry будет также заботиться о проверке двойных объявлений:
{–}
{ Allocate Storage for a Variable }
procedure Alloc(N: char);
begin
AddEntry(N, 'v');
WriteLn(N, ':', TAB, 'DC 0');
end;
{–}
{ Parse and Translate a Data Declaration }
procedure Decl;
var Name: char;
begin
Match('v');
Alloc(GetName);
end;
{–}
{ Parse and Translate Global Declarations }
procedure TopDecls;
begin
while Look <> '.' do begin
case Look of
'v': Decl;
else Abort('Unrecognized Keyword ' + Look);
end;
Fin;
end;
end;
{–}
Теперь, в основной программе добавьте вызов TopDecl и запустите программу. Попробуйте распределить несколько переменных и обратите внимание на полученный сгенерированный код. Для вас это пройденный этап, поэтому результат должен выглядеть знакомым. Заметьте из кода для TopDecls что программа завершается точкой.
Пока вы здесь, попробуйте объявить две переменные с одинаковыми именами и проверьте что синтаксический анализатор отлавливает ошибку.
- Введение
- Что будет дальше?
- Таблица идентификаторов
- Добавление записей
- Распределение памяти
- Объявление типов
- Присваивания
- Трусливый выход
- Более приемлемое решение
- Литеральные аргументы
- Аддитивные выражения
- Почему так много процедур?
- Мультипликативные выражения
- Умножение
- Деление
- Завершение
- Приводить или не приводить
- Заключение
- Динамическое распределение памяти
- 7. Распределение ресурсов, управление электропитанием и мониторинг состояния системы
- Простое выделение памяти
- Распределение программ по главам
- РАСПРЕДЕЛЕНИЕ ПАМЯТИ: malloc( ) И са11ос( )
- Листинг 8.3. Тестовый пример, демонстрирующий неэкономное распределение памяти (типичный первоначальный вариант реализац...
- Листинг 8.3. Тестовый пример, демонстрирующий неэкономное распределение памяти (типичный первоначальный вариант реализац...
- 1.5.3 Распределение памяти
- 8.3.2. Динамическое распределение памяти
- Classic vs SuperServer
- Листинг 8.2. Общий код, используемый во всех приведенных ниже вариантах тестов