Ignore:
Timestamp:
Apr 30, 2008, 8:04:04 PM (16 years ago)
Author:
dai_9181
Message:

幾つかの構文解析系の処理をLexicalAnalyzerに実装し直した

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Class_Collect.cpp

    r507 r511  
    1111#include "../../compiler_x86/opcode.h"
    1212#endif
     13
     14using namespace ActiveBasic::Compiler;
    1315
    1416
     
    7072CLoopRefCheck *pobj_LoopRefCheck;
    7173
    72 
    73 void Classes::CollectClassesForNameOnly( const BasicSource &source )
    74 {
    75     int i, i2;
    76     char temporary[VN_SIZE];
    77 
    78     // 名前空間管理
    79     NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
    80     namespaceScopes.clear();
    81 
    82     // Importsされた名前空間の管理
    83     NamespaceScopesCollection &importedNamespaces = compiler.GetNamespaceSupporter().GetImportedNamespaces();
    84     importedNamespaces.clear();
    85 
    86     for(i=0;;i++){
    87         if(source[i]=='\0') break;
    88 
    89         if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
    90             for(i+=2,i2=0;;i2++,i++){
    91                 if( IsCommandDelimitation( source[i] ) ){
    92                     temporary[i2]=0;
    93                     break;
    94                 }
    95                 temporary[i2]=source[i];
    96             }
    97             namespaceScopes.push_back( temporary );
    98 
    99             continue;
    100         }
    101         else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
    102             if( namespaceScopes.size() <= 0 ){
    103                 compiler.errorMessenger.Output(12, "End Namespace", i );
    104             }
    105             else{
    106                 namespaceScopes.pop_back();
    107             }
    108 
    109             i += 2;
    110             continue;
    111         }
    112         else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){
    113             for(i+=2,i2=0;;i2++,i++){
    114                 if( IsCommandDelimitation( source[i] ) ){
    115                     temporary[i2]=0;
    116                     break;
    117                 }
    118                 temporary[i2]=source[i];
    119             }
    120             if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
    121             {
    122                 compiler.errorMessenger.Output(64,temporary,i );
    123             }
    124 
    125             continue;
    126         }
    127         else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
    128             importedNamespaces.clear();
    129             continue;
    130         }
    131 
    132         if(source[i]==1&&(
    133             source[i+1]==ESC_CLASS||
    134             source[i+1]==ESC_TYPE||
    135             source[i+1]==ESC_INTERFACE
    136             ))
    137         {
    138             int nowLine = i;
    139             i += 2;
    140 
    141             Type blittableType;
    142             if(memicmp(source.GetBuffer()+i,"Align(",6)==0){
    143                 //アラインメント修飾子
    144                 i+=6;
    145                 i=JumpStringInPare(source.GetBuffer(),i)+1;
    146             }
    147             else if( memicmp( source.GetBuffer() + i, "Blittable(", 10 ) == 0 ){
    148                 // Blittable修飾子
    149                 i+=10;
    150                 i+=GetStringInPare_RemovePare(temporary,source.GetBuffer()+i)+1;
    151                 compiler.StringToType( temporary, blittableType );
    152             }
    153 
    154             bool isEnum = false;
    155             bool isDelegate = false;
    156             if( source[i] == 1 && source[i+1] == ESC_ENUM ){
    157                 // 列挙型の場合
    158                 isEnum = true;
    159 
    160                 i += 2;
    161             }
    162             else if( source[i] == 1 && source[i+1] == ESC_DELEGATE )
    163             {
    164                 // デリゲートの場合
    165                 isDelegate = true;
    166 
    167                 i += 2;
    168             }
    169 
    170             for(i2=0;;i++,i2++){
    171                 if(!IsVariableChar(source[i])){
    172                     temporary[i2]=0;
    173                     break;
    174                 }
    175                 temporary[i2]=source[i];
    176             }
    177 
    178             //クラスを追加
    179             CClass *pClass = this->Add(namespaceScopes, importedNamespaces, temporary,nowLine);
    180             if( pClass ){
    181                 if( source[nowLine+1] == ESC_CLASS ){
    182                     if( isEnum )
    183                     {
    184                         pClass->SetClassType( CClass::Enum );
    185                     }
    186                     else if( isDelegate )
    187                     {
    188                         pClass->SetClassType( CClass::Delegate );
    189                     }
    190                     else{
    191                         pClass->SetClassType( CClass::Class );
    192                     }
    193                 }
    194                 else if( source[nowLine+1] == ESC_INTERFACE ){
    195                     pClass->SetClassType( CClass::Interface );
    196                 }
    197                 else{
    198                     pClass->SetClassType( CClass::Structure );
    199                 }
    200             }
    201 
    202             // Blittable型の場合
    203             if( !blittableType.IsNull() ){
    204                 pClass->SetBlittableType( blittableType );
    205 
    206                 // Blittable型として登録
    207                 compiler.GetObjectModule().meta.GetBlittableTypes().push_back( BlittableType( blittableType, pClass ) );
    208             }
    209         }
    210     }
    211 }
    212 
    213 bool Classes::MemberVar_LoopRefCheck(const CClass &objClass){
     74bool MemberVar_LoopRefCheck(const CClass &objClass){
    21475    if( objClass.HasSuperClass() )
    21576    {
     
    246107}
    247108
    248 void Classes::GetClass_recur(const char *lpszInheritsClass){
     109void LexicalAnalyzer::AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
     110    bool isVirtual, bool isOverride, const char *interfaceName, bool isAutoGeneration, int nowLine)
     111{
     112    if( isAutoGeneration )
     113    {
     114        // コード自動生成
     115        pUserProc->ThisIsAutoGenerationProc();
     116    }
     117
     118
     119    ////////////////////////////////////////////////////////////
     120    // コンストラクタ、デストラクタの場合の処理
     121    ////////////////////////////////////////////////////////////
     122    BOOL fConstructor=0,bDestructor=0;
     123
     124    if( pUserProc->GetName() == pobj_c->GetName() ){
     125        //コンストラクタの場合
     126
     127        //標準コンストラクタ(引数なし)
     128        if(pUserProc->Params().size()==0) fConstructor=1;
     129
     130        //強制的にConst修飾子をつける
     131        isConst = true;
     132    }
     133    else if(pUserProc->GetName()[0]=='~'){
     134        //デストラクタの場合はその名前が正しいかチェックを行う
     135        if(lstrcmp(pUserProc->GetName().c_str()+1,pobj_c->GetName().c_str())!=0)
     136            compiler.errorMessenger.Output(117,NULL,nowLine);
     137        else
     138            bDestructor=1;
     139    }
     140    if(fConstructor||bDestructor){
     141        // コンストラクタ、デストラクタのアクセシビリティをチェック
     142
     143        //強制的にConst修飾子をつける
     144        isConst = true;
     145    }
     146
     147    if( fConstructor == 1 )
     148        pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
     149    else if( bDestructor )
     150        pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
     151
     152
     153
     154    //////////////////
     155    // 重複チェック
     156    //////////////////
     157
     158    if(pobj_c->DupliCheckMember( pUserProc->GetName().c_str() )){
     159        compiler.errorMessenger.Output(15,pUserProc->GetName(),nowLine);
     160        return;
     161    }
     162
     163    //メソッド
     164    BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
     165    {
     166        //基底クラスと重複する場合はオーバーライドを行う
     167        if( pMethod->GetInheritsClassPtr() ) continue;
     168
     169        if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
     170        {
     171            //関数名、パラメータ、戻り値が合致したとき
     172            compiler.errorMessenger.Output(15,pUserProc->GetName().c_str(),nowLine);
     173            return;
     174        }
     175    }
     176
     177    //仮想関数の場合
     178    if( isAbstract ) pUserProc->CompleteCompile();
     179
     180    // メソッドのオーバーライド
     181    CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
     182    if( pMethodForOverride )
     183    {
     184        pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     185        pUserProc->SetMethod( pMethodForOverride );
     186        return;
     187    }
     188    else
     189    {
     190        // インターフェイス メソッドのオーバーライド
     191        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
     192        {
     193            if( interfaceName[0] )
     194            {
     195                if( pInterface->GetClass().GetName() != interfaceName )
     196                {
     197                    // 指定されたインターフェイス名と整合しないとき
     198                    continue;
     199                }
     200            }
     201
     202            if( !pInterface->GetClass().IsReady() ){
     203                // インターフェイスが未解析のとき
     204                LexicalAnalyzer::LookaheadClass(
     205                    pInterface->GetClass().GetName().c_str(),
     206                    compiler.GetObjectModule().meta.GetClasses()
     207                );
     208            }
     209
     210            CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
     211            if( pMethodForOverride )
     212            {
     213                pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     214                pUserProc->SetMethod( pMethodForOverride );
     215                return;
     216            }
     217        }
     218    }
     219
     220    if( interfaceName[0] )
     221    {
     222        compiler.errorMessenger.Output(139,interfaceName,nowLine);
     223    }
     224
     225    if( isVirtual ){
     226        pobj_c->AddVtblNum( 1 );
     227    }
     228
     229    if( isOverride ){
     230        compiler.errorMessenger.Output(12,"Override",nowLine);
     231    }
     232
     233    if(bStatic){
     234        pobj_c->GetStaticMethods().AddStatic( pUserProc, accessibility );
     235    }
     236    else{
     237        pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);
     238    }
     239}
     240
     241bool LexicalAnalyzer::Inherits( CClass &currentClass, const char *inheritNames, int nowLine ){
     242    int i = 0;
     243    bool isInheritsClass = false;
     244    while( true ){
     245
     246        char temporary[VN_SIZE];
     247        for( int i2=0;; i++, i2++ ){
     248            if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
     249                temporary[i2] = 0;
     250                break;
     251            }
     252            temporary[i2] = inheritNames[i];
     253        }
     254
     255        // ジェネリクス構文を分解
     256        char className[VN_SIZE];
     257        Jenga::Common::Strings typeParameterStrings;
     258        SplitGenericClassInstance( temporary, className, typeParameterStrings );
     259
     260        // 型パラメータ文字列から型データを取得
     261        Types actualTypeParameters;
     262        BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
     263        {
     264            Type type;
     265            compiler.StringToType( typeParameterStr, type );
     266            actualTypeParameters.push_back( type );
     267        }
     268
     269        //継承元クラスを取得
     270        const CClass *pInheritsClass = compiler.GetObjectModule().meta.GetClasses().Find(className);
     271        if( !pInheritsClass ){
     272            compiler.errorMessenger.Output(106,className,nowLine);
     273            return false;
     274        }
     275
     276        if( pInheritsClass->IsClass() ){
     277            // クラスを継承する
     278            isInheritsClass = true;
     279
     280            //ループ継承でないかをチェック
     281            if( !LexicalAnalyzer::LoopRefCheck(*pInheritsClass) )
     282            {
     283                compiler.errorMessenger.Output(123,pInheritsClass->GetName(),nowLine);
     284                return false;
     285            }
     286
     287            if( !pInheritsClass->IsReady() ){
     288                //継承先が読み取られていないとき
     289                LexicalAnalyzer::LookaheadClass(
     290                    pInheritsClass->GetName().c_str(),
     291                    compiler.GetObjectModule().meta.GetClasses()
     292                );
     293            }
     294
     295            if( !currentClass.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
     296                return false;
     297            }
     298        }
     299        else{
     300            compiler.errorMessenger.Output(135,pInheritsClass->GetFullName().c_str(),nowLine);
     301            return false;
     302        }
     303
     304        if( inheritNames[i] == '\0' ){
     305            break;
     306        }
     307        i++;
     308    }
     309
     310    if( !isInheritsClass ){
     311        const CClass *pObjectClass = compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr();
     312        //ループ継承でないかをチェック
     313        if( !LexicalAnalyzer::LoopRefCheck( *pObjectClass ) )
     314        {
     315            compiler.errorMessenger.Output(123,pObjectClass->GetName(),nowLine);
     316            return false;
     317        }
     318
     319        if( !pObjectClass->IsReady() ){
     320            //継承先が読み取られていないとき
     321            LexicalAnalyzer::LookaheadClass(
     322                pObjectClass->GetName().c_str(),
     323                compiler.GetObjectModule().meta.GetClasses()
     324            );
     325        }
     326
     327        // クラスを一つも継承していないとき
     328        if( !currentClass.InheritsClass( *pObjectClass, Types(), nowLine ) ){
     329            return false;
     330        }
     331    }
     332
     333    return true;
     334}
     335
     336bool LexicalAnalyzer::Implements( CClass &currentClass, const char *interfaceNames, int nowLine )
     337{
     338    Jenga::Common::Strings paramStrs;
     339    SplitParameter( interfaceNames, paramStrs );
     340   
     341    BOOST_FOREACH( const std::string &paramStr, paramStrs )
     342    {
     343        char className[VN_SIZE];
     344        Jenga::Common::Strings typeParameterStrings;
     345        SplitGenericClassInstance( paramStr.c_str(), className, typeParameterStrings );
     346
     347        Types actualTypeParameters;
     348        BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
     349        {
     350            Type type;
     351            compiler.StringToType( typeParameterStr, type );
     352            actualTypeParameters.push_back( type );
     353        }
     354
     355        //継承元クラスを取得
     356        const CClass *pInterfaceClass = compiler.GetObjectModule().meta.GetClasses().Find( className );
     357        if( !pInterfaceClass ){
     358            compiler.errorMessenger.Output(106,paramStr.c_str(),nowLine);
     359            continue;
     360        }
     361
     362        if( !pInterfaceClass->IsReady() ){
     363            // インターフェイスが未解析のとき
     364            LexicalAnalyzer::LookaheadClass(
     365                pInterfaceClass->GetName().c_str(),
     366                compiler.GetObjectModule().meta.GetClasses()
     367            );
     368        }
     369
     370        // インターフェイスを継承する
     371        currentClass.Implements( *pInterfaceClass, actualTypeParameters, nowLine );
     372    }
     373
     374    return true;
     375}
     376
     377void GetClass_recur( const char *lpszInheritsClass, Classes &classes )
     378{
    249379    extern char *basbuf;
    250380    int i,i2,i3,sub_address,top_pos;
     
    331461            SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
    332462
    333             CClass *pobj_c = const_cast<CClass *>( this->Find(namespaceScopes, className) );
     463            CClass *pobj_c = const_cast<CClass *>( classes.Find(namespaceScopes, className) );
    334464            if(!pobj_c) continue;
    335465
     
    352482            for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
    353483            {
    354                 Type baseType( DEF_OBJECT, *GetObjectClassPtr() );
     484                Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
    355485                if( typeParameterBaseClassNames[i2].size() )
    356486                {
     
    398528
    399529                //継承元クラスを取得
    400                 const Classes &classes = *this;
    401530                const CClass *pInheritsClass = classes.Find(temporary);
    402531                if( !pInheritsClass ){
    403532                    compiler.errorMessenger.Output(106,temporary,i);
     533                    goto Interface_InheritsError;
     534                }
     535
     536                //ループ継承でないかをチェック
     537                if( !LexicalAnalyzer::LoopRefCheck( *pInheritsClass ) )
     538                {
     539                    compiler.errorMessenger.Output(123,pInheritsClass->GetName(),i);
    404540                    goto Interface_InheritsError;
    405541                }
     
    469605                }
    470606
    471                 //メンバ関数を追加
    472                 pobj_c->AddMethod(pobj_c,
    473                     Prototype::Public,  //Publicアクセス権
    474                     0,                  // bStatic
    475                     false,              // isConst
    476                     true,               // isAbstract
    477                     true,               // isVirtual
    478                     false,              // isOverride
    479                     false,              // isAutoGeneration
    480                     temporary,
    481                     sub_address
    482                     );
     607                //関数ハッシュへ登録
     608                char interfaceName[VN_SIZE] = "";
     609                UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,true,pobj_c, false, interfaceName );
     610                if( pUserProc )
     611                {
     612                    compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i );
     613
     614                    //メンバ関数を追加
     615                    LexicalAnalyzer::AddMethod(pobj_c,
     616                        pUserProc,
     617                        Prototype::Public,  //Publicアクセス権
     618                        0,                  // bStatic
     619                        false,              // isConst
     620                        true,               // isAbstract
     621                        true,               // isVirtual
     622                        false,              // isOverride
     623                        interfaceName,
     624                        false,              // isAutoGeneration
     625                        sub_address
     626                        );
     627                }
    483628            }
    484629        }
     
    540685            SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
    541686
    542             CClass *pobj_c =  const_cast<CClass *>( this->Find(namespaceScopes, className) );
     687            CClass *pobj_c =  const_cast<CClass *>( classes.Find(namespaceScopes, className) );
    543688            if(!pobj_c) continue;
    544689
     
    552697            }
    553698
     699            if( lstrcmp(className,"Control")==0)
     700            {
     701                int test=0;
     702            }
     703
    554704            if(pobj_c->IsReady()){
    555705                //既に先読みされているとき
     
    562712            for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
    563713            {
    564                 Type baseType( DEF_OBJECT, *GetObjectClassPtr() );
     714                Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
    565715                if( typeParameterBaseClassNames[i2].size() )
    566716                {
     
    624774                    lstrcpy( temporary, "Object" );
    625775                }
    626                 pobj_c->Inherits( temporary, i );
     776                LexicalAnalyzer::Inherits( *pobj_c, temporary, i );
    627777
    628778                if( basbuf[i+1] == 1 && basbuf[i+2] == ESC_IMPLEMENTS )
     
    632782                    GetCommandToken( temporary, basbuf, i );
    633783
    634                     pobj_c->Implements( temporary, i );
     784                    LexicalAnalyzer::Implements( *pobj_c, temporary, i );
    635785                }
    636786            }
     
    761911                            if( !pobj_c->GetDynamicMembers().back()->GetType().GetClass().IsReady() ){
    762912                                //参照先が読み取られていないとき
    763                                 GetClass_recur(pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str());
     913                                GetClass_recur( pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str(), classes );
    764914                            }
    765915                        }
     
    779929                }
    780930                else{
    781                     //メソッドを追加
    782                     cp=i;   //エラー用
    783                     pobj_c->AddMethod(pobj_c,
    784                         accessibility,
    785                         bStatic,
    786                         isConst,
    787                         isAbstract,
    788                         isVirtual,
    789                         isOverride,
    790                         false,
    791                         temporary,
    792                         sub_address);
     931                    //関数ハッシュへ登録
     932                    char interfaceName[VN_SIZE] = "";
     933                    UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,isVirtual,pobj_c, (bStatic!=0), interfaceName );
     934                    if( pUserProc )
     935                    {
     936                        compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i );
     937
     938                        //メソッドを追加
     939                        cp=i;   //エラー用
     940                        LexicalAnalyzer::AddMethod(pobj_c,
     941                            pUserProc,
     942                            accessibility,
     943                            bStatic,
     944                            isConst,
     945                            isAbstract,
     946                            isVirtual,
     947                            isOverride,
     948                            interfaceName,
     949                            false,
     950                            sub_address);
     951                    }
    793952
    794953                    if( isAbstract ) continue;
     
    831990}
    832991
    833 void Classes::LookaheadClass( const char *className )
     992void LexicalAnalyzer::LookaheadClass( const char *className, Classes &classes )
    834993{
    835994    pobj_LoopRefCheck->add( className );
    836     compiler.GetObjectModule().meta.GetClasses().GetClass_recur( className );
     995    GetClass_recur( className, classes );
    837996    pobj_LoopRefCheck->del( className );
    838997}
    839998
    840 bool Classes::LoopRefCheck( const CClass &objClass )
     999bool LexicalAnalyzer::LoopRefCheck( const CClass &objClass )
    8411000{
    8421001    if( pobj_LoopRefCheck->check( objClass ) )
     
    8481007}
    8491008
    850 void Classes::GetAllClassInfo(void){
     1009void LexicalAnalyzer::CollectClasses( const char *source, Classes &classes ){
    8511010    //ループ継承チェック用のクラス
    8521011    pobj_LoopRefCheck=new CLoopRefCheck();
    8531012
    8541013    //クラスを取得
    855     GetClass_recur(0);
     1014    GetClass_recur( 0, classes );
    8561015
    8571016    delete pobj_LoopRefCheck;
     
    8591018
    8601019    // イテレータの準備
    861     this->Iterator_Init();
     1020    classes.Iterator_Init();
    8621021}
Note: See TracChangeset for help on using the changeset viewer.