Changeset 572 in dev for trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp
- Timestamp:
- May 7, 2008, 10:12:21 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp
r571 r572 94 94 } 95 95 return *pMethod; 96 }97 98 bool UserProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){99 int i = 0;100 101 //ソースコードの位置102 this->codePos = nowLine;103 104 //パラメータ105 if(sourceOfParams[i]!='('){106 compiler.errorMessenger.Output(1,NULL,nowLine);107 return false;108 }109 if(sourceOfParams[i + 1]!=')'&& this->pParentClass ){110 //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす111 if(this->GetName()[0]=='~'){112 compiler.errorMessenger.Output(114,NULL,nowLine);113 return false;114 }115 }116 117 // カッコ内のパラメータ文字列を取得118 char parametersStr1[8192];119 char parametersStr2[8192] = "";120 i += GetStringInPare( parametersStr1, sourceOfParams + i, true );121 if( sourceOfParams[i] == '(' )122 {123 i += GetStringInPare( parametersStr2, sourceOfParams + i, true );124 }125 126 // 戻り値文字列を取得127 char returnTypeStr[VN_SIZE] = "";128 if( sourceOfParams[i] )129 {130 if( sourceOfParams[i] == 1 && sourceOfParams[i+1] == ESC_AS )131 {132 if( !this->IsFunction() ){133 // Sub/Macroの場合134 compiler.errorMessenger.Output(38,this->GetName(),nowLine);135 }136 137 lstrcpy( returnTypeStr, sourceOfParams + i + 2 );138 }139 else140 {141 compiler.errorMessenger.Output(1,NULL,nowLine);142 return false;143 }144 }145 146 Jenga::Common::Strings parameters;147 148 // パラメータ149 SplitParameter( parametersStr1, parameters );150 ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( params, parameters, nowLine );151 152 // 省略可能パラメータ(古い仕様。非推奨)153 this->secondParmNum = (int)this->params.size();154 SplitParameter( parametersStr2, parameters );155 ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( params, parameters, nowLine );156 157 158 if(returnTypeStr[0]){159 ///////////////////160 // 戻り値を取得161 ///////////////////162 163 if( !this->IsFunction() ){164 // Sub/Macroの場合165 compiler.errorMessenger.Output(38,this->GetName(),nowLine);166 }167 168 if( this->pParentClass ){169 if( this->GetName() == this->pParentClass->GetName() ||170 this->GetName()[0]=='~'){171 //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす172 compiler.errorMessenger.Output(115,NULL,nowLine);173 }174 }175 176 compiler.StringToType( returnTypeStr, this->returnType );177 if( this->returnType.IsNull() )178 {179 compiler.errorMessenger.Output(3,returnTypeStr,nowLine);180 }181 }182 else{183 if( this->IsFunction() )184 {185 // Function定義なのに、戻り値の型がセットされていない186 compiler.errorMessenger.Output(-104,this->GetName().c_str(),nowLine);187 188 this->returnType.SetBasicType( DEF_DOUBLE );189 }190 else191 {192 //戻り値なしのSub定義193 this->returnType.SetNull();194 }195 }196 197 //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)198 199 if( this->pParentClass && isStatic == false ){200 //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用201 std::string name = "_System_LocalThis";202 Type type( DEF_PTR_VOID );203 this->realParams.push_back( new Parameter( name, type ) );204 }205 206 if( this->returnType.IsStruct() ){207 //構造体を戻り値として持つ場合208 //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする209 210 std::string name = this->GetName();211 if(name[0]==1&&name[1]==ESC_OPERATOR){212 name="_System_ReturnValue";213 }214 Type type( DEF_STRUCT, this->returnType.GetIndex() );215 this->realParams.push_back( new Parameter( name, type, true ) );216 }217 218 //パラメータをコピー219 BOOST_FOREACH( Parameter *pParam, params ){220 this->realParams.push_back( new Parameter( *pParam ) );221 }222 223 return true;224 96 } 225 97 … … 383 255 384 256 //パラメータを追加 385 this-> params.push_back( pParam );257 this->GetParameters().push_back( pParam ); 386 258 387 259 if(sourceOfParams[i]==','){ … … 435 307 } 436 308 437 void DllProcs::Add(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){438 int i2;439 440 int i=0;441 442 //Sub/Function443 Procedure::Kind kind = Procedure::Sub;444 if(buffer[i]==ESC_SUB){445 }446 else if(buffer[i]==ESC_FUNCTION){447 kind = Procedure::Function;448 }449 else{450 compiler.errorMessenger.Output(1,NULL,nowLine);451 return;452 }453 i++;454 455 //プロシージャ名456 char procName[VN_SIZE];457 bool isCdecl = false;458 for(i2=0;;i++,i2++){459 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){460 isCdecl = true;461 462 i+=2;463 procName[i2]=0;464 break;465 }466 if(buffer[i]==','){467 procName[i2]=0;468 break;469 }470 if(buffer[i]=='\0'){471 compiler.errorMessenger.Output(1,NULL,nowLine);472 return;473 }474 procName[i2]=buffer[i];475 }476 i++;477 478 //ユーザー定義関数との重複チェック479 if(GetSubHash(procName)){480 compiler.errorMessenger.Output(15,procName,nowLine);481 return;482 }483 484 485 //ライブラリ486 char dllFileName[MAX_PATH];487 i = GetOneParameter( buffer, i, dllFileName );488 Type resultType;489 _int64 i64data;490 if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){491 return;492 }493 if( resultType.GetBasicType() != typeOfPtrChar ){494 compiler.errorMessenger.Output(1,NULL,nowLine);495 return;496 }497 lstrcpy( dllFileName, (char *)i64data );498 CharUpper(dllFileName);499 if(!strstr(dllFileName,".")){500 lstrcat(dllFileName,".DLL");501 if(lstrlen(dllFileName)>=16){502 compiler.errorMessenger.Output(7,NULL,nowLine);503 return;504 }505 }506 507 //エイリアス508 char alias[VN_SIZE];509 i = GetOneParameter( buffer, i, alias );510 if( alias[0] ){511 if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){512 return;513 }514 if( resultType.GetBasicType() != typeOfPtrChar ){515 compiler.errorMessenger.Output(1,NULL,nowLine);516 return;517 }518 lstrcpy( alias, (char *)i64data );519 }520 else{521 //省略されたときは関数名522 lstrcpy( alias, procName );523 }524 525 526 // オブジェクトを生成527 DllProc *pDllProc = new DllProc( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );528 529 // パラメータを解析530 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"531 pDllProc->SetParamsAndReturnType( buffer + i, nowLine );532 533 // パラメータのエラーチェック534 BOOST_FOREACH( const Parameter *pParam, pDllProc->Params() ){535 if( pParam->IsObject() ){536 compiler.errorMessenger.Output(25,pParam->GetVarName(),nowLine);537 }538 if( !pParam->IsRef() ){539 if( pParam->IsStruct() ){540 compiler.errorMessenger.Output(28,pParam->GetVarName(),nowLine);541 }542 }543 }544 545 //戻り値のエラーチェック546 if( pDllProc->IsFunction() ){547 // Function定義548 549 if( pDllProc->ReturnType().IsObject() ){550 // DLL関数ではオブジェクトを戻り値にできない551 compiler.errorMessenger.Output(40,pDllProc->GetName(),nowLine);552 }553 }554 555 // ハッシュマップに追加556 this->Put( pDllProc );557 }558 559 309 bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){ 560 310 int i = 0; … … 676 426 677 427 //パラメータを追加 678 this-> params.push_back( pParam );428 this->GetParameters().push_back( pParam ); 679 429 680 430 if(sourceOfParams[i]==','){
Note:
See TracChangeset
for help on using the changeset viewer.