Changeset 372 in dev


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

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

Location:
trunk/abdev
Files:
8 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//データ操作
  • trunk/abdev/BasicCompiler64/CommandValue.h

    r64 r372  
    1414#define COM_WHILE   0x1036
    1515#define COM_WEND    0x1037
     16#define COM_FOREACH 0x1038
    1617
    1718//データ操作
  • trunk/abdev/BasicCompiler64/Compile_Statement.cpp

    r370 r372  
    445445    //レキシカルスコープをレベルアップ
    446446    compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
     447
     448    //For内をコンパイル
     449    CompileBuffer(0,COM_NEXT);
     450
     451    compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
     452
     453    if(szNextVariable[0]){
     454        if(lstrcmp(szNextVariable,variable)!=0){
     455            SetError(55,szNextVariable,cp);
     456        }
     457    }
     458
     459    //jmp ...
     460    compiler.codeGenerator.op_jmp_continue();
     461
     462    //レキシカルスコープをレベルダウン
     463    compiler.codeGenerator.lexicalScopes.End();
     464
     465    //jeジャンプ先のオフセット値
     466    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
     467
     468    //Continueアドレスを復元
     469    compiler.codeGenerator.ContinueAreaEnd();
     470}
     471
     472void OpcodeForeach( const char *Parameter )
     473{
     474    Type resultType;
     475    int i;
     476    char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
     477    bool isError = false;
     478
     479    //第1パラメータを取得
     480    i=GetOneParameter(Parameter,0,temporary);
     481    if(!Parameter[i]){
     482        SetError(12,"Foreach",cp);
     483        isError = true;
     484        goto ErrorStep;
     485    }
     486
     487    lstrcpy( variable, temporary );
     488
     489    //第2パラメータを取得(in~)
     490    i=GetOneParameter(Parameter,i,collectionVar);
     491
     492    // Resetメソッドを呼び出す
     493    sprintf( temporary, "%s.Reset()", collectionVar );
     494    Compile( temporary );
     495
     496    //Continueアドレスのバックアップとセット
     497    compiler.codeGenerator.ContinueAreaBegin();
     498
     499    // MoveNextメソッドを呼び出す
     500    sprintf( temporary, "%s.MoveNext()", collectionVar );
     501    int reg = REG_RAX;
     502    NumOpe(&reg,temporary,Type(),resultType);
     503
     504    //cmp rax,0
     505    compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0);
     506
     507ErrorStep:
     508
     509    //je ...
     510    const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
     511
     512    //レキシカルスコープをレベルアップ
     513    compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
     514
     515    // Currentプロパティから現在の値を取得
     516    // TODO: 型指定が未完成
     517    sprintf( temporary, "%s=%s.Current As String", variable, collectionVar );
     518    Compile( temporary );
    447519
    448520    //For内をコンパイル
  • trunk/abdev/BasicCompiler64/Opcode.h

    r364 r372  
    169169
    170170//Compile.cpp
     171void Compile( const char *source );
    171172void ChangeOpcode(char *Command);
    172173void GetGlobalDataForDll(void);
     
    345346void OpcodeWhile(char *Parameter);
    346347void OpcodeFor(char *Parameter);
     348void OpcodeForeach(const char *Parameter);
    347349void OpcodeDo(char *Parameter);
    348350void OpcodeContinue(void);
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r359 r372  
    139139}
    140140
     141void Compile( const char *source )
     142{
     143    char *temporary = (char *)malloc( lstrlen( source ) + 8192 );
     144    lstrcpy( temporary, source );
     145    int backCp = cp;
     146    MakeMiddleCode( temporary );
     147    ChangeOpcode( temporary );
     148    cp = backCp;
     149    free( temporary );
     150}
     151
    141152void ChangeOpcode(char *Command){
    142153    extern HANDLE hHeap;
     
    337348        case COM_FOR:
    338349            OpcodeFor(Command+2);
     350            break;
     351        case COM_FOREACH:
     352            OpcodeForeach(Command+2);
    339353            break;
    340354        case COM_DO:
  • trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp

    r361 r372  
    451451        ComNum=COM_FOR;
    452452    }
     453    else if(lstrcmpi(com,"Foreach")==0){
     454        KillSpaces(Command+i,pam);
     455        ComNum=COM_FOREACH;
     456    }
    453457    else if(lstrcmpi(com,"Next")==0){
    454458        KillSpaces(Command+i,pam);
Note: See TracChangeset for help on using the changeset viewer.