Автор работы: Пользователь скрыл имя, 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
ЗМІСТ
|
1 АКТУАЛЬНІСТЬ ЗАДАЧІ РОЗРОБКИ ІНТЕЛЕКТУАЛЬНОЇ СИСТЕМИ СИНТАКСИЧНОГО АНАЛІЗУ
Спроби формалізувати інтелектуальну діяльність людини привели до постановки фундаментальної лінгвістичної задачі – моделюванні її мовної поведінки, тобто побудови кібернетичної моделі природної мови. Природна мова слугує людині для вираження її думок і для розуміння думок інших людей.
Формальні моделі мови, які спочатку розроблялися в теоретичному плані, в останній час є компонентами різних прикладних систем. Будучи реалізовані на комп’ютері, вони входять в якості частин машинного перекладу, підсистем комутації з базами даних. Джон Сімонс вважає розробку систем, які здатні розуміти природну мову, «основною метою досліджень в області штучного інтелекту».
Метою роботи є побудова інтелектуальної системи синтаксичного аналізу речень.
Мета роботи визначає необхідність розв’язання таких задач:
Об’єктом дослідження виступає синтаксичний аналіз, як процес зіставлення лінійної послідовності лексем (слів, токенів) мови з його формальною граматикою.
Ціллю дослідження є створення програми – синтаксичного аналізатора, який перетворює вихідний текст у синтаксичну структуру. Під синтаксичною структурою розуміється дерево залежностей, в вузлах якого стоять слова даної природної мови з зазначенням частини мови та граматичних характеристик, а дуги відповідають специфічним для даної мови відношенням синтаксичної залежності.
На сучасному етапі розвитку програмного та апаратного забезпечення інтелектуальних систем синтаксичний аналіз відіграє дуже важливу роль. Областю застосування є все, що має «синтаксис»:
На сьогоднішній день існує багато алгоритмів, які розв‘язують даний тип задач:
Для виконання даного курсового
проекту було вибрано LR-аналізатор,
так як він найбільше підходить
для створення компіляторів. LR –
аналізатор використовує контекстно-вільну
граматику - окремий випадок формальної
граматики (тип 2 по ієрархії Хомського),
у якої ліві частини всіх продукцій
є поодинокими нетерміналами. Сенс
терміна «контекстно-вільна»
Мова, яка може бути задана контекстно-вільною
граматикою, називається контекстно-
Мова програмування повинна
3 ОБҐРУНТУВАННЯ ВИБОРУ МЕТОДА, ЩО БУДЕ ВИКОРИСТАНИЙ ДЛЯ РОЗРОБКИ ІНТЕЛЕКТУАЛЬНОЇ СИСТЕМИ СИНТАКСИЧНОГО АНАЛІЗУ
Розглянемо детальніше метод LR – аналізу.
Синтаксис
багатьох мов програмування може
бути визначений граматикою, яка є LR
(1) або близькою до цього, і з цієї
причини LR-аналізатори часто
Зазвичай на аналізатор посилаються у зв'язку з ім'ям тієї мови, вихідний код якої він розбирає, наприклад, «C++ аналізатор» розбирає вихідні коди мови C++.
LR-аналізатор
може бути створений з
Говориться,
що LR-аналізатор виконує розбір знизу
вгору, тому що він намагається вивести
продукцію верхнього рівня
Детерменірована контекстно-вільна мова - це мова, для якої існує будь-яка LR (k) граматика. Кожна LR (k) граматика може бути автоматично перетворена в граматику LR (1) для тієї ж мови, в той час як LR (0) граматика для деяких мов може не існувати. LR (0)-мови є власною підмножиною детерменірованних мов.
LR-аналізатор
заснований на алгоритмі, що
приводиться в дію таблицею
аналізу, структурою даних,
LR-аналіз
може бути узагальнений як
довільний аналіз контекстно-
LR-аналіз
може застосовуватися до
LR-аналізатори
складно створювати вручну і
зазвичай вони створюються
Рисунок 3.1 – Схема LR – аналізатора
4 РОЗРОБКА НОВИХ АЛГОРИТМІВ З МЕТОЮ РОЗРОБКИ ІНТЕЛЕКТУАЛЬНОЇ СИСТЕМИ СИНТАКСИЧНОГО АНАЛІЗУ
4.1 Проектування інтелектуальної системи синтаксичного аналізу
Основним
компонентом інтелектуальної
Перше
що необхідно зробити - це поглянути
на представлення програмного
Визначення мови:
<stmt> := var <ident> = <expr>
| <ident> = <expr>
| for <ident> = <expr> to <expr> do <stmt> end
| read_int <ident>
| print <expr>
| <stmt> ; <stmt>
<expr> := <string>
| <int>
| <arith_expr>
| <ident>
<arith_expr> := <expr> <arith_op> <expr>
<arith_op> := + | - | * | /
<ident> := <char> <ident_rest>*
<ident_rest> := <char> | <digit>
<int> := <digit>+
<digit> := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<string> := " <string_elem>* "
<string_elem> := <any char other than ">
У відповідності з зазначеним визначенням мови, оператор (stmt) може представляти із себе оголошення змінних, призначення, цикли, читання цілих чисел з командного рядка або друк на екрані - і все це можна вказувати багато разів, розділяючи оператори крапкою з комою. Вирази (expr) можуть бути рядками, інтегралами, арифметичними виразами або ідентифікаторами. Ідентифікатори (ident) можуть іменуватися з використанням букви алфавіту в якості першої літери, за якою слідують символи або цифри. Синтаксис мови надає базові арифметичні можливості, невелику систему типів і просту взаємодію з користувачем на основі консолі.
Швидкий погляд на визначення мови «ОО» показує, що AST більш-менш відповідає вузлам визначення мови з синтаксису EBNF. Краще всього уявити собі визначення мови як інкапсуляцію синтаксису, де абстрактне древо синтаксису фіксує структуру цих елементів.
У компіляторі «ОО», використовується
спадний аналізатор. Це означає,
що він читає текст зліва
направо і конструює AST, ґрунтуючись
на наступній доступній
Конструктор класу аналізатора виглядає так:
public
Parser(Collections.IList<
{
this.tokens = tokens;
this.index = 0;
this.result = this.ParseStmt();
if (this.index != this.tokens.Count)
throw new System.Exception("expected EOF");
}
Основна частина аналізу виконується методом ParseStmt. Він повертає вузол Stmt, який служить кореневим вузлом дерева і відповідає вузлу верхнього рівня визначення синтаксису мови. Аналізатор обходить список лексем, використовуючи індекс як поточної позиції і в той же час визначаючи лексеми, підлеглі вузлу Stmt в синтаксисі мови (декларації змінних і призначення, цикли, read_ints і відображення). Якщо лексему не вдається впізнати, видається помилка.
При упізнанні лексеми, створюється вузол AST і виконується подальший аналіз, який запросив вузол. Нижче приведений код, необхідний для створення вузла AST відображення:
// <stmt> := print <expr>
// <expr> := <string>
// | <int>
// | <arith_expr>
// | <ident>
if
(this.tokens[this.index].
{
this.index++;
Print print = new Print();
print.Expr = this.ParseExpr();
result = print;}
Тут відбуваються дві події. Лексема відображення скидається за допомогою збільшення індексу лічильника, після чого викликається метод ParseExpr для отримання вузла Expr, оскільки визначення мови вимагає, щоб за лексемою відображення слідував вираз.
Метод ParseExpr проходить за списком лексем від поточного індексу, визначаючи лексеми, що задовольняють визначенню виразу для мови. У даному випадку, метод просто шукає рядки, цілі числа і змінні (створені примірником сканера) і повертає відповідні вузли AST, які представляють ці вирази.