Changeset 77 in dev


Ignore:
Timestamp:
Mar 22, 2007, 2:41:19 AM (18 years ago)
Author:
dai_9181
Message:

デフォルトパラメータに対応。

Files:
11 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_CallProc.cpp

    r76 r77  
    4747    ParamImpl *pobj_parameter=0;
    4848    pobj_parameter=new ParamImpl(lpszParms);
     49
     50    // デフォルト引数を適用
     51    pobj_parameter->ApplyDefaultParameters( pProcPointer->Params() );
    4952
    5053    //エラーチェック
     
    223226    pobj_parameter=new ParamImpl(temporary);
    224227
     228    // デフォルト引数を適用
     229    pobj_parameter->ApplyDefaultParameters( pUserProc->RealParams() );
     230
    225231    //エラーチェック
    226232    if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
     
    370376    pobj_parameter=new ParamImpl(lpszParms);
    371377
     378    // デフォルト引数を適用
     379    pobj_parameter->ApplyDefaultParameters( pDllProc->Params() );
     380
    372381    //エラーチェック
    373382    if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
  • BasicCompiler32/Opcode.h

    r76 r77  
    224224    UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs );
    225225
     226    void ApplyDefaultParameters( const Parameters &params );
    226227    bool ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum = -1 );
    227228    void MacroParameterSupport( const Parameters &params );
  • BasicCompiler64/Compile_CallProc.cpp

    r75 r77  
    4747    ParamImpl *pobj_parameter=0;
    4848    pobj_parameter=new ParamImpl(lpszParms);
     49
     50    // デフォルト引数を適用
     51    pobj_parameter->ApplyDefaultParameters( pProcPointer->Params() );
    4952
    5053    //エラーチェック
     
    231234    pobj_parameter=new ParamImpl(temporary);
    232235
     236    // デフォルト引数を適用
     237    pobj_parameter->ApplyDefaultParameters( pUserProc->RealParams() );
     238
    233239    //エラーチェック
    234240    if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
     
    407413    pobj_parameter=new ParamImpl(lpszParms);
    408414
     415    // デフォルト引数を適用
     416    pobj_parameter->ApplyDefaultParameters( pDllProc->Params() );
     417
    409418    //エラーチェック
    410419    if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
  • BasicCompiler64/Opcode.h

    r76 r77  
    357357    UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs );
    358358
     359    void ApplyDefaultParameters( const Parameters &params );
    359360    bool ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum = -1 );
    360361    void MacroParameterSupport( const Parameters &params );
  • BasicCompiler_Common/ParamImpl.cpp

    r75 r77  
    9393    //パラメータの個数が不一致の場合
    9494    int max = (int)targetParms.size();
    95     if(max!=ParmsNum){
     95
     96    if( ParmsNum > max ){
     97        // 実引数が駆り引数より多いとき
     98        // ※無条件で不一致
    9699        return false;
    97100    }
     
    100103    for(int i=0;i<max;i++){
    101104        Parameter &param = *targetParms[i];
     105
     106        if( i >= ParmsNum ){
     107            // 引数が多いとき
     108            if( param.GetInitValue().size() > 0 ){
     109                // 初期値が指定されているパラメータを考慮
     110                return true;
     111            }
     112            else{
     113                return false;
     114            }
     115        }
    102116
    103117        if(Parms[i]){
     
    125139            }
    126140            else if(level==OVERLOAD_LEVEL3){
    127                 if(argType.GetBasicType()==DEF_OBJECT||param.GetBasicType()==DEF_OBJECT) return 0;
     141                if(argType.GetBasicType()==DEF_OBJECT||param.GetBasicType()==DEF_OBJECT) return false;
    128142            }
    129143        }
     
    222236
    223237    return pUserProc;
     238}
     239
     240void ParamImpl::ApplyDefaultParameters( const Parameters &params ){
     241    if( ParmsNum == (int)params.size() ){
     242        // デフォルト引数の適用が不必要なとき
     243        return;
     244    }
     245
     246    while( ParmsNum < (int)params.size() ){
     247        Parameter &param = *params[ParmsNum];
     248
     249        Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,param.GetInitValue().size() + 1 );
     250        lstrcpy(Parms[ParmsNum],param.GetInitValue().c_str() );
     251        ParmsNum++;
     252    }
    224253}
    225254
  • BasicCompiler_Common/Parameter.h

    r75 r77  
    1414    int subScripts[MAX_ARRAYDIM];
    1515
     16    const string initValue;
     17
    1618public:
    17     Parameter( const string &varName, const Type &type, bool isRef = false ):
     19    Parameter( const string &varName, const Type &type, bool isRef = false, const string initValue = "" ):
    1820        Type( type ),
    1921        varName( varName ),
    2022        isRef( isRef ),
    21         isArray( false )
     23        isArray( false ),
     24        initValue( initValue )
    2225    {
    2326        subScripts[0] = -1;
     
    2730        varName( param.varName ),
    2831        isRef( param.isRef ),
    29         isArray( false )
     32        isArray( false ),
     33        initValue( param.initValue )
    3034    {
    3135        subScripts[0] = -1;
     
    5559    int *GetSubScriptsPtr(){
    5660        return subScripts;
     61    }
     62
     63    const string &GetInitValue() const
     64    {
     65        return initValue;
    5766    }
    5867
  • BasicCompiler_Common/Procedure.cpp

    r75 r77  
    8585        }
    8686
    87         //型
    8887        Type type( DEF_NON );
    89         if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     88        char initValue[8192] = "";
     89        if( sourceOfParams[i] == '=' ){
     90            i++;
     91            i = GetOneParameter( sourceOfParams, i, initValue );
     92
     93            //エラー用
     94            cp = nowLine;
     95
     96            NumOpe_GetType( initValue, Type::String(), type );
     97        }
     98        else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
    9099            i+=2;
    91100
     
    154163        }
    155164
    156         Parameter *pParam = new Parameter( name, type, isRef );
     165        Parameter *pParam = new Parameter( name, type, isRef, initValue );
    157166        if( isArray ){
    158167            pParam->SetArray( subScripts );
  • BasicCompiler_Common/StrOperation.cpp

    r49 r77  
    175175    return 0;
    176176}
    177 int GetOneParameter(char *Parameter,int pos,char *retAns){
     177int GetOneParameter(const char *Parameter,int pos,char *retAns){
    178178    int i,i2,i3,IsStr;
    179179    for(i=pos,i2=0,IsStr=0;;i++,i2++){
     
    196196            break;
    197197        }
     198
     199        if(IsCommandDelimitation(Parameter[i])&&IsStr==0
     200            || Parameter[i] == ')' && IsStr == 0 ){
     201                retAns[i2]=0;
     202                break;
     203        }
     204
    198205        retAns[i2]=Parameter[i];
    199         if(IsCommandDelimitation(Parameter[i])&&IsStr==0){
    200             retAns[i2]=0;
    201             break;
    202         }
    203206    }
    204207    return i;
  • BasicCompiler_Common/Type.cpp

    r76 r77  
    486486    return (string)"(null)";
    487487}
     488
     489Type Type::String(){
     490    extern CClass *pobj_StringClass;
     491    if( pobj_StringClass == NULL ){
     492        SetError();
     493    }
     494    return Type( DEF_OBJECT, *pobj_StringClass );
     495}
  • BasicCompiler_Common/Type.h

    r75 r77  
    122122        index = type.index;
    123123    }
     124
     125    static Type String();
    124126};
  • BasicCompiler_Common/common.h

    r76 r77  
    387387_int8 IsCommandDelimitation(char c);
    388388BOOL IsBlank(char c);
    389 int GetOneParameter(char *Parameter,int pos,char *retAns);
     389int GetOneParameter(const char *Parameter,int pos,char *retAns);
    390390int JumpOneParameter(char *Parameter,int i);
    391391int GetStringInQuotation(char *buffer,char *ReadBuffer);
Note: See TracChangeset for help on using the changeset viewer.