Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СПО [укр. язык].DOC
Скачиваний:
30
Добавлен:
02.05.2014
Размер:
526.85 Кб
Скачать

Таблиця типів.

Для побудови таблиці типів також існує два підходи:

  1. Зв’язане уявлення;

  2. Послідовне уявлення.

Зв’язане:

Якщо ми описуємо деякий новий тип , то будується додатковий запис. Прості та наперед указані типи в таблицю не заносяться, а надаються початкові номери. Структура дескриптора для розроблених типів може бути різною.

Послідовне:

Ведеться три стеки :

  • стек визначних записів;

  • стек “імен” ідентифікаторів;

  • стек дескрипторів;

Таблиця типів, враховуючи блоки та процедури.

Аналогічно таблиці ідентифікаторів (див. вище) :

  1. Будується для кожного рівня своя таблиця типів;

  2. Будується одна таблиця типів, з вказівником на рівень вложеності.

Лекція №3. Тема 3 : Синтаксичний аналіз.

При розробці синтаксичного аналізатора використовують методи:

  • недетермінований розбір;

  • детермінований розбір;

  • рекурсивний спуск.

Контексно - вільні граматики традиційно є основою для синтаксичного аналізу компіляції. Коли будь-якою мовою програмування не можна згенерувати супермножину мови, тобто мову , що містить в собі дану мову програмування. Пристосування цієї граматики для синтаксичного аналізу означає , що ланцюг обмежень в реальній мові не буде перевірятися аналізатором. Клас контекстно-вільних граматик, більш потужний ніж клас регулярних граматик, але менш потужний, ніж клас контекстно-залежних граматик. Контекстно-вільні граматики мають ланцюг характеристик, для яких справедливі наступні положення:

  1. Канонічна форма (кожна контекстно-вільна граматика еквівалентна граматиці в нормальній формі Хомського та Грейбаха);

  2. Самовложення (якщо в граматиці є нетермінал , для якого , деє непусті рядки терміналів та/ чи нетерміналів).

Теоретично будь-яка контекстно-вільна граматика, що не містить самовложення , еквівалентна регулярній граматиці, тобто генерує регулярну мову. Якщо граматика регулярна, то можливий тільки детермінований розбір. Якщо граматика нерегулярна , то можна застосовувати і недетермінований розбір. Метод розбору являється детермінованим, якщо для розбору даної граматики не потрібно робити повернення.

Метод рекурсивного спуску.

Цей метод детермінованого розбору зверху вниз, який легко реалізується, добре відомий. За його допомогою на основі відповідної граматики можна написати синтаксичний аналізатор, до того ж майже так же швидко, як ми можемо взагалі писати. Розглянемо, наприклад, мову, яка генерується граматикою з наступними породжуючими правилами:

Спочатку поміняємо вигляд граматики:

Тепер напишемо процедури для розпізнавання кожного нетерміналу. Розпочнемо з символу (PROGRAM) , одержимо:

Procedure PROGRAM;

Begin

If symbol<>begin then error;

symbol:=lexical;

DECLIST;

If symbol<>comma then error;

symbol:=lexical;

STATELIST;

If symbol<> end then error;

End;

Procedure DECLIST;

Begin

If symbol<>d then eror;

symbol:=lexical;

X;

End;

Procedure X;

Begin

If symbol=semi then

Begin

symbol:=lexical;

DECLIST;

End

Else If symbol=comma then skip

Else error;

End;

Procedure STATELIST;

Begin

If symbol<>s then error;

symbol:=lexical;

Y;

End;

Procedure Y;

Begin

If symbol=semi then

Begin

symbol:=lexical;

STATELIST;

End

Else If symbol=end then skip

Else error;

End;

В цих процедурах зроблено ланцюг допущень:

  1. error – процедура звертання з синтаксичними помилками;

  2. lexical – процедура, яка читає літери вихідного тексту та повертає наступний символ. Якщо лексичний аналіз виконується попереднім проходом, lexical читає наступний символ;

  3. semi, comma і т.д. – ідентифікатори, значенням яких є відповідні термінали під час компіляції;

  4. перед викликом PROGRAM відбувається наступні присвоювання:

symbol:=lexical.

Для розбору речення мови може знадобитися багато рекурсивних викликів, відповідних нетерміналів в граматиці. Якщо ми вирішимо представляти граматику декілька іншим методом, цю рекурсію можна замінити ітерацією:

де (x*) означає нуль або більше реалізацій x. Тоді процедури для DECLIST та STATELIST стають такими:

Procedure DECLIST;

Begin

If symbol<>d then error;

symbol:=lexical;

while symbol=semi do

begin

symbol:=lexical;

if symbol<>d then error;

symbol:=lexical;

end;

End;

Procedure STATELIST;

Begin

If symbol<>s then error;

symbol:=lexical;

while symbol=semi do

begin

symbol:=lexical;

if symbol<>s then error;

symbol:=lexical;

end;

End;

Заміна рекурсії ітерацією, можливо, робить аналізатор більш зручним при перегляді.

Переваги написання рекурсивного аналізатора очевидні. Основні із них це швидкість написання аналізатора на основі відповідної граматики. Інша перевага міститься в відповідності між граматикою та аналізатором, дякуючи якому збільшується ймовірність того, що аналізатор буде правильним, або, того, що помилки будуть носити простий характер. Недоліки цього методу, хоч менш очевидно, не менш реальні. Із-за великої кількості викликів процедур під час синтаксичного аналізатора аналізатор робиться відносно повільним, крім того , він може бути великим за розміром в порівнянні з аналізаторами, які грунтуються на табличних методах розбору. Не дивлячись на те що даний метод сприяє включенню в аналізатор дій по генерації коду, це неминуче призводить до змішування різних фаз компіляції, а це знижує надійність компіляторів або ускладнює звертання до нього та немов би збільшує залежність компілятора від машини. Тому цей метод не використовується для побудови трансляторів, а використовують в програмах, де потрібно визначати синтаксис якоїсь команди.

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете Системное программное обеспечение