/*******************************************************************/
//              "Меркурий"-"Правда" - 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