
- •4.Основні частини компілятора.
- •5Лексичний аналіз роботи з таблицями
- •6. Синтаксичний та семантичний аналіз, дерева
- •7. Польський запис, тетради.
- •8. Формальне визначення мови, операції над мовами.
- •9. Граматики
- •11.Регулярний вираз
- •12) Нормальна форма Бекуса-Наура
- •13. Ієрархія Хомського
- •14. Регулярні граматики.
- •15. Скінченні автомати
- •16. Детерміновані і недетерміновані кінцеві автомати.
- •18. Побудова детермінованих кінцевих автоматів за недетермінованими кінцевими автоматами.
- •19. Програмування сканера.
- •20. Таблиці символів, хеш-функції, хеш-адресація
- •21. Колізія, ре хешування
- •23.Контекстно-выльны граматики.
- •24. Синтаксично-керований переклад
- •25. Переклад інфіксної форми запису у польську
- •26. Алгоритм синтаксично-керованого перекладу:
- •27. Автомати з магазинною пам’яттю
- •28. Операторні граматики
- •29.Алгоритм розборуоператорних грамматик.
- •37. Оптимізація булевих виразів, циклів.
- •38. Генерація коду. Скп на мову Асамблер.
- •39. Інтерпретатори, адресація, представлення ідентифікаторів.
- •40 Компілятор компіляторів.
- •41 Генератор лексичних аналізаторів.(lex)
- •42. Генератор синтаксичних аналізаторів.
- •43. Приклади застосування генераторыв.
21. Колізія, ре хешування
Ситуація, коли хеш-адреса для 2 імен різні коди, то все нормально, але якщо ні, то така ситуація називається- колізією. «Добра хеш-функція» - функція, яка розподіляє адреси імен по табл.. відносно рівномірно і колізії виникають не надто часто.
Нехай хешується ім’я S результаті хешування виникла колізія. Позначимо через h значення хеш-функції. Один із способів- знайти нову адресу за наступною схемою h1=( h+р)modN. Знаходження(повторне) нової адреси – ре хешування, це продовжуватиметься доти, поки не зустрінеться елемент hі=( h+рі)modN, який або порожній, або містить це ім’я S або є знову адресою h. Якщо hі= h, то вважається, що таблиця-повна. Способи ре хешування полягають у виборі послідовності р1,р2,…,р n. Розглянемо найрозповсюдженіші способи вибору цих чисел. Введемо параметр lf –коефіцієнт завантаження таблиці lf=n/N
Лінійне ре хешування:Рі=і. :Середнє число порівнянь при коефіцієнті lf на даний момент часу: Е=1- lf/2/1- lf. При lf=0.1 Е=1,006; при lf=0.5 Е=1,5: при lf=0.9 Е=5,5.
Випадкове ре хешування: Припустимо таблиця має розмір N=2к. Обчислення Рі проводимо за наступною схемою: а)R=1; б) Обчислюємо Рі: 1) R= R+5; 2)Виділяємо з R-молодші К+2 розряди, поміщаємо їх в R. R←(К+2) R ;3)Рі= R>>1 – R зсунуто вправо на 1 розряд. в) перейти до пункту 2 і знаходимо наступне Рі.
Середнє число порівнянь : Е=-1/ lf* log2(1- lf ).
Ре хешування додаванням: Рі=і(h+1), де h=початковий хеш-індекс, коли N-просте число.
Імя представляє собою множину символів.
22. Хеш-функціі і хеш-адресація
Логарифмічна залежність часу пошуку та часу заповнення таблиці ідентифікаторів - це найкращий результат, якого можна досягти за рахунок застосування різних методів організації таблиць. Однак у реальних вихідних програмах кількість ідентифікаторів настільки велике, що навіть логарифмічну залежність часу пошуку від їх числа не можна визнати задовільною. Необхідні більш ефективні методи пошуку інформації в таблиці ідентифікаторів. Кращих результатів можна досягти, якщо застосувати методи, пов'язані з використанням хеш-функцій і хеш-адресації. Хеш-функцією F називається деякий відображення множини вхідних елементів R на безліч цілих невід'ємних чисел Z: F(r) = n, rÎR, nÎZ.. Сам термін «хеш-функція» походить від англійського терміна «hash function» (hash - «заважати», «змішувати», «плутати»). Замість терміна «Хешування» іноді використовуються терміни «рандомізація», «переупорядочіваніе». Безліч допустимих вхідних елементів R називається областю визначення хеш-функції. Безліччю значень хеш-функції F називається підмножина M з безлічі цілих невід'ємних чисел Z: MÍZ,, що містить всі можливі значення, що повертаються функцією F: "rÎR: F(r)ÎM и "mÎM: $rÎR: F(r)=m. Процес відображення області визначення хеш-функції на безліч значень називається «хешування». При роботі з таблицею ідентифікаторів хеш-функція повинна виконувати відображення імен ідентифікаторів на безліч цілих невід'ємних чисел. Областю визначення хеш-функції буде безліч всіх можливих імен ідентифікаторів. Хеш-адресація полягає у використанні значення, що повертається хеш-функцією, як адресу комірки з деякого масиву даних. Тоді розмір масиву даних повинен відповідати області значень використовується хеш-функції. Отже, в реальному компіляторі область значень хеш-функції ніяк не повинна перевищувати розмір доступного адресного простору комп'ютера. Метод організації таблиць ідентифікаторів, заснований на використанні хеш-адресації, полягає в розміщенні кожного елементу таблиці в клітинці, адресу якої повертає хеш-функція, обчислена для цього елемента. Тоді в ідеальному випадку для розміщення будь-якого елементу в таблиці ідентифікаторів достатньо тільки обчислити його хеш-функцію і звернутися до потрібної комірці масиву даних. Для пошуку елемента в таблиці необхідно обчислити хеш-функцію для шуканого елемента і перевірити, чи не є задана нею осередок масиву порожній (якщо вона не порожня - елемент знайдений, якщо порожня - не знайдено). Спочатку таблиця ідентифікаторів повинна бути заповнена інформацією, яка дозволила б говорити про те, що всі її осередки є порожніми. Цей метод досить ефективний оскільки як час розміщення елементу в таблиці, так і час його пошуку визначаються тільки часу, що витрачається на обчислення хеш-функції, яке в загальному випадку незрівнянно менше часу, необхідного на багаторазові порівняння елементів таблиці. Метод має два очевидних недоліку. Перший з них - неефективне використання обсягу пам'яті під таблицю ідентифікаторів: розмір масиву для її зберігання повинен відповідати області значень хеш-функції, в той час як реально зберігаються в таблиці ідентифікаторів може бути істотно менше. Другий недолік - необхідність відповідного розумного вибору хеш-функції. Цьому істотного питання присвячені наступні два підпункти.
Реалізація
Struct name{
Char * srting;
Name * next;
Boudle value;}
Const TBLSIZE=26;
Name * table [TBLSIZE];
Name * findname (char * str, int ins);
// ф-я пошуку таблиці
{int hi=0;
Char * pp=str;
While(*pp){
Hi<<1;
Hi^=*pp++;}
If(hi<0) hi=-hi;
Hi %= TBLSIZE;
/*for (stremp(str,n->string)==0) return n; */
For(name *n = table[hi];n;n=n->next)
If(strcmp(str,n->string))==0
Return n;
If (ins==0) return null;
Name 8 nn=new name;
nn->string=new char[strlen(str)+1];
strcpy(nn->string, str);
nn->value=0;
nn->next=table[hi]
table[hi]=nn;
return nn;}
Ця ф-я здійснює пошук імен name, якщо ins≠0, то здійснює додавання в таблицю(імен) списків. Якщо =0 то повертає .Таблиця являє масив списків, кеш-шндексів – номер списку масиву