Ignore:
Timestamp:
May 7, 2008, 10:12:21 AM (17 years ago)
Author:
dai_9181
Message:

ParseDllProc/SetParamsAndReturnTypeForUserProcを実装。

File:
1 edited

Legend:

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

    r571 r572  
    9494    }
    9595    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         else
    140         {
    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         else
    191         {
    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;
    22496}
    22597
     
    383255
    384256        //パラメータを追加
    385         this->params.push_back( pParam );
     257        this->GetParameters().push_back( pParam );
    386258
    387259        if(sourceOfParams[i]==','){
     
    435307}
    436308
    437 void DllProcs::Add(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){
    438     int i2;
    439 
    440     int i=0;
    441 
    442     //Sub/Function
    443     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 
    559309bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
    560310    int i = 0;
     
    676426
    677427        //パラメータを追加
    678         this->params.push_back( pParam );
     428        this->GetParameters().push_back( pParam );
    679429
    680430        if(sourceOfParams[i]==','){
Note: See TracChangeset for help on using the changeset viewer.