Changeset 372 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Nov 23, 2007, 1:44:13 PM (17 years ago)
Author:
dai_9181
Message:

Foreachステートメントを実装中…

Location:
trunk/abdev/BasicCompiler32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r370 r372  
    568568    //レキシカルスコープをレベルアップ
    569569    compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
     570
     571    //For内をコンパイル
     572    CompileBuffer(0,COM_NEXT);
     573
     574    compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
     575
     576    if(szNextVariable[0]){
     577        if(lstrcmp(szNextVariable,variable)!=0){
     578            SetError(55,szNextVariable,cp);
     579        }
     580    }
     581
     582    //jmp ...
     583    compiler.codeGenerator.op_jmp_continue();
     584
     585    //レキシカルスコープをレベルダウン
     586    compiler.codeGenerator.lexicalScopes.End();
     587
     588    //jeジャンプ先のオフセット値
     589    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
     590
     591    //Continueアドレスを復元
     592    compiler.codeGenerator.ContinueAreaEnd();
     593}
     594
     595void OpcodeForeach( const char *Parameter )
     596{
     597    Type resultType;
     598    int i;
     599    char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
     600    bool isError = false;
     601
     602    //第1パラメータを取得
     603    i=GetOneParameter(Parameter,0,temporary);
     604    if(!Parameter[i]){
     605        SetError(12,"Foreach",cp);
     606        isError = true;
     607        goto ErrorStep;
     608    }
     609
     610    lstrcpy( variable, temporary );
     611
     612    //第2パラメータを取得(in~)
     613    i=GetOneParameter(Parameter,i,collectionVar);
     614
     615    // Resetメソッドを呼び出す
     616    sprintf( temporary, "%s.Reset()", collectionVar );
     617    Compile( temporary );
     618
     619    //Continueアドレスのバックアップとセット
     620    compiler.codeGenerator.ContinueAreaBegin();
     621
     622    // MoveNextメソッドを呼び出す
     623    sprintf( temporary, "%s.MoveNext()", collectionVar );
     624    NumOpe(temporary,Type(),Type());
     625
     626    //pop eax
     627    compiler.codeGenerator.op_pop(REG_EAX);
     628
     629    //cmp eax,0
     630    compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
     631
     632ErrorStep:
     633
     634    //je ...
     635    const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
     636
     637    //レキシカルスコープをレベルアップ
     638    compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
     639
     640    // Currentプロパティから現在の値を取得
     641    // TODO: 型指定が未完成
     642    sprintf( temporary, "%s=%s.Current As String", variable, collectionVar );
     643    Compile( temporary );
    570644
    571645    //For内をコンパイル
  • trunk/abdev/BasicCompiler32/Opcode.h

    r364 r372  
    4141
    4242//Compile.cpp
     43void Compile( const char *source );
    4344void ChangeOpcode(char *Command);
    4445void GetGlobalDataForDll(void);
     
    230231void OpcodeWhile(char *Parameter);
    231232void OpcodeFor(char *Parameter);
     233void OpcodeForeach( const char *Parameter );
    232234void OpcodeDo(char *Parameter);
    233235void OpcodeContinue(void);
  • trunk/abdev/BasicCompiler32/commandvalue.h

    r364 r372  
    1414#define COM_WHILE   0x1036
    1515#define COM_WEND    0x1037
     16#define COM_FOREACH 0x1038
    1617
    1718//データ操作
Note: See TracChangeset for help on using the changeset viewer.