Changeset 708 in dev for trunk/ab5.0


Ignore:
Timestamp:
Jul 26, 2008, 7:27:20 AM (16 years ago)
Author:
dai_9181
Message:
  • #184への対応。ByRef引数を持つデリゲートを宣言するとコンパイルできないバグを修正。
  • オーバーロード用のパラメータ比較にByRef/ByValの相違を考慮するようにした。
Location:
trunk/ab5.0/abdev
Files:
5 edited

Legend:

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

    r673 r708  
    309309        lstrcpy(Parms[ParmsNum],param.GetInitValue().c_str() );
    310310        ParmsNum++;
     311
     312        types.push_back( Type() );
    311313    }
    312314}
     
    334336
    335337        //省略パラメータに "0" を指定する
    336         for(;ParmsNum < (int)params.size();ParmsNum++){
     338        while( ParmsNum < (int)params.size() )
     339        {
    337340            extern HANDLE hHeap;
    338341            char temporary[64];
     
    341344            Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    342345            lstrcpy(Parms[ParmsNum],temporary);
     346
     347            ParmsNum++;
     348
     349            types.push_back( Type() );
    343350        }
    344351    }
  • trunk/ab5.0/abdev/BasicCompiler_Common/include/LexicalAnalyzer.h

    r632 r708  
    4848
    4949    // グローバルプロシージャを収集する
     50    static bool ExtractParameterVarNames( const char *sourceOfParams, Jenga::Common::Strings &paramVarNames, int nowLine );
    5051    static bool AnalyzeParameter( Parameters &params, const Jenga::Common::Strings &parameterStrings, int nowLine );
    5152    static bool SetParamsAndReturnTypeForUserProc( UserProc &userProc, const char *sourceOfParams, int nowLine, bool isStatic );
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp

    r692 r708  
    201201        }
    202202
    203         values.insert( std::map<std::string,std::string>::value_type( "#params#", dg.GetParamStr() ) );
     203        // 呼び出し側の実引数文字列を作成
     204        Jenga::Common::Strings paramVarNames;
     205        LexicalAnalyzer::ExtractParameterVarNames( dg.GetParamStr().c_str(), paramVarNames, dg.GetSourceIndex() );
     206        std::string tempParamStrForCall;
     207        BOOST_FOREACH( const std::string &varName, paramVarNames )
     208        {
     209            if( !tempParamStrForCall.empty() )
     210            {
     211                tempParamStrForCall += ",";
     212            }
     213            tempParamStrForCall += varName;
     214        }
     215        values.insert( std::map<std::string,std::string>::value_type( "#params#", tempParamStrForCall ) );
    204216
    205217        destSource += sourceTemplate.GetResult( values );
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp

    r671 r708  
    22
    33using namespace ActiveBasic::Compiler;
     4
     5bool LexicalAnalyzer::ExtractParameterVarNames( const char *sourceOfParams, Jenga::Common::Strings &paramVarNames, int nowLine )
     6{
     7    int i = 0;
     8    int i2,i3,sw;
     9    char temporary[8192],temp2[VN_SIZE];
     10
     11    while(1){
     12        if(sourceOfParams[i]=='\0') break;
     13
     14        //ByRef
     15        bool isRef;
     16        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
     17            isRef = false;
     18            i+=2;
     19        }
     20        else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
     21            isRef = true;
     22            i+=2;
     23        }
     24        else isRef = false;
     25
     26        //パラメータ名
     27        bool isArray = false;
     28        Subscripts subscripts;
     29        char name[VN_SIZE];
     30        sw=0;
     31        for(i2=0;;i++,i2++){
     32            if(sourceOfParams[i]=='('){
     33                if(!sw) sw=1;
     34
     35                i3=GetStringInPare(name+i2,sourceOfParams+i);
     36                i2+=i3-1;
     37                i+=i3-1;
     38                continue;
     39            }
     40            if(sourceOfParams[i]=='['){
     41                if(!sw) sw=1;
     42
     43                i3=GetStringInBracket(name+i2,sourceOfParams+i);
     44                i2+=i3-1;
     45                i+=i3-1;
     46                continue;
     47            }
     48            if(!IsVariableChar(sourceOfParams[i])){
     49                name[i2]=0;
     50                break;
     51            }
     52            name[i2]=sourceOfParams[i];
     53        }
     54        if(sw){
     55            //配列パラメータ
     56            if( isRef == false ) compiler.errorMessenger.Output(29,NULL,nowLine);
     57            isArray = true;
     58
     59            if((name[i2-2]=='('&&name[i2-1]==')')||
     60                (name[i2-2]=='['&&name[i2-1]==']'))
     61            {
     62                subscripts.push_back( LONG_MAX );
     63
     64                name[i2-2]=0;
     65            }
     66            else{
     67                GetArrange(name,temp2,subscripts);
     68                lstrcpy(name,temp2);
     69            }
     70
     71            i2=lstrlen(name);
     72        }
     73
     74        paramVarNames.push_back( name );
     75
     76        //型
     77        Type type( DEF_NON );
     78        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS)
     79        {
     80            i+=2;
     81
     82            i2=0;
     83            while(sourceOfParams[i]=='*'){
     84                temporary[i2]=sourceOfParams[i];
     85                i++;
     86                i2++;
     87            }
     88            for(;;i++,i2++){
     89                if(!IsVariableChar(sourceOfParams[i], true)){
     90                    if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
     91                        temporary[i2++]=sourceOfParams[i++];
     92                        temporary[i2]=sourceOfParams[i];
     93                        continue;
     94                    }
     95                    temporary[i2]=0;
     96                    break;
     97                }
     98                temporary[i2]=sourceOfParams[i];
     99            }
     100        }
     101
     102        if(sourceOfParams[i]==','){
     103            i++;
     104            continue;
     105        }
     106        else if(sourceOfParams[i]=='\0') break;
     107        else{
     108            compiler.errorMessenger.Output(1,NULL,nowLine);
     109            break;
     110        }
     111    }
     112
     113    return true;
     114}
    4115
    5116bool LexicalAnalyzer::AnalyzeParameter( Parameters &params, const Jenga::Common::Strings &parameterStrings, int nowLine )
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Parameter.cpp

    r632 r708  
    4040bool Parameter::Equals( const Parameter &param, bool isContravariant ) const
    4141{
    42     if( Type::Equals( param ) )
     42    if( Type::Equals( param ) && this->isRef == param.isRef )
    4343    {
    4444        return true;
     
    6464    {
    6565        // 反変引数を許可する
    66         if( this->IsContravariant( param ) )
     66        if( this->IsContravariant( param ) && this->isRef == param.isRef )
    6767        {
    6868            // 反変引数だったとき
Note: See TracChangeset for help on using the changeset viewer.