таблиці.
В· Enum блок - визначення С + + енумераторов, використовуваних у визначенні таблиці.
В· Code блок - блок сирого С + + коду встраімого безпосереднього в результуючий файл.
Транслятор складається з 3 основних частин лексики, семантики і пускового модуля, написаних на мові Perl.
Лексичний аналізатор створений з урахуванням цієї граматики і має наступний інтерфейс.
Prepare (array of lines);// Normal result == 0
token Next ();
Він підтримує також препроцессірованіе на рівні вкладень include.
Семантичний аналізатор складається з API, що викликаються як обробники подій (для інтерфейсу yapp вказуються у визначенні граматики).
Пусковий модуль є оболонкою для запуску синтаксичного аналізатора, з розбором вхідних параметрів
Формат:
1) HibaseCompiler.pl [-f ім'я файлу] [-p шлях до hibase] [-d каталог, куди приміщ. сген стаб]
2) program | HibaseCompiler.pl [-p шлях до hibase] [-d каталог, куди приміщ. сген стаб].
6.Прімер роботи програми
В якості прикладу розглянемо таке визначення бази даних
Tables . def
code def top
{*
# include
# include
# include
# include
# include "../Hblib/consts.hh"
# include "../Hblib/ll.hh"
# include "../Hblib/utils.hh"
# include "../Hblib/hdb.hh"
# include "Tbmain.hh"
# include "Dbmain.hh"
*}
option
{
file = "Main";
namespace = "Hb";
};
table supplier
{
char [12] name.!;// key uh;// unq, hash
char [40] desc;
};
table thing
{
supplier + tsupplier;// зовнішнє посилання
char [12] name.!;// key uh;// unq, hash
char [40] desc;
};
end
У результаті роботи транслятора отримуємо 3 файлу: файл опису структур записів таблиць, файл визначення самих таблиць та бази і файл її реалізації:
hbmain.hh
namespace hb {
using namespace hb;
class mainEnv;
struct supplierKey
{
db_recno_t key;
inline void Export (FILE * f);
inline void Import (char *, uint);
supplierKey (const db_recno_t & key_temp);
supplierKey () {}
} __attribute__ ((Packed));
struct supplierVal
{
char name [12];
char desc [40];
inline void Export (FILE * f);
inline void Import (char *, uint);
supplierVal (char * name_temp, char * desc_temp);
supplierVal () {}
} __attribute__ ((Packed));
class qsupplier: public hbTable {
mainEnv & menv;
public:
qsupplier (mainEnv &);
inline void RefInit ();
static void GetRef_supplier (uint, char *, char *, db_recno_t * &, uint &);
static int qsupplier :: idx_name (Db * db, const Dbt * pk, const Dbt * pv, Dbt * fv);
};
struct isupplier_na me
{
char name [12];
char * Getname () {return name;}
isupplier_name (char * name_temp);
} __attribute__ ((Packed));
// --------------------------------------------- ---------------------------------
struct thingKey
{
db_recno_t key;
inline void Export (FILE * f);
inline void Import (char *, uint);
thingKey (const db_recno_t & key_temp);
thingKey () {}
} __attribute__ ((Packed));
struct thingVal
{
db_recno_t tsupplier;
char name [12];
char desc [40];
inline void Export (FILE * f);
inline void Import (char *, uint);
thingVal (const db_recno_t & tsupplier_temp, char * name_temp, char * desc_temp);
thingVal () {}
} __attribute__ ((Packed));
class qthing: public hbTable {
mainEnv & menv;
public:
qthing (mainEnv &);
inline void RefInit ();
static void GetRef_thing (uint, char *, char *, db_recno_t * &, uint &);
static int qthing :: idx_name (Db * Db, const Dbt * pk, const Dbt * pv, Dbt * fv);
};
struct ithing_name
{
char name [12];
char * Getname () {return name;}
ithing_name (char * name_temp);
} __attribute__ ((Packed));
// --------------------------------------------- ---------------------------------
};
dbmain.hh
namespace hb {
using namespace hb;
enum idxNames {
dbn_supplier_name = 0, dbn_thing_name = 0};
class mainEnv;
class mainEnv: public...