ОПК:перша контрольна
Матеріал з USIC Wiki
Перша контрольна з цієї дисципліни відбудеться у п"ятницю, 22 лютого о 8.30, аудиторія 1-225
Зміст |
Завдання1
Дана блочна структура програми. За нею побудувати таблицю імен та адресні бази (як це робить компілятор, аналізуючи код програми)
- блок - структура, яка починається на begin, закінчується на end, в собі містить оголошення типу: int a,b; float A[],...
- Блоки можуть йти паралельно, а також містити в собі інший блок.
Статична пам'ять:
- номер блоку (НБ) (як пронумеровали кожен блок)
- номер блоку (КБ), що охоплює даний
- кількість змінних цього блоку + мітка Li (КЗм)
- стек - при проходженні коду програми, вниз автоматично потраляють змінні та мітка, блок яких потрапив першим в область видимості. Як тільки блок закриється - все це добро піднімається вверх(на ту позицію, що ще незайнята). Отже найнижче знаходяться змінні, які пропадають з області видимості найпізніше. найвище ті, що закриті раніше.
- адресна база - навпроти елементів стеку написати АБ та номер блоку, що містить їх.
- Пронумеровати блоки, краще це робити згори донизу, йдучи по вкладеним - по ходу виконання програми. (НБ)
- Таким самим чином розставляємо мітки, зручніше їх ставити біля оголошення змінних.
- Для кожного блоку вкажемо номер його батьківського блоку КБ
- заповнюємо стек:
- першим покладемо донизу блок [a1, b1, c1, L1] -він там і залишиться до кінця, оскільки закривається останнім
- другим піде блок [a2, b2, c2, L2]
- третім знизу впаде [s3, L3], але його зразу піднімаємо до самої гори, оскільки це перший блок що закривається
- другий піднімаємо догори, оскільки був закритий після блоку три
- третім зверху буде [s4, L4], оскільки він закривається другим по рахунку
- четвертим зверху стане [a5, b5, L5]
- блоку [x1, y1, L6] нема куди подітись окрім як бути другим знизу
- четвертим зверху стане [a5, b5, L5]
- третім зверху буде [s4, L4], оскільки він закривається другим по рахунку
- другим піде блок [a2, b2, c2, L2]
- першим покладемо донизу блок [a1, b1, c1, L1] -він там і залишиться до кінця, оскільки закривається останнім
Маємо:
Побудувати таблицю імен та накласти на неї рамки відповідно до блочної структури.
Встановити активний дисплей та область видимості для точки з міткою L1231.
Побудувати для цієї точки конфігурацію розподілення пам"яті під час виконання програми.
Завдання2
Дано завдання, наприклад: "стрічка починається з нуля та містить парну кількість нулів".
- Побудувати Діаграму переходів
- Побудувати Матрицю переходів
Поради до виконання завдання:
1.написати кілька "крайніх" тестових стрічок, які б задовольняли умові задічі
2.для себе скласти уявний шаблон цих стрічок
3.Завжди вхідним для кожної із стрічок буде "0", але він обрізається тому про нього можна забути
4.Петлі виду
- можуть йти по "0" та по "1", означають що скількись разів виконується вставляння "0" або "1", може не виконатись жодного разу
5.Переходи виду
- перехід із стану у стан.Виконуються завжди обов"язково і по тому символу, який написаний.
6.Заключний стан - на схемі обведений колом - цикл після якоїсь ітерації закінчується саме на ньому. Значить символ, по якому перейшли в цей заключний стан буде останнім у ланцюжку.
Приклад. Побудувати автомат, який пропускає рядки з непарною кількістю нулів.
Спочатку побудуємо діаграму переходів.
Можна побачити, що автомат пропускає всі одиниці, поки не натрапить на нуль. Потім він переходить у стан q1, у якому одиниці так само пропускаються, а в разі, якщо трапився нуль, автомат переходить у стан q2. У цьому стані пропускаються одиниці, а за нулем переходимо назад у q1. Цей стан q1 є заключним, тобто якщо ми дійшли до кінця рядка, і ми в цьому стані, то наш рядок правильний для цього автомату.
Побудуємо матрицю переходів.
| 0 | 1 | ||
|---|---|---|---|
| q0 | q1 | q0 | |
| q1 | q2 | q1 | |
| q2 | q1 | q2 |
Завдання3
Дана граматика, наприклад: (ba)nbmam
- Вказати тип граматики (самовставляння, квазіавтомат)
- Написати правила граматики (аксіомами описати граматику)
- Вказати, чи однозначна/неоднозначна, приведена/неприведена (приведена тоді, коли перехід в епсілон є тільки в одній аксіомі - S
AB|
, а також коли вона є однозначною. Граматика є однозначною тоді, коли в кожного ланцюжка є лише один вивід)
- Побудувати дерево синтаксичного розбору
Приклад:
Дана граматика: an+1(bc)2n(abc)m
1) Спростимо граматику: an+1(bc)2n(abc)m = aan(bc)2n(abc)m
- бачимо, що фрагмент an(bc)2n - з узгодженим степенем n тобто граматика самовставляння, при кожній ітерації буде записуватись A
aAbcbc . Тобто всі ланцюжки виду: abcbc, n=1; aaabcbcbcbcbcbc; n=3
- фрагмент a при будь-якій ітерації лишиться,тому при написанні аксіоми ми його просто лишимо S
- фрагмент (abc)m C
abcC, тобто усі ланцюжки виду abc, m=1; abcabcabcabcabc, m=5
- Тепер можна виписати правила граматики:
S
aAC
A
aAbcbc|
C
abcC|
S - виділений початковий символ граматики (при написанні правил граматики з цього символу починається виведення)
A - великими латинськими літерами позначають нетермінальні символи (з яких виводяться терми - малі латинські)
a - термінальний символ (терм)
- символ, яким закінчується вивід граматики
Додаткові матеріали
- Класифікація граматик за Хомським
- Нормальна форма Хомського
Нормальна форма Хомського (НФХ - бінарна нормальна форма) встановлюється для приведеної контекстно-вільної (КС) граматики, всі правила якої мають вигляд:
- 1. A->BC, де A,B,C належать N (множині нетермінальних символів)
- 2. A-> a, де a належить Σ
- 3. S ->
, якщо
L(G)
Твердження 1. нехай L(G) – КС-мова. Тоді L(G) = L(G’) для деякої КС-граматики G’ в нормальній формі Хомського.
- Для виконання перетворень необхідно спочатку отримати приведену форму, застосовуючи розглянуті алгоритми ([1]), а потім отримати НФХ. Отримати НФХ розглянемо на прикладі.
Нехай G – приведена КС-граматика з правилами:
S -> aAB | BA
A -> BBB | a
B -> AS | b
Введемо додаткові символи, що замінять ланцюжки AB, BB, a:
C -> AB,
D -> BB,
F -> a
Отримаємо G’ – грамматику в НФХ и L(G) = L(G’):
S -> FC | BA
A -> BD | a
B -> AS | b
C -> AB
D -> BB
F -> a
- Нормальна форма Грейбах
- Нормальна форма Грейбах (НФГ). КС-граматика (контекстно-вільна) G = (Ν,Σ,Ρ,S) перебуває в НФГ, якщо вона приведена і кожне равило із Р, відмінне від S ->
, має вигляд A -> aα, де
та
. При додаткових обмеженнях накладених на мову і правила, за такою граматикою будуються прості та ефективні СА, оскільки майже завжди можна одразу встановити, скільки символів треба читати із вхідного потоку, щоби однозначно обрати правила в процесі виводу. Побудова граматики в НФГ має за основу позбуття лівої рекурсії в правилах.
- Право/ліворекурсивна граматика
Нетермінал Α контекстно-вільної (КС) граматики G = (Ν,Σ,Ρ,S) називається ліворекурсивним, якщо
для деякого
та праворекурсивним, якщо
для деякого
.
- Граматика, що має хоч один ліворекурсивний нетермінал є ліворекурсивною граматикою,а та що має хоч один праворекурсивний нетермінал - є праворекурсивною граматикою. Граматика є рекурсивною, якщо вона ліво- або праворекурсивна.
http://en.wikipedia.org/wiki/Help:Formula


