емінно як що містить дані то одного, то іншого типу. p> Поєднання даних може статися при використанні записів з варіантами, типізованих покажчиків, що містять однакову адресу, а також при явному розміщенні даних різного типу в одній області пам'яті (використовується Absolute - за ним поміщається або абсолютний адресу, або ідентифікатор раніше певної змінної). p> Абсолютний адреса - пара чисел, розділених двокрапкою - перше - сегмент, друге - зсув. p> Приклад:
B: Byte Absolute $ 0000: $ 0055;
W: Longint Absolute 128:0;
Якщо за Absolute вказано ідентифікатор змінної, то відбувається поєднання в пам'яті даних різного типу, причому перші байти внутрішнього представлення даних будуть розташовуватися по одному і тому ж абсолютному адресою:
Var
X: Real;
Y: Array [1 .. 3] Of Integer Absolute X;
Еквівалентність типів
Щодо поняття еквівалентності типів існує кілька точок зору. Розглянемо три з них. Всі вони виходять з того, що еквівалентні типи повинні допускати однакові послідовності операцій.
Структурна еквівалентність
Два атрибуту типу T1 і T2 називаються (структурно) еквівалентними, якщо
• їх базові типи BT1 і BT2, відповідно, збігаються або
• BT1 = arr (M, N, T1 '), BT2 = arr (M, N, T2') і T1 'еквівалентний T2', або
• BT1 = rec ([F1: T11, ..., Fn: T1n]), BT2 = rec ([F1: T21, ..., Fn: T2n]) і T1i еквівалентний T2i для кожного i, або
• BT1 = ref (T1 '), BT2 = ref (T2') і T1 'еквівалентний T2' і
• припущення про еквівалентність T1 і T2 який суперечить умовам 1-4. p> Кілька дивна умова 5 пов'язане з рекурсивного типів. Воно робить ставлення структурної еквівалентності найбільшим серед відносин, що задовольняють умовами 1-4.
П р и м і р:
Нехай
T1 = rec ([info: int, next: T1])
T2 = rec ([info: int, next: T2])
Застосовуючи тільки правила 1-4, отримаємо, що T1 і T2 еквівалентні, якщо T1 і T2 еквівалентні. Правило 5 змушує зробити висновок, що T1 і T2 дійсно еквівалентні (на підставі тільки правил 1-4 можна зробити і зворотний висновок).
Якщо б не було посилальних і, отже, рекурсивних типів (як у Фортрані або Алголі 60), то визначення структурної еквівалентності зводилося б до умови 1, тобто до рівності базових типів.
При допущенні ж рекурсивних посилальних типів для перевірки структурної еквівалентності двох типів використовується алгоритм знаходження всіх пар еквівалентних станів деякого кінцевого автомата. Можна використовувати наступний метод побудови цього автомата.
Спочатку будується праволінейная граматика:
1. Для кожного опису ідентифікатора типу, змінної або параметра declared (I, B, Inf), де Inf одно type (T), var (T) або par (T), типу T ставиться в відповідність новий нетермінал t. p> 2. Якщо нетерміналу t відповідає базовий тип arr (m, n, T1), то типу T1 ставиться в відпов...