Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
72
Добавлен:
27.03.2016
Размер:
3.38 Mб
Скачать

Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»

Модуль містить реалізацію алгоритму «зсув -згортка» і описи всіх структур даних, необхідних для цієї реалізації. Оскільки сам алгоритм «зсув –згортка» не залежить від вхідної мови, реалізуючий його модуль також не залежить від вхідної мови і правил початкової граматики (вони спеціально винесені в окремий модуль). Основу модуля складають наступні структури даних:

  • TSynblnfo — опис двох типів символів граматики: термінальних і нетермінальних;

  • TSіnbol — опис всіх даних, пов'язаних з поняттям «Символ граматики»;

  • TSSteck - опис синтаксичного стека.

Структура ТSynblnfo містить інформацію про тип символу граматики — поле SynbType, яке може приймати два значення: SYМB_LEX (термінальний символ) або SYМB_SYNT (нетермінальний символ), і додаткові дані:

  • посилання на лексему (LexOne) -для термінального символу:

  • перелік всіх складових (LexLіst) - для нетермінального символу.

Перелік всіх складових нетермінального символу LexLіst побудований на основі динамічного масиву (тип TList з бібліотеки VCL системи програмування Delphi 5). До нього вносяться посилання на символи, на підставі яких створений даний символ, в тому порядку, в якому вони слідують в правилі граматики.

Структура TSіnbol містить інформацію про символ (поле Synbіnfo типу TSynblnfo), а також номер правила граматики, на підставі якого створений символ (поле даних IRuleNum). Для термінальних символів номер правила рівний 0, для нетермінальних символів він може бути від 1 до 13.

Окрім цих даних структура містить методи, необхідні для роботи з символами граматики:

  • конструктор Createlex для створення термінального символу на основі лексеми;

  • конструктор CreateSymb для створення нетермінального символу на основі правила граматики і масиву початкових символів;

  • деструкцію Destroy для звільнення зайнятої пам'яті при видаленні символу (при видаленні нетермінального символу віддаляються всі посилання на його складові і динамічний масив для їх зберігання):

  • функції, процедури і властивості для роботи з інформацією, які зберігаються в структурі даних.

Оскільки в полі даних Synblnfo структури TSymbol зберігаються всі посилання на складові символи, всередині яких, у свою чергу, можуть зберігатися посилання на їх складові і т. д., то на основі структури TSymbol можна побудувати повне синтаксичне дерево розбору.

Третя структура даних TSymbSteck побудована на основі динамічного масиву типу TLіst з бібліотеки VCL системи програмування Delphi 5. Вона призначена для того, щоб моделювати синтаксичний стек МП- автомата. У цій структурі немає ніяких даних (використовуються тільки дані, успадковані від класу TLіst). але з нею пов'язані методи, необхідні для роботи синтаксичного стеку:

  • функція очищення стека (Clear) і деструкція для звільнення пам'яті при видаленні стека (Destroy);

  • функція доступу до символів в стеку починаючи від вершини (GetSymbol);

  • функція для приміщення в стек чергової вхідної лексеми (Push), при цьому лексема перетвориться в термінальний символ;

  • функція, що повертає саму верхню лексему в стеку (TopLexem), при цьому нетермінальні символи ігноруються;

  • функція, що виконує згортку (MakeTopSymb), одержану в результаті згортки, розміщується на вершину стека.

Крім трьох перерахованих раніше структур даних в модулі SyntSynb описана також функція BuildSyntList, що моделює роботу алгоритму «зсув-згортка» для граматик операторного передування. Вхідними даними для функції є список лексем (listLex), який повинен бути заповнений в результаті лексичного аналізу, і синтаксичний стек (synbStecfc), який на початку виконання функції повинен бути порожній. Результатом функції є:

  • нетермінальний символ (що посилається на корінь синтаксичного дерева), якщо розбір був виконаний успішно;

  • термінальний символ, що посилається на лексему, де була виявлена помилка, якщо розбір виконаний з помилками.

Функція BuildSyntList моделює алгоритм «зсув-згортка» для граматик операторного передування так, як він був описаний в розділі «Короткі теоретичні відомості».