B.4 База данных

Предыдущая  Содержание  Следующая V*D*V

Для файла описания класса мы сохраняем отдельные строки, чтобы можно было скопировать их в файл представления или интерфейса. Мы должны помнить строки, где и какие классы и метаклассы были определены. Последняя информация также требуется, чтобы сгенерировать подходящии инициализации. Поэтому мы создаём три массива: Pub[desc, n] содержит строки для интерфейсного файла, Prot[desc, n] содержит строки для файла представления, а в Dcl[desc, n] записываются только определения классов и метаклассов. Для каждого описания имя desc с индексом 0 хранит количество строк, а сами строки сохраняются с помощью индексов от 1 и выше. Dcl[desc, n] точно существует, если мы считали описание для desc. Строки хранятся неизменными, мы заменяем только полное определение класса строкой, начинающейся с % и содержащей имя метакласса, если таковой имеется, и затем имя класса.

Для класса наша база данных содержит имя его мета- и суперкласса, компоненты его представления и имена его методов. Мы используем в общей сложности шесть массивов: Meta[class] содержит имя метакласса, Super[class] содержит имя суперкласса, Struct[class, n] является списком индексов деклараций компонентов, а Static[class, n], Dynamic class, n] и Class[class, n] содержат списки имён различных методов. Снова, индекс 0 содержит длину списка, а элементы списка сохраняются с помощью индексов от 1 и выше. Class[class, 0] точно существует, если мы знаем, что у класса есть имя класса или метакласса.

Для метода мы должны помнить его имя, результат, список параметров, способ компоновки и тэг для метода respondsTo(). Эта информация представлена с помощью следующих шести массивов: Method[method] хранит первый индекс оператора объявления; он описывает имя метода и тип результата. Далее с увеличением индекса следуют другие операторы деклараций; Nparm[method] хранит количество параметров. Должен быть по меньшей мере параметр self. Var[method] хранит истину, если метод method разрешает переменное количество параметров, Linkage[method] хранит одно из значений %, %- или %+, и записи о том, в какой секции компоновки был объявлен метод. Owner[method] важен для статически компонуемых методов; он содержит класс, которому принадлежит метод, то есть параметр метода класса self. Наконец, Tag[method] записывает тэг метода по умолчанию для вызова respondsTo(), а Tag[method, class] содержит реальный тэг метода method для класса class.

Компоненты представления класса, имена методов и параметры описываются в виде индексов в список операторов деклараций. Список представлен четырьмя массивами: Name[index] является именем декларации, Const[index] содержит префикс const оператора объявления, если таковой имеется. As[index] хранит истину, если в операторе объявления использовался символ @, то есть если оператор декларации определяет ссылку на объект. В этом случае Type[index] либо имя класса, либо пуст, если объект находится в классе владельца метода. Если As[index] ложь, Type[index] является частью типа оператора декларации.

Наконец, если установлена глобальная переменная lines, база данных содержит ещё четыре массива: Filename[name] и Fnr[name] указывают, где были описаны класс или метод, SFilename[name] и SFnr[name] указывают, где компонент класса был объявлен. Это используется в report.awk, чтобы реализовать штампы #line.

 

Предыдущая  Содержание  Следующая