3 КОНТЕКСТОВІЛЬНІ МОВИ
3.1 Дерева розбору
Домовимося далі для позначення терміналів використовувати малі букви з початку алфавіту (такі, як a, b, c), символи, цифри, рядки, виділені жирним шрифтом (такі, як id, if). Нетермінали будемо позначати великими буквами з початку алфавіту (A, B, C), рядками, виділеними курсивом (stmt, expr). Великі букви з кінця алфавіту (X, Y, Z) будуть позначати граматичні символи, тобто або термінали, або нетермінали. Малі букви з кінця алфавіту (u, v, ... , z) – рядки терміналів. Малі грецькі букви (такі, як α, β, γ) будуть представляти рядки граматичних символів.
Візьмемо граматику для побудови виразів типової мови програмування. Обмежимося операторами “+”, “*”, а як аргументи візьмемо ідентифікатори, що починаються символами а або b, а далі йде ланцюжок з а,b,0,1.
Граматика може мати вигляд G=({E,I}, T, P, E), де
T={+, *, (, ), a, b, 0, 1}, а P – множина продукцій:
E → I , I → B,
E → E + E , I → Ia,
E → E * E, I → Ib,
E → (E), I → I0,
I → a, I → I1.
Надалі нетермінали будемо називати також змінними.
Для обмеження числа виборів у процесі породження будемо заміняти крайню ліворуч змінну тілом її продукції.
E E * E
I * E
a * E
a * (E)
a *(E + E)
a * (I + E)
a * (a
+ E)
a * (a + I)
a* (a + I0)
a
* (a + b0) .
Таке породження будемо називати лівим і
позначати через , від слова leftmost (зліва).
Аналогічно будуються праві породження, що
позначаються через , від слова rightmost (справа).
E E *
E
E *(E)
E *(E
+ E)
E * (E + I)
E * (E + I0)
E
*(E + b0)
E * (I + b0)
E *(a + b0)
a * (a + b0).
Будь-яке породження має еквівалентні ліве і праве породження.
Приклад виконання завдання.Є граматика з продукціями
S → if E then S else S | if E then S | other .
Показати, що ланцюжок
if E then if E then other elseother
має два лівих породження.
Перше породження має вигляд:
S if
E then S else
S
if
E then if E then S else
S
if
E then if E then otherelse S
if E then if E then otherelseother.
Друге породження має вигляд:
S if
E then S
if E then if E then
S else S
if
E then if E thenotherelse
S
if E then
if E thenotherelseother.
Наступним важливим поняттям є дерева розбору.
Будемо розглядати граматику
G= (V, T, P, S).
Дерева розбору для G – це дерева з такими властивостями.
1 Кожен внутрішній вузол позначений змінною з множини V.
2 Кожен лист позначений змінною або терміналом, або ε.
3 Якщо дочірні вузли вузла A позначені зліва направо X1, X2, … , Xk , то A → X1X2… Xk є продукцією в P.
Якщо подивитися на листи дерева розбору і виписати їх позначення зліва направо, одержимо ланцюжок, що називається кроною дерева і завжди є ланцюжком, виведеним зі змінної, яка позначає корінь.
Особливий інтерес становить дерево, корінь якого відмічений стартовим символом, а крона є термінальним ланцюжком.
Дерево розбору для попереднього прикладу зображене на рис. 3.1.
3.2 Неоднозначні граматики
Граматики можуть бути неоднозначними.
Повернемося до граматики виразів. Ланцюжок Е+Е* Е має два породження:
1)
Е Е + Е
Е + Е
* Е ;
2) Е Е * Е
Е +
Е * Е.
Їм відповідають два різних дерева виведення (рис. 3.2)
Рисунок
3.1-Приклад дерева розбору
Рисунок 3.2 - Дерева виведення для Е+Е* Е
Різниця полягає у способі групування виразів. Наприклад, 1, 2, 3 у першому випадку групуються як 1+(2*3)=7, у другому – як (1+2)*3=9.
Інший приклад.
Ланцюжок а+b може мати різні породження:
E E + E
I + E
a + E
a + I
a + b і
E E + E
E + I
I + I
I + b
a + b
.
Обидва породження приводять до одного дерева розбору.
Таким чином, неоднозначність походить не від наявності багатьох породжень, а від існування двох і більше дерев розбору.
Є дві причини неоднозначності:
- не враховується пріоритет операторів;
- не враховується асоціативність операторів.
Рішенням проблеми неоднозначності може бути введення декількох змінних з різними можливостями зв'язування. Для прикладу можна ввести такі змінні.
Співмножник (factor) F, який не може бути розірваний на частини за допомогою “*” і “+”, які примикають зліва або справа.
Доданок (term) T , який не може бути розірваний оператором “+”. Наприклад, a*b не може бути розірваний оператором “+”, але може бути розірваний оператором “*”: a1*a*b=(a1*a)*b.
Вираз (expression) E – будь-який вираз, включаючи ті, які можуть бути розірвані за допомогою “* ” і “ + ”.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.