Почти все части компилятора имеют дело с типами данных
так или иначе. Символы заботятся о типах данных больше всего, это - то, на
чем основывается большинство проверок типа во время компиляции. У узлов AST
также есть типы данных, которые заботятся о выражениях (включая
преобразования\конвертацию).
Тип данных представлен как комбинация:
- dtype Integer
- 5 бит: raw тип:
- void (неизвестный тип, например: any ptr, type t as t)
- byte, ubyte
- char (zstring указатели и их DEREF выражения)
- short, ushort
- wchar (wstring указатели и их DEREF выражения)
- integer, uinteger
- enum (integer)
- bitfield (uinteger)
- long, ulong
- longint, ulongint
- single, double
- string (переменной длины)
- fixstr (Строки фиксированной длины, string*N, N является длиной
данного типа)
- struct (UDT, -> подтип используемый)
- namespace (использование во время искажение имени?)
- function (используется для указателей на функции, -> подтип
содержит полную декларацию функции)
- Опережающая ссылка (будет изменен фактически на raw
тип, когда известен, -> подтип используемый)
- pointer (это значение используется только временно, как в
результате макроса typeGet ())
- xmmword (Используемый SSE излучатель)
- 4 бит: PTR подсчет
Сколько PTR там на тип, максимально 8. Если > 0, то тип данных -
указатель.
- 9 бит: CONST маска (8 PTR's + 1 "base")
Пример CONST маска
const integer 000000001 (первый CONST бит установлен)
integer const ptr 000000001 (то же самое)
const integer ptr 000000010 (указатель на const)
const integer ptr const ptr 000000101 (const указатель на указатель на const)
-
подтип, который для некоторых типов указывает на символ:
- Для типов UDT (структуры/классы, перечисления) это указывает на
соответствующий символ UDT
- Для будущих ссылок на определения типов это указывает на специальный символ
будущих ссылок, который будет в конечном счете заменен фактическим символом
подтипа, когда он будет известен.
- Для указателей процедуры это указывает на анонимный символ, далее
определяющий соглашение о вызовах и т.д. и самое главное типы результата и
параметров.
- length integer
Это используется в местах для расчета размеров (например, расчеты
размера структуры, арифметические операции над указателями, смещения
стека).