Автор работы: Пользователь скрыл имя, 20 Декабря 2012 в 21:30, курсовая работа
Метою роботи є побудова інтелектуальної системи синтаксичного аналізу речень.
Мета роботи визначає необхідність розв’язання таких задач:
формалізація постановки задачі інтелектуального аналізу речень;
побудова системи інтелектуального аналізу речень.
Об’єктом дослідження виступає синтаксичний аналіз, як процес зіставлення лінійної послідовності лексем (слів, токенів) мови з його формальною граматикою.
1 Актуальність задачі розробки інтелектуальної системи синтаксичного аналізу……………………………….……………...................................................3
2 Аналіз сучасних методів для розв’язання задачі розробки інтелектуальної системи синтаксичного аналізу…………………………………………………...4
3 Обґрунтування вибору метода, що буде використаний для розробки інтелектуальної системи синтаксичного аналізу………………………………...6
4 Розробка нових алгоритмів реалізації з метою розробки інтелектуальної системи синтаксичного аналізу……………..……………………………..…..….8
4.1 Проектування інтелектуальної системи синтаксичного аналізу.…….8
4.2 Розробка програмного забезпечення для інтелектуальної системи синтаксичного аналізу………………………….…………………………..12
4.3 Аналіз результатів роботи програми…………………………………..14
5 Висновки…..…………………………...………..…….……………….………...15
6 Результати наукових досліджень…………..….………………………………16
Список використаних джерел……………...………..…….……….……...……...44
Дерево AST, показане на рисунку 4.1.1 є наслідком наступного фрагмента коду:
var x = "hello world!";
print x;
Рисунок 4.1.1 – Дерево AST
4.2 Розробка програмного забезпечення для інтелектуальної системи синтаксичного аналізу
При розробці структури компілятора було використано принципи об'єктно-орієнтованого програмування. Отже, за кожну фазу роботи компілятора відповідає окремий модуль, який може бути легко замінений, не порушуючи цілісності програмного продукту. На рисунку 4.1 показано діаграму класів, які відповідають усім фазам роботи компілятора.
Рисунок 4.2.1 – Фази роботи компілятора
Основним завданням сканера є розбивка тексту (потоку символів у вихідному файлі) на частини (іменовані лексемами), які може обробити аналізатор. Сканер визначає які лексеми відсилаються аналізатору і, отже, може викидати те, що не визначено синтаксисом, наприклад коментарі. Що стосується мови «ОО», сканер цікавлять символи, числа, символи, що визначають операції (такі як додавання, множення, ділення), лапки для інкапсуляції рядків та крапки з комою.
Сканер збирає в групи потоки пов'язаних символів, формуючи лексеми для аналізатора. Наприклад, потік символів "h e l l o w o r l d!" буде згрупований в одну лексему: "hello world!".
Генератор
коду для компілятора «ОО» у великій
мірі покладається на бібліотеку Reflection.Emit
для створення виконуваних
Конструктор CodeGen, встановлює інфраструктуру Reflection.Emit, яка необхідна перш ніж розпочати виведення коду. Для початку необхідно визначити ім’я збірки і передачі його компонувальнику збірки. Компілятор «ОО» використовує ім'я вихідного файлу, як ім'я збірки. Далі йде визначення ModuleBuilder - для визначення одного модуля воно використовує те ж ім'я, що і складання. Наступним кроком є визначення TypeBuilder на ModuleBuilder, щоб утримувати єдиний тип у збірці. Після настройки структури Reflection.Emit генератор покроково аналізує AST та генерує IL код.
У
ході виконання курсового проекту
було проаналізовано основні підходи
щодо створення синтаксичного
Побудований у роботі синтаксичний аналізатор було включено до програми «Компілятор мови ОО». Ці задачі розв’язувались наявними на сьогодні методами.
Для
тестування програмного продукту передамо
на вхід компілятору текст програми
з помилками, потім враховуючи повідомлення
про помилки виправимо
Текст програми з помилкою:
var x = "hello world!"
print x;
Запуск програми виконується через командний рядок, де перший параметр це назва програми компілятора, другий – шлях до файлу з текстом програми.
Як показано на рисунку 4 компілятор видає повідомлення «expected EOF» – це означає, що було пропущено символ кінця строки «;».
Рисунок 4.3.1 – Повідомлення про помилку
Після виправлення тексту програми, він виглядає так:
var x = "hello world!"
print x;
Після компілювання виправленої версії програми, в папці де знаходиться компілятор, з’явиться виконуємий файл з програмою.
Тестування програми показало, що програмний продукт виконує покладені на нього завдання, а саме сканування, синтаксичний аналіз та перетворення тексту програми у виконуємий файл. Також компілятор реагує на помилки в тексті програми, видаючи текстове повідомлення користувачу.
При розробці курсового проекту робота над ним була організована у п’ять основних етапів:
При розробці курсового проекту найбільше часу було витрачено на реалізацію двох основних підпунктів – це написання пояснювальної записки та розробка інтелектуального модуля. Загалом було дотримано усіх правил написання пояснювальної записки.
Так
як на початку розробки курсового
проекту була чітко сформована мета
проекту та основні задачі, то при
написанні пояснювальної
У курсовому проекті розв’язано актуальну задачу побудови інтелектуальної системи синтаксичного аналізатора і розроблено компілятор, який дозволяє розробляти елементарні програми.
У ході виконання проекту отримано такі основні результати.
2.
Розроблено визначення мови «
3.
Побудовано синтаксичний
4.
Включення синтаксичного
Розроблений компілятор надає можливості виконувати базові арифметичні дії, має невелику систему типів і просту взаємодію с користувачем через консоль.
6 РЕЗУЛЬТАТИ НАУКОВИХ ДОСЛІДЖЕНЬ
УДК 519.855
В. А. Серебряков, М. П. Галочкин
Издательство: Едиториал УРСС
ISBN 5-8360-0242-8; 1/1/2001 г.
Основы конструирования
4. Синтаксический анализ
4.3 Предсказывающий разбор сверху-
4.3.1 Алгоритм разбора сверху-вниз
Пусть дана КС-грамматика G = (N, T, P, S). Рассмотрим предсказывающий разбор (или разбор сверху-вниз) для грамматики G.
Основная задача предсказывающего разбора - определение правила вывода, которое нужно применить к нетерминалу. Процесс предсказывающего разбора с точки зрения построения дерева разбора проиллюстрирован на рисунке 4.1.
|
Фрагменты недостроенного дерева соответствуют
сентенциальным формам. Вначале дерево
состоит только из одной вершины,
соответствующей аксиоме S. В этот
момент по первому символу входной
цепочки предсказывающий
На рисунке 4.2 приведена структура предсказывающего анализатора, который определяет очередное правило с помощью таблицы. Такую таблицу можно построить непосредственно по грамматике.
Рисунок 4.2
Таблично-управляемый
Входная лента содержит анализируемую строку, заканчивающуюся символом $ - маркером конца строки. Выходная лента содержит последовательность примененных правил вывода.
Таблица анализа - это двумерный массив M[A, a], где A - нетерминал, и a - терминал или символ $. Значением M[A, a] может быть некоторое правило грамматики или элемент «ошибка».
Магазин может содержать
Анализатор работает следующим образом. Вначале анализатор находится в конфигурации, в которой магазин содержит S$, на входной ленте w$ (w - анализируемая цепочка), выходная лента пуста. На каждом такте анализатор рассматривает X - символ на верхушке магазина и a - текущий входной символ. Эти два символа определяют действия анализатора. Имеются следующие возможности.
1. Если X = a = $, анализатор останавливается,
сообщает об успешном
2. Если X = a $, анализатор удаляет X из магазина и продвигает указатель входа на следующий входной символ.
3. Если X - терминал, и X a, то анализатор останавливается и сообщает о том, что входная цепочка не принадлежит языку.
4. Если X - нетерминал, анализатор заглядывает в таблицу M[X, a]. Возможны два случая:
Работа анализатора может быть задана следующей программой:
do
|
Пример 4.3. Рассмотрим грамматику арифметических выражений G = ({E, E', T, T', F}, {id, +, *, (, )}, P, E) с правилами:
E TE' |
T' *FT' | ||
E' +TE' |
T' e | ||
E' e |
F (E) | ||
T FT' |
F id | ||
Таблица предсказывающего анализатора для этой грамматики приведена на рисунке 4.3. Пустые клетки таблицы соответствуют элементу «ошибка».
|
При разборе входной цепочки id + id * id$ анализатор совершает последовательность шагов, изображенную на рис. 4.4. Заметим, что анализатор осуществляет в точности левый вывод. Если за уже просмотренными входными символами поместить символы грамматики в магазине, то можно получить в точности левые сентенциальные формы вывода. Дерево разбора для этой цепочки приведено на рисунке 4.5.
|
Рисунок 4.5
4.3.2 Функции FIRST и FOLLOW
При построении таблицы предсказывающего анализатора нам потребуются две функции - FIRST и FOLLOW.
Пусть G = (N, T, P, S) - КС-грамматика. Для - произвольной цепочки, состоящей из символов грамматики, определим FIRST( ) как множество терминалов, с которых начинаются строки, выводимые из . Если *e, то e также принадлежит FIRST( ).
Определим FOLLOW(A) для нетерминала A
как множество терминалов a, которые
могут появиться
Рассмотрим алгоритмы
Алгоритм 4.3. Вычисление FIRST для символов грамматики.
Вход. КС-грамматика G = (N, T, P, S).
Выход. Множество FIRST(X) для каждого символа X (N T).
Метод. Выполнить шаги 1-3:
если X - нетерминал и имеется правило вывода X Y 1Y 2...Y k, то включить a в FIRST(X), если a FIRST(Y i) для некоторого i, 1 i k, и e принадлежит всем FIRST(Y 1), ..., FIRST(Y i-1), то есть Y1...Y i-1 *e. Если e принадлежит FIRST(Y j) для всех j = 1, 2, ..., k, то добавить e к FIRST(X).
Алгоритм 4.4. Вычисление FIRST для цепочки.
Вход. КС-грамматика G = (N, T, P, S).
Выход. Множество FIRST(X1X2...Xn), Xi (N T).
Метод. Выполнить шаги 1-3: