/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // Класс, разбивающий текстовый файл на слова // Анисимов Д.В. сегодня /***************************************************************************/ # include # include "mylib.h" # include "lexer.h" # define Ifstr( a,b ) if( 0==strcmp(a,b) ) /***************************************************************************/ t_Lexer :: t_Lexer( void ) { Mass = NULL ; Mass1 = NULL ; Word = NULL ; Str = NULL ; l_Mass = 0 ; n_Word = 0 ; clr_breaker( ); } /***************************************************************************/ t_Lexer :: ~t_Lexer( void ) { Free( Mass ); Free( Mass1 ); Free( Word ); Free( Str ); } /***************************************************************************/ // установить какие символы являются разделителями слов /***************************************************************************/ // set_breaker( ".,;:#$%^=+-*/(){}<>[]\"\\" ); void t_Lexer :: set_breaker( unsigned char *Breaker ) { for( short i=0 ; i<256 && Breaker[i]!=0 ; i++ ) Type[Breaker[i]]=1 ; } /***************************************************************************/ // установить дефолтные символы, разделители слов /***************************************************************************/ void t_Lexer :: clr_breaker( void ) { for( short i=0 ; i<256 ; i++ ) Type[i]=0 ; Type[' '] =2 ;Type['\t']=2; Type['\n']=3 ;Type['\r']=3 ; } /***************************************************************************/ // задать массив, который будет разбираться на слова /***************************************************************************/ void t_Lexer :: init( char *_Mass, long _L ) { Free( Mass ); Free( Mass1 ); Free( Word ); Free( Str ); Mass=(char *)Calloc(_L,sizeof(char)); Str =(long *)Calloc( max(3,_L/2) ,sizeof(long)); // число слов надо посчитать более корректно l_Mass=_L ; memcpy( Mass,_Mass,l_Mass ); remark( ); } /***************************************************************************/ void t_Lexer :: init1( char *_Mass, long _L ) { Free( Mass ); Free( Mass1 ); Free( Word ); Free( Str ); Mass=(char *)Calloc(_L,sizeof(char)); Str =(long *)Calloc( max(3,_L/2) ,sizeof(long)); // число слов надо посчитать более корректно l_Mass=_L ; memcpy( Mass,_Mass,l_Mass ); remark1( ); } /***************************************************************************/ // удалить коментарии /***************************************************************************/ void t_Lexer :: remark( void ) { long i,j,N ; char c1,c2=' ' ; register char f,c ; N=l_Mass-1 ; f=0 ; for( i=j=0 ; i