/**************************************************************************/ // Распечатать грамматику в красивом виде // /**************************************************************************/ # include # include # include # include # include struct t_dFile { char Name[100] ; }; struct t_dStruct { short i_file ; long i_rem ; }; struct t_Rem { short i_file, i_struct, type ; // 0 - вне перевода 1-внутри перевода // 2-после первой структуры 3-после второй char Str[100] ; }; struct t_String { char Str[1000] ; t_String( void ) { Str[0]=0 ; }; void add_s( char *s ); void add_d( short d ); void clr( void ) { Str[0]=0 ; }; void print( FILE *fw ){ fprintf( fw,Str ); Str[0]=0 ; }; short strlen( void ) { return :: strlen(Str) ; }; void print_param( char to, short i_param, char f=0 ); void print_value( char to, short i_param, short i_value ); void print_struct( char to, short i_struct ); void print_word( char to, t_Word *W, char f=0 ); }; t_dFile File[20] ; t_dStruct *Struct=NULL ; t_Rem *Rem =NULL ; long n_Struct=0,n_Rem=0,n_File=0,j_Rem=0 ; char *get_name( char *Str ); char *get_rem( char *Str ); void set_rem_index( short i_struct ); void set_rem_file( short i_file ); void my_more_main( void ); /***************************************************************************/ void t_String :: add_s( char *s ) { short i,j ; char s1[200] ; for( i=j=0 ; i<200 ; i++ ) { if( s[i]=='%' ) continue ; s1[j++]=s[i] ; if( s[i]==0 ) break ; } strcat( Str,s1 ); } void t_String :: add_d( short d ) { char Buf[20] ; sprintf( Buf,"%d",d ); strcat( Str,Buf ); } /* --------- напечатать имя параметра ----------------------------------- */ void t_String :: print_param( char to, short i_param, char f ) { char *s,Buf[200] ; if( to==0 ) s=Grammar.from().Param[i_param].Name ; else s=Grammar.to().Param[i_param].Name ; if( f==1 ) { if( to==0 ) sprintf( Buf,"%c",s,'%' ); else sprintf( Buf,"%c",s,'%' ); add_s(Buf); } if( f==2 ) { if( to==0 ) sprintf( Buf,"",s ); else sprintf( Buf,"",s ); add_s(Buf); } add_s(s); add_s(""); } /* --------- значение параметра ----------------------------------------- */ void t_String :: print_value( char to, short i_param, short i_value ) { if( i_value<0 ) { add_s( "@0" ); return ; } if( to==0 ) add_s( Grammar.from().Param[i_param].Value[i_value].Name ); else add_s( Grammar.to().Param[i_param].Value[i_value].Name ); } /* --------- напечатать имя структуры ----------------------------------- */ void t_String :: print_struct( char to, short i_struct ) { e_Type t ; if( i_struct<0 ) return ; if( to==0 ) t=Grammar[i_struct].From.type ; else t=Grammar[i_struct].To.type ; if( t==TCONST ) { add_s("@0"); return ; } if( t==TCONST1 ) { add_s("@1"); return ; } if( t==TWORD0 ) { add_s("@00"); return ; } if( to==0 ) add_s( Grammar[i_struct].From.Name ); else add_s( Grammar[i_struct].To.Name ); } /* -------- напечатать слово -------------------------------------------- */ void t_String :: print_word( char to, t_Word *W, char f ) { short i ; char Buf[200] ; if( f==1 ) { if( W->type==TCONST ) add_s("@0"); if( W->type==TCONST1 ) add_s("@1"); if( W->type==TWORD0 ) add_s("@00"); } else { if( W->type==TCONST ) add_s("@0"); if( W->type==TCONST1 ) add_s("@1"); if( W->type==TWORD0 ) add_s("@00"); } if( W->i_struct<0 ) return ; if( f==1 ) { sprintf( Buf,"%c", File[Struct[W->i_struct].i_file].Name, Grammar[W->i_struct].From.Name,'%' ); add_s(Buf); } print_struct( to, W->i_struct ); if( f==1 ) add_s(""); if( W->literal[0]!=0 ) { add_s( "[" ); add_s( W->literal ); add_s( "]" ); } if( 0Param.j ) add_s("("); for( i=0 ; iParam.j ; i++ ) { if( W->Param[i].Dir==1 ) add_s(" &"); else add_s(" "); add_s( W->Param[i].Name ); if( iParam.j-1 ) add_s(","); } if( 0Param.j ) add_s(" )"); add_s(" "); } /* --------- напечатать часть речи -------------------------------------- */ void Print_struct( FILE *fw, char to, short i_struct ) { t_String Str0,Str1 ; t_Struct *S ; e_Type t ; short i,L0,L1 ; if( to==0 ) S=&Grammar[i_struct].From ; else S=&Grammar[i_struct].To ; t=S->type ; // ------ первоначальная запись заголовка ------------- if( t==TWORD ) Str0.add_s("@Часть_речи "); if( t==TSTRUCT ) Str0.add_s("@Структура "); if( t==TSTRUCT1 ) Str0.add_s("@Структура1 "); if( t==TSTRUCT2 ) Str0.add_s("@Структура2 "); if( t==TSELECT ) Str0.add_s("@Выбор "); if( t==TSELECT1 ) Str0.add_s("@Выбор1 "); if( t==TSELECT2 ) Str0.add_s("@Выбор2 "); Str0.add_s( S->Name ); if( 0Param.j ) Str0.add_s("( "); for( i=0 ; iParam.j ; i++ ) { Str0.print_param( to, S->Param[i].param ); if( S->Param[i].Dir==1 ) Str0.add_s(" &"); else Str0.add_s(" "); Str0.add_s( S->Param[i].Name ); if( iParam.j-1 ) Str0.add_s(", "); } if( 0Param.j ) Str0.add_s(" )"); if( 0Word.j ) Str0.add_s(" = "); L0=Str0.strlen(); // ------ окончательная запись заголовка ------------- Str0.clr(); if( t==TWORD ) Str0.add_s("@Часть_речи "); if( t==TSTRUCT ) Str0.add_s("@Структура "); if( t==TSTRUCT1 ) Str0.add_s("@Структура1 "); if( t==TSTRUCT2 ) Str0.add_s("@Структура2 "); if( t==TSELECT ) Str0.add_s("@Выбор "); if( t==TSELECT1 ) Str0.add_s("@Выбор1 "); if( t==TSELECT2 ) Str0.add_s("@Выбор2 "); Str0.add_s( S->Name ); if( 0Param.j ) Str0.add_s("( "); for( i=0 ; iParam.j ; i++ ) { Str0.print_param( to, S->Param[i].param,1 ); if( S->Param[i].Dir==1 ) Str0.add_s(" &"); else Str0.add_s(" "); Str0.add_s( S->Param[i].Name ); if( iParam.j-1 ) Str0.add_s(", "); } if( 0Param.j ) Str0.add_s(" )"); if( 0Word.j ) Str0.add_s(" = "); for( i=L1=0 ; iWord.j ; i++ ) { Str1.clr(); Str1.print_word( to, &S->Word[i] ); L1+=Str1.strlen(); } Str0.print( fw ); if( 80Word.j ; i++ ) { Str1.clr(); Str1.print_word( to, &S->Word[i],1 ); Str1.print( fw ); } } else { for( i=0 ; iWord.j ; i++ ) { Str1.clr(); Str1.print_word( to, &S->Word[i],1 ); Str1.print( fw ); fprintf( fw,"\n "); } } fprintf( fw,";"); } /* --------- напечатать формат ------------------------------------------ */ void print_format( FILE *fw, char to, t_Format *F ) { t_Lang *Lang ; t_Param1List *Param ; short i,i1 ; t_String Str ; if( to==0 ) Lang=&Grammar.from() ; else Lang=&Grammar.to() ; Param=&Lang->Part[F->i_part].Param ; fprintf( fw,"\n@Формат "); Str.print_struct( to, F->i_part ); Str.print( fw ); fprintf( fw," %s",F->Name ); fprintf( fw,"\n{\n "); for( i=0 ; iRecord.j ; i++ ) { for( i1=0 ; i1j ; i1++ ) { t_Param1 *P1=&Param->list[i1] ; fprintf( fw,"%s = ",P1->Name ); Str.print_value( to, P1->param, F->Record[i].value[i1] ); Str.print( fw ); fprintf( fw," "); } fprintf( fw," @Слово\n "); } fprintf( fw,"\n}"); } /* --------- напечатать язык -------------------------------------------- */ void print_lang( FILE *fw, char to ) { t_Lang *Lang ; short i,i1 ; t_String Str ; if( to==0 ) Lang=&Grammar.from() ; else Lang=&Grammar.to() ; // --------- напечатать параметры ------------------ for( i=0 ; iParam.j ; i++ ) { fprintf( fw,"\n @Параметр "); Str.print_param( to, i, 2 ); Str.print( fw ); fprintf( fw,"{ "); for( i1=0 ; i1Param[i].Value.j ; i1++ ) { Str.print_value( to, i, i1 ); Str.print( fw ); fprintf( fw," "); } fprintf( fw," };"); } fprintf( fw,"\n"); // --------- напечатать части речи ----------------- for( i=0 ; iPart.j ; i++ ) { fprintf( fw,"\n "); Print_struct( fw, to, i ); } fprintf( fw,"\n"); /* // --------- напечатать форматы ----------------- for( i=0 ; iFormat.j ; i++ ) print_format( fw, to, &Lang->Format[i] ); fprintf( fw,"\n"); */ // --------- напечатать файлы ------------------- for( i=0 ; iFile.j ; i++ ) { fprintf( fw,"\n @Файлы %s {",Lang->Format[Lang->File[i].i_format].Name ); for( i1=0 ; i1File[i].FileName.j ; i1++ ) fprintf( fw," %s",Lang->File[i].FileName[i1] ); fprintf( fw," };"); } } /**************************************************************************/ void print_head( FILE *fw ) { // ----- голова ------------------------- fprintf( fw,"\n" ); fprintf( fw,"\n"); fprintf( fw,"\n"); fprintf( fw,"\n"); fprintf( fw,"\nАнисимов \"Грамматика\""); fprintf( fw,"\n"); fprintf( fw,"\n"); fprintf( fw,"\n
");
}
/**************************************************************************/
void print_tail( FILE *fw )
{
   // ----- хвост -------------------------
   fprintf( fw,"\n
" ); fprintf( fw,"\n" ); fprintf( fw,"\n" ); } /**************************************************************************/ void print_rem( FILE *fw, short i_file, short i_struct, short type ) { long i1 ; for( i1=0 ; i1",Grammar[i].From.Name ); print_rem( fw, i_File, i, 0 ); fprintf( fw,"\n@Перевод\n{"); print_rem( fw, i_File, i, 1 ); fprintf( fw,"\n "); Print_struct( fw,0, i ); print_rem( fw, i_File, i, 2 ); fprintf( fw,"\n "); Print_struct( fw,1, i ); print_rem( fw, i_File, i, 3 ); fprintf( fw,"\n}"); } print_tail( fw ); Fclose(fw); } fw=Fopen( "../doc/html_grammar/lang.h.html","w" ); print_head( fw ); fprintf( fw,"\n@Атомы_источника\n{"); print_lang( fw,0 ); fprintf( fw,"\n}"); fprintf( fw,"\n@Атомы_приемника\n{"); print_lang( fw,1 ); fprintf( fw,"\n}"); print_tail( fw ); /* fprintf( fw,"\n@Переводы\n{"); for( i=0 ; i",Grammar[i].From.Name ); printf("\n@Перевод\n{"); printf("\n "); Print_struct( 0, i ); printf("\n "); Print_struct( 1, i ); printf("\n}"); } printf("\n}"); */ unlink("grammar.more"); // printf("\nEnd"); return 0 ; } /**************************************************************************/ void my_more( char *Name ) { char Buf[100] ; sprintf( Buf,"echo ::%s >> grammar.more",Name ); system ( Buf ); sprintf( Buf,"more ../grammar/%s >> grammar.more",Name); system ( Buf ); } /**************************************************************************/ // создать временный файл грамматики /**************************************************************************/ void my_more_main( void ) { system( "rm -f grammar.more"); my_more("lang.h"); my_more("atom.h"); my_more("num.h"); my_more("sub.h"); my_more("adj.h"); my_more("adv.h"); my_more("verb.h"); my_more("verb_be.h"); my_more("verb_there_is.h"); my_more("verb_have.h"); my_more("verb_mod.h"); my_more("verb_mod_be.h"); my_more("verb_mod_have.h"); my_more("verb_c.h"); my_more("tail.h"); my_more("tail_is.h"); my_more("wh_frasa.h"); my_more("core.h"); my_more("wh_frasa.h"); my_more("lang.cpp"); } /**************************************************************************/ // достать строку из текста /**************************************************************************/ char *get_name( char *Str ) { static char Buf[100] ; short i,j=0 ; for( i=0 ; i<99 ; i++ ) if( Str[i]!=' ' ) break ; for( ; i<99 ; i++ ) { if( Str[i]==' ' || Str[i]=='\n' || Str[i]=='\t' || Str[i]=='(' ) break ; Buf[j++]=Str[i] ; } Buf[j]=0 ; return Buf ; } /**************************************************************************/ // достать коментарий из текста /**************************************************************************/ char *get_rem( char *Str ) { static char Buf[100] ; short i ; for( i=0 ; i<99 ; i++ ) { if( Str[i]=='\n' ) break ; Buf[i]=Str[i] ; } Buf[i]=0 ; return Buf ; } /**************************************************************************/ void set_rem_file( short i_file ) { long i ; if( i_file<0 ) return ; for( i=j_Rem-1 ; 0<=i ; i-- ) { if( 0<=Rem[i].i_file ) break ; Rem[i].i_file=i_file ; } } /**************************************************************************/ void set_rem_index( short i_struct ) { long i ; if( i_struct<0 ) return ; for( i=j_Rem-1 ; 0<=i ; i-- ) { if( 0<=Rem[i].i_struct ) break ; Rem[i].i_struct=i_struct ; } if( i