/*******************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// Структуры, описывающие ядро перевода
// Анисимов Д.В. сегодня
/*******************************************************************/
# ifndef CORE_H
# define CORE_H
# include <grammar.h>
# include <slowo3.h>
const int LWORD = 50 ; // длинна строки слова
const int LFRASA=1000 ; // длинна строки фразы
struct t_Core ;
// ---------------- типы тегов внутри форматированной строки -----------
enum e_TagType
{ P_FRASA,
P_VERBATIM,
P_STRUCT,
P_CONST,
P_TAG_LEFT,
P_TAG_RIGHT,
P_VERB
};
// ---------------- чем закончился перевод фразы -----------------------
enum e_Result
{ E_NULL, // программа не вызывалась вообще
E_NO, // не нужно транслировать
E_OK, // перевелось
E_FIG, // частично перевелось
E_FIGNA, // не перевелось
E_ERROR // внутренняя ошибка программы
};
// ------------------ представление для слова источника или приемника ---
struct t_Item
{ char *Str1 ; // ссылка на то место фразы, где начинается это слово
char *Str ; // отдельно это слово
char exist ; // существует ли это слово в словаре
e_TagType type ;
short i_struct,i_word ;
short z_str ; // где это слово начинается в исходной строке
};
DECLARE_LIST_TYPE( t_Item,t_ItemList );
// ------------------ узел дерева разбора фразы и -----------------------
// ------------------ узел дерева вариантов перевода --------------------
struct t_Tree
{ e_Type type ; // тип узла
long up ; // ссылка вверх
long down,n_down ; // ссылка вниз, и число таких ссылок
// если down=-1 то это конец дерева разбора
short i_word, // с какого слова начинается
i_last_word, // с какого слова начинается следующая
i_struct ; // что за структура
long i_variant ; // номер варианта структуры
long link ; // ссылка источника на приемник или наоборот
t_Form Form ; // параметры сией структуры в соответствии с Struct->Param
short select ; // выбранный вариант в TSELECT
short index ; // номер слова в структуре t_Struct->Word
long i_slowo ; // индекс в словаре переводов
short i_slowo1 ; // способ перевода
short n_slowo ; // число вариантов перевода
short left_tag, // индекс левого и правого тега,
right_tag ; // прицепленного к этому узлу
char Str [LWORD] ; // значение в нужной форме
char Str1[LWORD] ; // значение в начальной форме
t_Tree( void );
~t_Tree( void );
void init( void );
void del( void );
void set( char _type, long up, short iw, short i_struct );
} ;
DECLARE_LIST_TYPE( t_Tree, t_TreeList );
// ----------- вариант реализации слова ----------------------
struct t_rWord
{
e_Type type ;
short i_word, // номер слова, с которого начинается
i_last_word, // номер слова, с которого начинается следующий
i_struct; // номер структуры в t_Grammar->Trans[]
long i_variant; // номер варианта перевода
short index ; // индекс в массиве t_Struct->Word[]
long i_slowo ; // индекс в словаре переводов
short i_slowo1 ; // способ перевода
short n_slowo ; // число вариантов перевода (в словаре)
t_rWord( );
};
DECLARE_LIST_TYPE( t_rWord,t_rWordList );
// ----------- вариант реализации структуры ------------------
struct t_rStruct
{
e_Type type ;
short i_word, // с какого слова начинается
i_last_word, // с какого слова начинается следующая
i_struct ; // номер структуры в t_Grammar->Trans[]
long r_word ; // ссылка на t_Core->rWord
long i_slowo ; // индекс в словаре переводов
short i_slowo1 ; // способ перевода
t_Form Form ;
long i_meaning ; // смысл этой конструкции на языке оригинала
// (указывает на t_Core->Meaning)
t_rStruct( );
};
DECLARE_LIST_TYPE( t_rStruct,t_rStructList );
// ---------- все возможные варианты реализации структуры ----
struct t_Variants
{ char absend ; // признак того, что эта конструкция в
// этой позиции стоять не может
short i_struct,i_word ;
t_rStructList Variant ; // сами варианты разбора
};
struct t_aWord
{ short i_word,
i_last_word ;
short i_struct ;
long i_slowo ;
short n_slowo ; // число вариантов перевода
long meaning ;
t_Form Form ;
char Str[LWORD] ;
};
DECLARE_LIST_TYPE( t_aWord, t_aWordList );
// ----------- возможный перевод фразы ------------------------
class t_Antwort
{
char Str[LFRASA] ; // собственно ответ
t_TreeList Tree1, Tree2 ; // структура фразы-источника и фразы приемника
t_aWordList aWord ; // фраза-приемник
public:
t_Antwort( );
void del( void );
void make( short i_word, short i_struct, long i_variant, t_Form Form );
void make_sou( short i_word, short i_struct, long i_Variant );
char *translate_simple( short Begin );
char *str( void );
t_aWordList *aword( void );
t_TreeList &tree1( void );
t_TreeList &tree2( void );
private:
void set_tree( t_Tree *T, t_rStruct *pS, long i );
void make_dst( void );
void make_dst1( long up, long i2, t_Trans *Tr );
void make_dst2( long up, long i2, t_sStruct *S1, t_sStruct *S2 );
void make_to( long i_tree );
void param_from( void );
void param_transmit( void );
void param_to( void );
void make_vision( char Halb, long i_tree );
void insert_tag();
void print_antwort( long i_tree, char fword );
void add_word( t_Tree &T, char fword );
void post_proc( void );
};
// ---------- главный класс перевода --------------------------
class t_Core
{
short n_struct,n_word ;
t_ItemList From,Tag ; // структуры From
t_Variants *Variants ; // [n_struct*n_word] все присутствующие
// варианты разбора
t_rWordList rWord ; // то, на что ссылается t_Variant->variant
char *Meaning ; // смыслы t_Variant->meaning
long j_Meaning,
l_Meaning ;
t_Antwort Antwort; // варианты переведенной фразы
char f_Full ; // признак, что существуют полные варианты
char Sign ; // знак в конце предложения '.' или '?'
e_Result Result ; // код завершения
char *Sou ; // исходная фраза
char Sou0[LFRASA] ; // исходная фраза разбитая на слова
char Sou1[LFRASA] ; // исходная фраза разбитая "от тега до тега"
public:
t_Core();
~t_Core();
void init( short n_struct, short n_word );
void clr( );
void translate( char *Sou, char *Dst );
void make_node( t_TreeList &Node, short i_word, long i_struct );
t_Variants *variants( short i_word, long i_struct );
t_rStruct *variant( short i_word, long i_struct, long i_variant );
t_rStruct *variant( t_rWord R );
t_ItemList &from( void );
t_ItemList &tag( void );
t_rWord &rword( long i );
t_Antwort &antwort( );
long n_antwort( );
char f_full();
char sign( void );
long struct_of_word( short i_word );
short fn_word();
e_Result result();
char *sou();
char *get_meaning( t_rStruct *V );
private:
void universe( short i_word, long i_struct );
void set_meaning( t_rStruct *V, char *Str );
void no_brakets( char *Str, char *Str1 );
char make_from1( char *Sou );
char make_from2( void );
void add_from( short i_word, long i_struct, t_Form Form,
long i_slowo, short i1_slowo );
char atom( short i_word, t_Word &Word );
void real_param_up( t_rStruct *V );
char Compare_Param( t_rStruct *Variant, t_Word *Word );
char select2_exist( short i_word, short i_struct, short i_last_word );
friend class t_Slowo3 ;
};
extern t_Core Core ;
extern t_Slowo3 Perevod ;
char read_grammar( char *Dir );
char reread_grammar( char *Dir );
void set_formats( void );
char *filename( char *Path, char *File );
# endif