Ignore:
Timestamp:
May 8, 2008, 2:20:23 PM (17 years ago)
Author:
dai_9181
Message:

LexicalAnalyzer::ConstMacroToExpressionメソッドを実装。

Location:
trunk/ab5.0/abdev/BasicCompiler_Common
Files:
6 edited

Legend:

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

    r566 r578  
    537537            if( pConstMacro )
    538538            {
    539                 if( pConstMacro->GetCalcBuffer( parameter, temporary ) )
     539                if( ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, parameter, temporary ) )
    540540                {
    541541                    /////////////////////////
  • trunk/ab5.0/abdev/BasicCompiler_Common/calculation.cpp

    r485 r578  
    504504                            return false;
    505505                        }
    506                         if( !pConstMacro->GetCalcBuffer( temp2, Parms ) )
     506                        if( !ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, temp2, Parms ) )
    507507                        {
    508508                            if(enableerror) compiler.errorMessenger.Output(3,temporary,cp);
     
    12271227                        //マクロ関数の場合
    12281228                        GetStringInPare_RemovePare(temporary,Command+i2+i3+1);
    1229                         pConstMacro->GetCalcBuffer( temporary, temp2 );
     1229                        ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, temporary, temp2 );
    12301230                        return IsStrCalculation(temp2);
    12311231                    }
  • trunk/ab5.0/abdev/BasicCompiler_Common/include/Const.h

    r543 r578  
    127127        return expression;
    128128    }
    129 
    130     bool GetCalcBuffer( const char *parameterStr, char *dest ) const;
    131129};
    132130class ConstMacros : public Jenga::Common::Hashmap<ConstMacro>
  • trunk/ab5.0/abdev/BasicCompiler_Common/include/LexicalAnalyzer.h

    r573 r578  
    4242    static void AddConstEnum( Consts &consts, const NamespaceScopes &namespaceScopes, const char *buffer );
    4343    static void CollectConsts( const char *source, Consts &consts, ConstMacros &constMacros );
     44    static bool ConstMacroToExpression( const ConstMacro &constMacro, const char *parameterStr, char *dest );
    4445
    4546    // クラスを収集する
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Const.cpp

    r543 r578  
    8686}
    8787
    88 
    89 bool ConstMacro::GetCalcBuffer( const char *parameterStr, char *dest ) const
    90 {
    91     extern HANDLE hHeap;
    92     int i2,i3,i4,num;
    93     char temporary[VN_SIZE];
    94     char *pParms[MAX_PARMS];
    95     num=0;
    96     i2=0;
    97     while(1){
    98         i2=GetOneParameter(parameterStr,i2,temporary);
    99 
    100         pParms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    101         lstrcpy(pParms[num],temporary);
    102 
    103         num++;
    104         if(parameterStr[i2]=='\0') break;
    105     }
    106     if( num != this->GetParameters().size() ){
    107         extern int cp;
    108         for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
    109         compiler.errorMessenger.Output(10,GetName().c_str(),cp);
    110         lstrcpy(dest,"0");
    111         return 1;
    112     }
    113 
    114     i2=0;
    115     i4=0;
    116     while(1){
    117 
    118         //数式内の項を取得
    119         for(i3=0;;i2++,i3++){
    120             if(!IsVariableChar( this->GetExpression()[i2] )){
    121                 temporary[i3]=0;
    122                 break;
    123             }
    124             temporary[i3] = this->GetExpression()[i2];
    125         }
    126 
    127         //パラメータと照合する
    128         for( i3=0; i3<(int)this->GetParameters().size(); i3++ ){
    129             if( this->GetParameters()[i3] == temporary ) break;
    130         }
    131 
    132         if( i3 == (int)this->GetParameters().size() ){
    133             //パラメータでないとき
    134             lstrcpy(dest+i4,temporary);
    135             i4+=lstrlen(temporary);
    136         }
    137         else{
    138             //パラメータのとき
    139             lstrcpy(dest+i4,pParms[i3]);
    140             i4+=lstrlen(pParms[i3]);
    141         }
    142 
    143         //演算子をコピー
    144         for(;;i2++,i4++){
    145             if( this->GetExpression()[i2] == 1 ){
    146                 dest[i4++] = this->GetExpression()[i2++];
    147                 dest[i4] = this->GetExpression()[i2];
    148                 continue;
    149             }
    150             if(IsVariableTopChar( this->GetExpression()[i2] )) break;
    151             dest[i4] = this->GetExpression()[i2];
    152             if( this->GetExpression()[i2] == '\0' ) break;
    153         }
    154 
    155         if( this->GetExpression()[i2] == '\0' ) break;
    156     }
    157 
    158     for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
    159 
    160     return 1;
    161 }
    162 
    16388// マクロ定数を追加するための関数
    16489void ConstMacros::Add( const NamespaceScopes &namespaceScopes, const std::string &name, const char *parameterStr )
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp

    r564 r578  
    202202    compiler.GetObjectModule().meta.GetGlobalConstMacros().Iterator_Init();
    203203}
     204
     205bool LexicalAnalyzer::ConstMacroToExpression( const ConstMacro &constMacro, const char *parameterStr, char *dest )
     206{
     207    extern HANDLE hHeap;
     208    int i2,i3,i4,num;
     209    char temporary[VN_SIZE];
     210    char *pParms[MAX_PARMS];
     211    num=0;
     212    i2=0;
     213    while(1){
     214        i2=GetOneParameter(parameterStr,i2,temporary);
     215
     216        pParms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
     217        lstrcpy(pParms[num],temporary);
     218
     219        num++;
     220        if(parameterStr[i2]=='\0') break;
     221    }
     222    if( num != constMacro.GetParameters().size() ){
     223        extern int cp;
     224        for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
     225        compiler.errorMessenger.Output(10,constMacro.GetName().c_str(),cp);
     226        lstrcpy(dest,"0");
     227        return true;
     228    }
     229
     230    i2=0;
     231    i4=0;
     232    while(1){
     233
     234        //数式内の項を取得
     235        for(i3=0;;i2++,i3++){
     236            if(!IsVariableChar( constMacro.GetExpression()[i2] )){
     237                temporary[i3]=0;
     238                break;
     239            }
     240            temporary[i3] = constMacro.GetExpression()[i2];
     241        }
     242
     243        //パラメータと照合する
     244        for( i3=0; i3<(int)constMacro.GetParameters().size(); i3++ ){
     245            if( constMacro.GetParameters()[i3] == temporary ) break;
     246        }
     247
     248        if( i3 == (int)constMacro.GetParameters().size() ){
     249            //パラメータでないとき
     250            lstrcpy(dest+i4,temporary);
     251            i4+=lstrlen(temporary);
     252        }
     253        else{
     254            //パラメータのとき
     255            lstrcpy(dest+i4,pParms[i3]);
     256            i4+=lstrlen(pParms[i3]);
     257        }
     258
     259        //演算子をコピー
     260        for(;;i2++,i4++){
     261            if( constMacro.GetExpression()[i2] == 1 ){
     262                dest[i4++] = constMacro.GetExpression()[i2++];
     263                dest[i4] = constMacro.GetExpression()[i2];
     264                continue;
     265            }
     266            if(IsVariableTopChar( constMacro.GetExpression()[i2] )) break;
     267            dest[i4] = constMacro.GetExpression()[i2];
     268            if( constMacro.GetExpression()[i2] == '\0' ) break;
     269        }
     270
     271        if( constMacro.GetExpression()[i2] == '\0' ) break;
     272    }
     273
     274    for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
     275
     276    return true;
     277}
Note: See TracChangeset for help on using the changeset viewer.