иконується першим.
Секція правил містить граматичні правила :
Кожне правило складається з ліворуч лежачого символу (нетермінального), розділеного ':' і одним або декількома можливими правилами, розділеними '|' і завершеними ';':
exp: exp '+' exp
| exp '-' exp
;
Правило праворуч може бути порожнім
input: # empty
| input line
;
Для завдання явного пріоритету у разі неоднозначності слід використовувати директиву % prec , що дає правилу високий пріоритет.
exp: '-' exp% prec NEG {- $ _ [1]}
| exp '+' exp {$ _ [1] + $ _ [3]}
| NUM
;
Примітно, що YAPP дозволяє вбудовувати в синтаксичний аналізатор семантику. Це організується шляхом додавання в кінці правила конструкцій {...}, що обмежують Perl-команди. Вони вбудовуються в синтаксичний аналізатор і виконуються після застосування аналізатором цього правила. Такий код може повертати деяку величину, використовувану у визначенні наступного правила по дереву. p> Змінні $ _ [1], $ _ [n] є параметрами і зберігають значення розібраного правила. p> < code> Нижня секція може містити коректний Perl -код, що вбудовується в кінці сформованого синтаксичного аналізатора. Там можна вказати Лексер, процедуру аналізу помилок.
5.Структура розроблюваної програми
Ідеологія оболонки полягає в тому, що користувач майбутньої бази даних спочатку описує на спеціальній мові структури даних, з яких повинні складатися таблиці в базі (тобто фактично інтерфейси) їх посилальні зв'язку, індекси тощо Потім за допомогою спеціального транслятора він отримує готовий С + + код, який реалізує інтерфейс роботи з базою даних, визначений користувачем, включаючи саму базу, її таблиці, запису даних, транзакції і деякі інші об'єкти. Код, генерований транслятором, насправді, є теж оболонкою. Справа в тому, що багато частин транслятора мають під собою загальну підставу. Ці статичні класи та функції можна виділити в бібліотеку. Ще одна причина для цього - семантика самого транслятора повинна бути якомога простіше. І як наслідок цього, скорочуються розміри генеруються файлів.
Отриманий програмний код залишається тільки включити в проект і використовувати вже готові об'єкти бази даних і таблиць.
Нова база даних повинна розташовувати такими можливостями:
В· Додавання користувача даних їх модифікація і видалення.
В· Відкриття бази в декількох режимах: наприклад, в нормальному многопользовательском транзакційному режимі, безпечному режимі (як правило, для монопольного доступу і використовується утилітами), а також в режимі відновлення бази даних.
В· Імпорту даних, тобто, представлення даних в деякому текстовому форматі, і їх переміщення в порожню базу даних
В· Експорту даних, тобто, переміщення даних з бази, і подання їх у певному текстовому форматі у файлі, зручному для читання. Є взаємно зворотного операцією попередньої.
В· Перевірки індексного цілісності. Справа в тому, що іноді, внаслідок різних зовнішніх факторів (наприклад, перепад напруги), втрачається актуальність і коректність даних в індексних таблицях, і їх необхідно періодично перевіряти і в разі необхідності відновлювати.
В· Перевірки посилальної цілісності. Тобто перевірка коректності логічних залежностей між таблицями в базі.
Отже, вся оболонка складається з наступних частин:
1. Власне, базова бібліотека статичних класів, для високоуровневой роботи з Berkeley, необхідна транслятору.
2. Транслятор, який, також є генерується оболонкою під типи даних користувача навколо бібліотеки.
Бібліотека класів
В«ДвижокВ» представляє собою бібліотеку класів, які з одного боку є надбудовами навколо стандартних відповідних структур, а з іншого боку роблять їх інтерфейс більш зручним і інкапсулюють частину роботи транслятора. Основними компонентами є:
В· Транзакції
В· Винятки
В· Базові запису
В· Таблиці
В· Бази даних
В· Курсори
Базові запису
Базова запис - це елементарна одиниця зберігання в таблиці. Опис її класу:
//! базовий клас для записів з vtable pointer
class hbObj {
Dbt dbt;
protected:
void dbtInit (uint s, void * d)
{
dbt.set_flags (DB_DBT_USERMEM);
dbt.set_ulen (s);
dbt.set_size (s);
dbt.set_data (d);
}
public:
operator Dbt * () {return &dbt;}
void * getData (void) {Return dbt.get_data ();};
uint getSize (void) {Return dbt.get_size ();};
hbObj () {} p> virtual ~ hbObj () {} p>};
Цей розділ не зовсім зручний для безпо...