Ignore:
Timestamp:
May 6, 2008, 9:10:21 PM (17 years ago)
Author:
dai_9181
Message:

・LexicalAnalyzer::AnalyzeParameterの第二パラメータをstringからStringsに変更した。
・UserProc::SetParamsAndReturnTypeメソッド内で行っているパラメータ解析処理をLexicalAnalyzer::AnalyzeParameterメソッドを使用したコードに書き直した。

File:
1 edited

Legend:

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

    r568 r571  
    33using namespace ActiveBasic::Compiler;
    44
    5 bool LexicalAnalyzer::AnalyzeParameter( Parameters &params, const char *sourceOfParams, int nowLine )
     5bool LexicalAnalyzer::AnalyzeParameter( Parameters &params, const Jenga::Common::Strings &parameterStrings, int nowLine )
    66{
    77    int i2,i3,sw;
     
    99
    1010    //パラメータ
    11     int i = 0;
    12     while(1){
    13         if( sourceOfParams[i] == '\0' )
     11    BOOST_FOREACH( const std::string &paramStr, parameterStrings )
     12    {
     13        int i = 0;
     14
     15        if( paramStr[i] == '\0' )
    1416        {
    1517            break;
     
    1820        //ByRef
    1921        bool isRef;
    20         if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
     22        if(paramStr[i]==1&&paramStr[i+1]==ESC_BYVAL){
    2123            isRef = false;
    2224            i+=2;
    2325        }
    24         else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
     26        else if(paramStr[i]==1&&paramStr[i+1]==ESC_BYREF){
    2527            isRef = true;
    2628            i+=2;
     
    3436        sw=0;
    3537        for(i2=0;;i++,i2++){
    36             if(sourceOfParams[i]=='('){
     38            if(paramStr[i]=='('){
    3739                if(!sw) sw=1;
    3840
    39                 i3=GetStringInPare(name+i2,sourceOfParams+i);
     41                i3=GetStringInPare(name+i2,paramStr.c_str()+i);
    4042                i2+=i3-1;
    4143                i+=i3-1;
    4244                continue;
    4345            }
    44             if(sourceOfParams[i]=='['){
     46            if(paramStr[i]=='['){
    4547                if(!sw) sw=1;
    4648
    47                 i3=GetStringInBracket(name+i2,sourceOfParams+i);
     49                i3=GetStringInBracket(name+i2,paramStr.c_str()+i);
    4850                i2+=i3-1;
    4951                i+=i3-1;
    5052                continue;
    5153            }
    52             if(!IsVariableChar(sourceOfParams[i])){
     54            if(!IsVariableChar(paramStr[i])){
    5355                name[i2]=0;
    5456                break;
    5557            }
    56             name[i2]=sourceOfParams[i];
     58            name[i2]=paramStr[i];
    5759        }
    5860        if(sw){
     
    8183        Type type( DEF_NON );
    8284        char initValue[8192] = "";
    83         if( sourceOfParams[i] == '=' ){
     85        if( paramStr[i] == '=' ){
    8486            i++;
    85             i = GetOneParameter( sourceOfParams, i, initValue );
     87            i = GetOneParameter( paramStr.c_str(), i, initValue );
    8688
    8789            // TODO: エラー用 fix me!!!
     
    9597            }
    9698        }
    97         else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     99        else if(paramStr[i]==1&&paramStr[i+1]==ESC_AS){
    98100            // As指定
    99101            i+=2;
    100102
    101103            i2=0;
    102             while(sourceOfParams[i]=='*'){
    103                 temporary[i2]=sourceOfParams[i];
     104            while(paramStr[i]=='*'){
     105                temporary[i2]=paramStr[i];
    104106                i++;
    105107                i2++;
    106108            }
    107109            for(;;i++,i2++){
    108                 if(!IsVariableChar(sourceOfParams[i])){
    109                     if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
    110                         temporary[i2++]=sourceOfParams[i++];
    111                         temporary[i2]=sourceOfParams[i];
     110                if(!IsVariableChar(paramStr[i])){
     111                    if(paramStr[i]==1&&(paramStr[i+1]==ESC_FUNCTION||paramStr[i+1]==ESC_SUB)){
     112                        temporary[i2++]=paramStr[i++];
     113                        temporary[i2]=paramStr[i];
    112114                        continue;
    113115                    }
     
    115117                    break;
    116118                }
    117                 temporary[i2]=sourceOfParams[i];
     119                temporary[i2]=paramStr[i];
    118120            }
    119121
     
    144146        //パラメータを追加
    145147        params.push_back( pParam );
    146 
    147         if( sourceOfParams[i] == ',' )
    148         {
    149             i++;
    150             continue;
    151         }
    152         else if( sourceOfParams[i] == '\0' )
    153         {
    154             break;
    155         }
    156         else{
    157             compiler.errorMessenger.Output(1,NULL,nowLine);
    158             break;
    159         }
    160148    }
    161149
Note: See TracChangeset for help on using the changeset viewer.