залишок входу, поки не знаходить найдовший префікс, що може бути зпівставлений одному з регулярних виразів. Синтаксичному аналізатору лексичний аналізатор повертає єдине значення - тип лексеми. Для передачі інформації про лексему використовується глобальна змінна yylval [3,5].
Наведемо частину LEX-файлу, що реалізує функцію лексичного аналізу реляційної алгебри:
%{
#include "ra.h"
#include "ra.tab.h"
%}
% option noyywrap
% option case-insensitive
number [[:digit:]]+
whitespace [[:space:]]+
identifier [[:alpha:]_][[:alnum:]_]*
%%
[Rr][Ee][Nn][Aa][Mm][Ee] return RENAME;
[Aa][Ss] return AS;
[Ww][He][Ee][Rr][Ee] return WHERE;
У розділі оголошень, укладеному в дужки %{ і %}, перераховано константи, використовувані правилами трансляції. У секцію визначень входять також деякі регулярні визначення. Наприклад, перше визначення - це number. Воно позначає клас чисел. Друге визначення – роздільник (whitespace). Третє визначення – це identifier. Для того, щоб інтерпретатор міг правильно ідентифікувати ключові слова (JOIN, MINUS, …) було введено такі граматичні правила як:
[Uu][Nn][Ii][Oo][Nn] return UNION;
[Ii][Nn][Tt][Ee][Rr][Ss][Ee][Cc][Tt] return INTERSECT;
[Mm][Ii][Nn][Uu][Ss] return MINUS;
Синтаксичний аналіз. Ієрархічний аналіз називається розбором (parsing), або синтаксичним аналізом, котрий включає групування токенів початкової програми в граматичні фрази, які використовуються компілятором (чи інтерпретатором) для синтезу виводу.
Ієрархічна структура програми зазвичай виражається рекурсивними правилами.
В якості основного засобу для створення інтерпретатора було обрано YACC [6]. YACC використовується для побудови синтаксичного аналізатора контекстно-вільної мови. Мова, що аналізується (в нашому випадку - реляційна алгебра) описується, як було наведено вище, за допомогою граматики в вигляді форми Бекуса-Наура (БНФ). Результат роботи YACC є програма на C, яка реалізує LALR(1) розпізнавач (інтерпретатор реляційної алгебри) [8].
Кожен з виразів реляційної алгебри має свої еквіваленти на мові SQL. При трансляції ці еквіваленти будуть слугувати запитами до бази даних. Наприклад:
Вираз Реляційної Алгебри:
A RENAME Attr_old1, Attr_old2 AS Attr_new1, Attr_new2;
Еквівалент на SQL:
SELECT Attr_old1 AS Attr_new1, Attr_old2 AS Attr_new2 FROM A;
Вираз Реляційної Алгебри:
A WHERE Attr_A > 123;
Еквівалент на SQL:
SELECT * FROM A WHERE Attr_A > 123; [Дейт]
Ядром yacc-специфікації є набір граматичних правил. Кожне правило описує синтаксичну конструкцію і дає їй ім'я:
restriction : term WHERE condition
{
$$ = "SELECT * FROM "+$1+" WHERE "+$3;
};
projection : term '[' attribute_list ']'
{
$$ = "SELECT DISTINCT "+$3+" FROM "+$1;
};
Завдяки цим текстам можна зрозуміти процес трансляції виразів. Основною ідеєю трансляції виразів є те, що присутні конструкції на мові SQL, які є еквівалентами конструкціям мови реляційної алгебри.
Рис.1. Загальна структура інтерпретатора РА
Треба відмітити, що для підвищення продуктивності роботи інтерпретатора ядро програми – транслятор виразів, було створено на мові “С” в вигляді exe-файлу (рис.1). Ця програма була під’єднана до користувацького інтерфесу через зовнішній файл. Це дозволяє Java-середовищу [9] використовувати машинно-залежні функції із середини машинно-незалежної програми) . Через це було погіршено мобільність програми але покращено її продуктивність.
При використанні JDBC-ODBC мосту можна робити запити до будь-якої бази даних, створеної за стандартом SQL-92. Також, дуже просто використовувати різні БД, тому що завдяки SQL-92 всі запити багатьох БД майже не відрізняються один від одного.
Інтерфейс програми створено на основі AWT та Swing бібліотек. В цих бібліотеках є всі необхідні примітиви інтерфейсу сучасного графічного програмного продукту. Для прискорення створення інтерфейсу використовувалося інтегроване середовище автоматизованої розробки програм “JBuilder 2005 Enterprise Edition” [10].
Приклад роботи програми. Хай у базі даних ми маємо дві таблиці, які представлені на рис. 2 та рис. 3.
Рис.2. Вміст “Table1”
Рис.3. Вміст “Table2”
Для цих двох таблиць ми хочемо реалізувати наступний вираз РА:
Table1 UNION Table2;
Для цього запускаємо головне вікно програми Database Query Viewer, яке показане на рис. 4.
Рис 4. Головне вікно програми
Далі заповнюємо необхідні поля (як показано на рис. 5) і натискаємо кнопку «Показати рез-ти»:
Рис. 5. Вікно роботи програми
Як можна побачити , при виконанні SQL-запиту, з‘явилась додаткова панель – “Результати запиту”. Стовбці та рядки цієї панелі генеруються автоматично , згідно з результатами запиту. Можна ввести новий запит в поле програми “Рел.Алг.-запит”, натиснути кнопку “Показати рез-ти”. В цьому випадку ми знов матимемо результати запиту, але вже оновленні.
Висновки і перспективи подальших досліджень. На основі створеного інтерпретатора були розроблені лабораторні роботи для опанування реляційної алгебри Кодда, що зробило процес засвоєння матеріалу більш активним.
В подальшому планується поповнити набір операцій РА додатковими, розробити аналогічний інтерпретатор для мови реляційного числення та транслятори взаємного перетворення мов РА, РЧ та SQL. Трансляція мови SQL в мови РА та/або РЧ дозволить підійти до створення засобів, що забезпечуть активне засвоення ще таких тем з баз даних, як оптимізація схем виконання запитів, розподілених транзакцій, реплікацій, тощо.
Список використаної літератури
К.Дж. Дейт. Введение в системы Баз данных. - М.: Издательский дом «Вильямс», 2001.- 1071с.
Ахо, Альфред, В., Сети, Рави, Ульман, Джеффри, Д. Компиляторы: принципы, технологии, инструменты.: Пер. с англ. – М.: Издательский дом «Вильямс», 2001.- 768с.: ил. – Парал. тит. Англ.
Книга по БД КПІ (перешлю назву)
Книга по БД ОНТУ (перешлю назву)
Генератор программ лексического анализа Lex. – М.: ПВК "И Н Т Е Р Ф Е Й С", 1988. - 42с.
Автор Неизвестен Генератор программ синтаксического анализа yacc - http://bookz.ru/authors/avtor-neizvesten/yacc.html
Серебряков В. А. Лекції по конструюванню компіляторів, М.: Вид-во МГУ, 1993. – 175 с
В. Л. Богданов, В. С. Гордєєв Практичний досвід написання синтаксичного аналізатора мови програмування Кобол, 2000. – http://se.math.spbu.ru/reeng.html
KenJamesDavidTHE Java™ Programming Language, Fourth Edition, Addison Wesley Professional, 2005 – 928 p.
Chuck Easttom JBuilder 8.0 JFC and Swing programming, Wordware Publishing, 2003 – 397 p.