/***************************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// Структуры, описывающие грамматику
// Анисимов Д.В. сегодня
/***************************************************************************/
# ifndef GRAMMAR_H
# define GRAMMAR_H
# include <stdio.h>
# include <list.h>
# include <lexer.h>
const int LNAME = 40 ; // длинна слова файла lang.txt
DECLARE_LIST_TYPE( short,t_shortList );
DECLARE_LIST_TYPE( long ,t_longList );
struct t_Grammar ;
struct t_Lang ;
// -------------- возможные значения параметров ------------------
struct t_Value
{ char Name[LNAME] ; // значение параметра например "Творительный"
} ;
DECLARE_LIST_TYPE( t_Value,t_ValueList );
// -------------- параметр слова - падеж и тд --------------------
struct t_Param
{
char Name[LNAME] ; // название параметра например "Падеж"
t_ValueList Value ; // возможные значения параметров
t_Param( void );
~t_Param( void );
void init( void );
void del( void );
} ;
DECLARE_LIST_TYPE( t_Param,t_ParamList );
// -------------- параметр слова - падеж и тд --------------------
struct t_Param1
{ short param ; // тип параметра в соответствии с Lang->Param
char Name[LNAME] ; // название параметра например "Падеж"
char Dir ; // 1-источник 0-приемник
char value ; // значение параметра, если -1 значит не задан
};
DECLARE_LIST_TYPE( t_Param1,t_Param1List );
// ------------- форма слова -------------------------------------
struct t_Form
{
char value[10]; // порядок параметров - в соответствии с Part->Param
void init( );
t_Form();
};
// =========== все, что относится к грамматическому словарю ======
DECLARE_LIST_TYPE( t_Form,t_FormList );
// ------------ переименование грамматических параметров ---------
struct t_Rename
{ char Reduce[6] ; // сокращенное обозначение параметра (например "f")
char Full[LNAME] ; // полное имя значения параметра (например "женский")
};
DECLARE_LIST_TYPE( t_Rename,t_RenameList );
// ------------ формат, описывающий грамматический словарь -------
struct t_Format
{
char Name[LNAME] ; // имя формата
short i_part ; // индеск части речи в соответствии с
// t_Lang->Part[this->i_part]
t_FormList Record ; // список возможных форм слова
t_Format( void );
~t_Format( void );
void init( void );
void del( void );
};
DECLARE_LIST_TYPE( t_Format,t_FormatList );
DECLARE_LIST_TYPE( char *,t_strList );
// ----------- файлы, в которых лежат грамматические словари ---
struct t_File
{
short i_part, // часть речи в соответствии с t_Lang->Part[this->i_part]
i_format ; // индекс формата
t_strList FileName ;// имена файлов, в которых лежит эта часть речи
t_File( void );
~t_File( void );
void init( void );
void del( void );
};
DECLARE_LIST_TYPE( t_File,t_FileList );
// =========== все, что относится к словарю переводов ==========
// -------------- описание части речи в словаре переводов ------
struct t_PartDsk
{ char Tag[2] ; // тег части речи в словаре переводов
char Name[LNAME] ;// имя части речи
short i_part ; // номер части речи
};
DECLARE_LIST_TYPE( t_PartDsk, t_PartDskList )
// -------------- формат, описывающий словарь переводов -------
struct t_Format1
{ char Name[LNAME] ; // имя формата
t_PartDskList SouPart, // список переименования структур
DstPart ;
t_RenameList Rename ; // список переименования параметров
void init( void );
void del( void );
void make_part( t_Grammar *Grammar );
short find_struct( char Dst, char *Str );
char *get_tag( char Dst, short i_struct );
char *get_name( char Dst, short i_struct );
};
DECLARE_LIST_TYPE( t_Format1, t_Format1List )
// =========== все, что относится к структуре =================
// ----------- тип структуры ----------------------------------
enum e_Type
{ TNULL, // нет в этом месте структуры - пустая запись
TCONST, // неизменяемый литерал
TCONST1, // неизменяемый литерал из словаря
TWORD, // слово
TWORD0, // пустой выбор (@00)
TSTRUCT, // структура
TSTRUCT1, // фиксированная структура из словаря
TSTRUCT2, // произвольная структура из словаря
TSELECT, // выбор
TSELECT1, // несимметричный выбор
TSELECT2, // "собирательный" выбор
TENUM, // "препроцессорный" выбор
TUNORDER, // структура, члены которой могут менять порядок
TUNORDER1,
TUNORDER2
} ;
// ----------- макросы типа структуры --------------------------
# define IF_WORD( T ) ((T)==TCONST || (T)==TCONST1 || (T)==TWORD)
# define IF_STRUCT( T ) ((T)==TSTRUCT || (T)==TSTRUCT1 || (T)==TSTRUCT2)
# define IF_SELECT( T ) ((T)==TSELECT || (T)==TSELECT1 || (T)==TSELECT2)
# define IF_UNORDER( T ) ((T)==TUNORDER || (T)==TUNORDER1 || (T)==TUNORDER2)
# define IF_CONSTR( T ) ((T)==TSTRUCT || (T)==TSTRUCT1 || (T)==TSTRUCT2\
|| (T)==TSELECT || (T)==TSELECT1 || (T)==TSELECT2\
|| (T)==TUNORDER || (T)==TUNORDER1 || (T)==TUNORDER2)
// -------------- половинка перевода ---------------------------
enum e_Half
{ FROM,
TO
} ;
// ---------- элемент заголовка таблицы трансляции параметров -----
struct t_2Index
{ short i1, // индекс слова
i2, // индекс параметрв в структурк
i_param ; // индекс параметра в языке
char Name[LNAME] ;
};
DECLARE_LIST_TYPE( t_2Index, t_2IndexList );
// ---------- направление передачи параметров внутри структуры -----
struct t_Relation
{ char s1,p1 ; // индекс структуры и параметра источника
char s2,p2 ; // индекс структуры и параметра приемника
};
DECLARE_LIST_TYPE( t_Relation, t_RelationList );
// ---------- способ обойти транслятор - близнец от t_RelationList --
struct t_RelationList1
{
t_Relation *list ;
long j ;
void operator = ( t_RelationList &a ){ list=a.list ; j=a.j ; }
};
// ------------------------ описание слова -------------------------
struct t_Word
{ e_Type type ; // слово,структура или выбор
char Name[LNAME] ; // имя структуры
char literal[LNAME] ;// строковая константа
t_Param1List Param; // параметры структуры
short order ; // индекс упорядочивания
short i_struct ; // индекс структуры в массиве t_All_Data->Trans
char use ;
char meaning_use ; // признак того, что значение передается наверх
t_Word( void );
void init( void );
void del( void );
void operator = ( t_Word &W );
};
DECLARE_LIST_TYPE( t_Word,t_WordList );
// ------------------- описание словосочетания ------------------
struct t_Struct
{ e_Type type ; // слово,структура или выбор
char Name[LNAME] ; // имя структуры
long i_str ; // строка, в которой содержится ее описание
t_Param1List Param ; // параметры структуры
t_WordList Word ; // составляющие
t_RelationList Relation ; // соответствие параметров
// если структура s1 - индекс слова
// если выбор s1 - индекс варианта
t_Struct( void );
void operator = ( t_Struct &S );
void init( void );
void del( void );
long read( long Begin, t_Lang *Lang );
long trans_word1( long Begin );
long trans_word ( long Begin );
long trans_param( long Begin, t_Lang *Lang );
long trans_order( long Begin, t_Word *Word );
void trans_relation( void );
void tst_relation( void );
t_2Index find_param2( char *Str );
};
DECLARE_LIST_TYPE( t_Struct,t_StructList );
// --------------------- таблица трансляции параметров ----------
struct t_Table
{ short Size ; // длинна строки таблицы
t_2IndexList In,Out ; // входные и выходные параметры
t_shortList Value ; // значения параметров
void init( void );
void del( void );
void operator = ( t_Table &T );
};
DECLARE_LIST_TYPE( t_Table, t_TableList );
// =========== глобальные и фундаментальные структуры ===========
// ----------- трансляционная пара ------------------------------
struct t_Trans
{ t_Struct From,To ; // описание структуры в соответствующем языке
t_shortList Relation1, // соответствие частей From->To
Relation2 ; // соответствие частей To->From
t_strList Param1,Param2 ;// имена параметров той и другой структуры
t_TableList Table ; // таблицы трансляции параметров
short n_variant ; // число возможных реализаций этой структуры
t_Trans( void );
void operator = ( t_Trans &SS );
void init( void );
void del( void );
void make_order( void );
void make_index_table( void );
};
DECLARE_LIST_TYPE( t_Trans, t_TransList );
// -------------- описание языка (источника или приемника) --------
struct t_Lang
{
char Name[LNAME] ;
t_ParamList Param ; // параметры
t_StructList Part ; // части речи
t_FormatList Format ; // форматы грамматических словарей
t_FileList File ; // файлы грамматических словарей
t_Lexer *Lexer ;
char To ; // признак того, что это язых-приемник
void del( void );
long read( t_Lexer *Lexer, long B );
void read_format( long Begin, t_Format *Format );
};
//! ---------------------- все структуры, описывающие язык ---------
class t_Grammar
{
t_Lang From ,To ; // язык оригинала и перевода
t_Format1List Format1 ; // форматы переводов
t_FileList File1 ; // имена файлов переводов
t_TransList Trans ; // список всех трансляционных пар
short i_Number ; // часть речи, которая числительное
public:
char make_all( char *File );
short find_struct( e_Half Half, char *Str );
t_Trans& operator []( long i );
short n_trans( );
short main_struct( );
short i_number( );
t_Lang& from();
t_Lang& to();
t_Format1List& format1();
t_FileList& file1();
private:
void copy_words( void );
void read( char *File );
long read_slowo1( long Begin );
long read_format1( long Begin, t_Format1 *Format );
long read_trans( long Begin );
long read_trans1( long Begin );
long read_table( long Begin, t_Trans *TT );
void make_index_struct( void );
void make_index_param0( long i_trans );
void make_index_param( e_Half Half, long i_trans, long i_word );
void make_index( void );
void index_word( t_Word *W, e_Half Half );
short find_format1( char *Word );
void del( void );
};
extern t_Lexer Lexer ;
extern t_Grammar Grammar ;
extern FILE *File_Error ;
extern char Read_Error ;
extern FILE *File_Error ;
extern char Read_Error ;
short find_param( t_ParamList *List, char *Str );
short find_format(t_FormatList *List, char *Str );
short find_value( t_ValueList *List, char *Str );
# define i_main_struct Grammar.main_struct( )
# endif