knu/csc/appl-math/c3s2/sys-prog

синтез і аналіз мовних процесорів

Синтаксичні аналізатори та алгоритми з ними

Граматика мови програмування визначається множиною БНФ-правил, що записані в текстовому файлі. Кожне провило обов’язково починається з першої позиції рядка. Для зручності правило можна продовжити в наступних рядках, але не з першої позиції. Нетермінал граматики — це ланцюжок літер, який починається з символу # та закінчується символом #, наприклад #програма#. Термінальні ланцюжки записуються традиційно, наприклад, begin. Альтернативи правила для зручності позначаються символом ! в першій позиції рядка, при цьому ліва частина правила опускається. Оскільки символи #, \ та ! є метасимволами при визначенні граматики, то для їх запису в термінальних ланцюжках використовується ще один метасимвол, а саме \. Правило граматики в текстовому файлі записується так:

#Pascal - програма#  program ( #список параметрів# ) #блок#

Лабораторний практикум другого семестру з дисципліни «Системне програмування» передбачає освоєння навиків створення власних програмних Java-проектів з використанням базового проекту, який повністю реалізований, та надається студенту у використання.

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

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

Пакет можна завантажити за посиланням (.7z, 21 Kb).

Блок 1

  1. Реалізувати препроцесор для вводу граматики в ЕОМ. Препроцесор перетворює послідовність правил текстового файлу в інформаційну структуру в пам’яті ЕОМ. Вхідні дані: файл з текстом граматики мови програмування. Результат занести до опису граматики — екземпляр класу MyLang;

  2. Реалізувати алгоритм пошуку недосяжних не терміналів. Правила, що починаються з недосяжних не терміналів вилучити з граматики;

  3. Реалізувати алгоритм пошуку непродуктивних правил. Непродуктивні правила вилучити з граматики.

  4. Перевірити, чи — пуста множина.

  5. Реалізувати алгоритм пошуку -нетерміналів. Результат занести до опису граматики — екземпляр класу MyLang;

  6. Реалізувати алгоритм пошуку ліво-рекурсивних не терміналів.

  7. Реалізувати алгоритм пошуку право-рекурсивних не терміналів.

  8. Розробити та реалізувати алгоритм пошуку всіляких виводів мінімальної довжини (без повторів), які призводять до лівої рекурсії.

  9. Розробити та реалізувати алгоритм пошуку всіляких виводів мінімальної довжини (без повторів), які призводять до правої рекурсії.

Блок 2

  1. Реалізувати алгоритм пошуку множин , . Результат занести до опису граматики — екземпляр класу MyLang.

  2. Реалізувати алгоритм пошуку множин , . Результат занести до опису граматики — екземпляр класу MyLang.

  3. Реалізувати алгоритм пошуку множин для правил , . Результат занести до опису граматики — екземпляр класу MyLang.

  4. Реалізувати алгоритм пошуку множин , для правил , . Результат занести до опису граматики — екземпляр класу MyLang.

  5. Перевірити, чи є побудована граматика -граматикою.

  6. Перевірити, чи є побудована граматика сильною -граматикою (для );

  7. Перевірити, чи є побудована граматика сильною -граматикою (для );

  8. Побудувати таблицю управління -синтаксичного аналізатора.

  9. Побудувати множини , . Результат занести до опису граматики — екземпляр класу MyLang.

  10. Перевірити, чи є граматика -граматикою ().

Блок 3

  1. Реалізувати синтаксичний аналізатор мови Pl/0 методом магазинного автомата.

  2. Реалізувати синтаксичний аналізатор мови Pl/0 методом рекурсивного спуску.

  3. Реалізувати синтаксичний аналізатор мови Pl/0 методом рекурсивного спуску на правилах грамматики (рекурсивний алгоритм руху по правилах граматики);

  4. Реалізувати синтаксичний аналізатор мови Pascal методом магазинного автомата.

  5. Реалізувати синтаксичний аналізатор мови Pascal методом рекурсивного спуску.

  6. Реалізувати синтаксичний аналізатор мови Pascal методом рекурсивного спуску на правилах грамматики (рекурсивний алгоритм руху по правилах граматики);

  7. Реалізувати синтаксичний аналізатор мови C методом магазинного автомата (за умови наявності колізій для декількох не терміналів).

  8. Реалізувати синтаксичний аналізатор мови C методом рекурсивного спуску (за умови наявності колізій для декількох не терміналів).

  9. Реалізувати синтаксичний аналізатор мови C методом рекурсивного спуску на правилах грамматики (рекурсивний алгоритм руху по правилах граматики) за умови наявності колізій для декількох не терміналів;

Назад до усіх лаб

Назад на головну