Changeset 296 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Aug 23, 2007, 3:20:12 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r288 r296  
    3131// トークンを取得
    3232///////////////////////////////////////////////////
    33 void GetIdentifierToken( char *token, const char *source, int &pos ){
     33void GetIdentifierToken( char *token, const char *source, int &pos )
     34{
    3435    for( int i=0; ; i++, pos++ ){
    3536        if( ! IsVariableChar( source[pos] ) ){
     
    3940        token[i] = source[pos];
    4041    }
     42}
     43void GetCommandToken( char *token, const char *source, int &pos )
     44{
     45    for( int i=0; ; i++, pos++ ){
     46        if( IsCommandDelimitation( source[pos] ) ){
     47            token[i] = 0;
     48            break;
     49        }
     50        token[i] = source[pos];
     51    }
     52}
     53
     54
     55///////////////////////////////////////////////////
     56// ジェネリクスのクラス型記述を分析
     57///////////////////////////////////////////////////
     58void SplitGenericClassInstance( const char *fullName, char *className, std::vector<std::string> &typeParameters )
     59{
     60    int i = 0;
     61    typeParameters.clear();
     62
     63    //クラス名を取得
     64    GetIdentifierToken( className, fullName, i );
     65
     66
     67    /////////////////////////////////////////////////////////
     68    // ☆★☆ ジェネリクスサポート ☆★☆
     69    if( fullName[i] == '<' )
     70    {
     71        while( true )
     72        {
     73            i++;
     74
     75            // 型パラメータを取得
     76            char temporary[VN_SIZE];
     77            GetIdentifierToken( temporary, fullName, i );
     78            if( temporary[0] == '\0' )
     79            {
     80                extern int cp;
     81                SetError(1,NULL,cp);
     82            }
     83
     84            typeParameters.push_back( temporary );
     85
     86            if( fullName[i] == ',' )
     87            {
     88                continue;
     89            }
     90            else if( fullName[i] == '>' )
     91            {
     92                break;
     93            }
     94            else
     95            {
     96                extern int cp;
     97                SetError(1,NULL,cp);
     98            }
     99        }
     100    }
     101    /////////////////////////////////////////////////////////
    41102}
    42103
  • trunk/abdev/BasicCompiler_Common/common.h

    r292 r296  
    374374//Compile.cpp
    375375void GetIdentifierToken( char *token, const char *source, int &pos );
     376void GetCommandToken( char *token, const char *source, int &pos );
     377void SplitGenericClassInstance( const char *fullName, char *className, std::vector<std::string> &typeParameters );
    376378int JumpStatement(const char *source, int &pos);
    377379void DebugVariable(void);
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r290 r296  
    12591259
    12601260            //クラス名を取得
    1261             GetIdentifierToken( temporary, basbuf, i );
    1262 
    1263             CClass *pobj_c =  const_cast<CClass *>( this->Find(namespaceScopes, temporary) );
     1261            GetCommandToken( temporary, basbuf, i );
     1262
     1263            char className[VN_SIZE];
     1264            std::vector<std::string> typeParameters;
     1265            SplitGenericClassInstance( temporary, className, typeParameters );
     1266
     1267            CClass *pobj_c =  const_cast<CClass *>( this->Find(namespaceScopes, className) );
    12641268            if(!pobj_c) continue;
    12651269
     
    12811285            /////////////////////////////////////////////////////////
    12821286            // ☆★☆ ジェネリクスサポート ☆★☆
    1283             if( basbuf[i] == '<' )
     1287            BOOST_FOREACH( const std::string &typeParameter, typeParameters )
    12841288            {
    1285                 // 型パラメータを取得
    1286                 i++;
    1287                 GetIdentifierToken( temporary, basbuf, i );
    1288 
    1289                 pobj_c->AddFormalGenericType( GenericType( temporary, Type(DEF_OBJECT,*GetObjectClassPtr()) ) );
    1290 
    1291                 if( basbuf[i] == '>' )
    1292                 {
    1293                     i++;
    1294                 }
    1295                 else
    1296                 {
    1297                     SetError();
    1298                 }
     1289                pobj_c->AddFormalGenericType( GenericType( typeParameter, Type(DEF_OBJECT,*GetObjectClassPtr()) ) );
    12991290            }
    13001291            /////////////////////////////////////////////////////////
     
    13301321                    isInherits = true;
    13311322
    1332                     for(i+=3,i2=0;;i++,i2++){
    1333                         if(IsCommandDelimitation(basbuf[i])){
    1334                             temporary[i2]=0;
    1335                             break;
    1336                         }
    1337                         temporary[i2]=basbuf[i];
    1338                     }
     1323                    i += 3;
     1324                    GetCommandToken( temporary, basbuf, i );
    13391325
    13401326                    if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
Note: See TracChangeset for help on using the changeset viewer.