Changeset 16 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Dec 12, 2006, 4:11:11 AM (18 years ago)
Author:
dai_9181
Message:

グローバル領域外のConst定義を初期段階で収集しないようにしました。

Location:
BasicCompiler_Common
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Compile.cpp

    r15 r16  
    4848//With情報
    4949WITHINFO WithInfo;
     50
     51
     52///////////////////////////////////////////////////
     53// 対になっているステートメントを飛び越す
     54// ※グローバル領域用
     55///////////////////////////////////////////////////
     56int JumpStatement(const char *source, int &pos){
     57    if( source[pos] != 1 ) return 0;
     58
     59    if( ! IsCommandDelimitation( source[pos - 1] ) ){
     60        //直前がコマンド区切りではない場合
     61        return 0;
     62    }
     63
     64    char cStatement = source[pos + 1];
     65
     66    char cEnd = GetEndXXXCommand( cStatement );
     67    if( cEnd == 0 ) return 0;
     68
     69    pos += 2;
     70    while( ! ( source[pos] == 1 && source[pos + 1] == cEnd ) ){
     71
     72        if( source[pos] == '\0' ){
     73            char temporary[64];
     74            GetDefaultNameFromES( cStatement, temporary );
     75            SetError( 22, temporary, pos );
     76            return -1;
     77        }
     78
     79        pos++;
     80    }
     81    if( ! ( source[pos] == '\0' || source[pos + 2] == '\0' ) ){
     82        pos += 2;
     83    }
     84
     85    return 1;
     86}
    5087
    5188
     
    392429    BufferSize=128;
    393430    Command=(char *)HeapAlloc(hHeap,0,BufferSize);
    394 /*
    395     i = CSource::obj.GetTokenIndex(cp);
    396     CToken *ptoken;
    397     do{
    398         //次のトークン
    399         ptoken = CSource::obj.GetToken(i++);
    400 
    401         //ステップ区切り(改行またはコロン)の場合
    402         while(ptoken->GetType() == TOKEN_DELIMITATION){
    403             ptoken = CSource::obj.GetToken(i++);
    404             continue;
    405         }
    406 
    407         if(ptoken->GetType() == TOKEN_ESCAPESEQUENCE){
    408             ////////////////////////////
    409             // 特殊記号
    410             ////////////////////////////
    411 
    412             if(ptoken->GetExtended() == ESC_LINENUM){
    413 
    414                 //行番号
    415                 ptoken = CSource::obj.GetToken(i++);
    416 
    417                 i3=atoi(ptoken->ToString());
    418                 i4=i+1;
    419 
    420                 //Goto先ラベル
    421                 pLabelNames=(LABEL *)HeapReAlloc(hHeap,0,pLabelNames,(MaxLabelNum+1)*sizeof(LABEL));
    422                 pLabelNames[MaxLabelNum].pName=0;
    423                 pLabelNames[MaxLabelNum].line=i3;
    424                 pLabelNames[MaxLabelNum].address=obp;
    425                 MaxLabelNum++;
    426 
    427                 //書き込みスケジュール
    428                 for(i=0;i<GotoLabelScheduleNum;i++){
    429                     if(pGotoLabelSchedule[i].pName==0&&
    430                         pGotoLabelSchedule[i].line==i3){
    431                         *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
    432 
    433                         //詰める
    434                         GotoLabelScheduleNum--;
    435                         for(i2=i;i2<GotoLabelScheduleNum;i2++){
    436                             pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
    437                             pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
    438                             pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
    439                         }
    440                         i--;
    441                     }
    442                 }
    443 
    444                 //カンマ
    445                 i++;
    446 
    447                 //次のトークン
    448                 ptoken = CSource::obj.GetToken(i++);
    449             }
    450         }
    451     }while(ptoken->GetType() == TOKEN_EOF);
    452 */
     431
    453432    for(cp++,i2=0;;cp++,i2++){
    454433        if(i2>=BufferSize){
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r15 r16  
    441441    char temp2[MAX_PATH],*temp5;
    442442
     443    extern CClass *pobj_CompilingClass;
     444    pobj_CompilingClass=0;
     445
    443446    i2=0;
    444447
  • BasicCompiler_Common/Intermediate_Step2.cpp

    r7 r16  
    237237    }
    238238}
    239 void GetConstInfo(void){
     239bool GetConstInfo(void){
    240240    ////////////////////////////////////////////
    241241    // Const命令の情報を取得
     
    251251    extern char *basbuf;
    252252    for(i=0;;i++){
    253         if(basbuf[i]=='\0') break;
    254         else if(basbuf[i]==1&&basbuf[i+1]==ESC_CONST){
    255             i+=2;
    256 
    257             extern int cp;
    258             cp=i;   //エラー用
    259 
    260 
    261             if(basbuf[i]==1&&basbuf[i+1]==ESC_ENUM){
    262                 AddConstEnum(basbuf+i);
    263                 continue;
    264             }
    265 
    266             for(i2=0;;i++,i2++){
    267                 if(basbuf[i]=='\"'){
     253        if( basbuf[i] == '\0' ) break;
     254        if( basbuf[i] == 1 ){
     255            if(basbuf[i]==1&&basbuf[i+1]==ESC_CONST){
     256                i+=2;
     257
     258                extern int cp;
     259                cp=i;   //エラー用
     260
     261
     262                if(basbuf[i]==1&&basbuf[i+1]==ESC_ENUM){
     263                    AddConstEnum(basbuf+i);
     264                    continue;
     265                }
     266
     267                for(i2=0;;i++,i2++){
     268                    if(basbuf[i]=='\"'){
     269                        temporary[i2]=basbuf[i];
     270                        for(i++,i2++;;i++,i2++){
     271                            temporary[i2]=basbuf[i];
     272                            if(basbuf[i]=='\"') break;
     273                        }
     274                        continue;
     275                    }
     276                    if(IsCommandDelimitation(basbuf[i])){
     277                        temporary[i2]=0;
     278                        break;
     279                    }
    268280                    temporary[i2]=basbuf[i];
    269                     for(i++,i2++;;i++,i2++){
    270                         temporary[i2]=basbuf[i];
    271                         if(basbuf[i]=='\"') break;
    272                     }
    273                     continue;
    274                 }
    275                 if(IsCommandDelimitation(basbuf[i])){
    276                     temporary[i2]=0;
    277                     break;
    278                 }
    279                 temporary[i2]=basbuf[i];
    280             }
    281             CDBConst::obj.Add(temporary);
    282             if(basbuf[i]=='\0') break;
    283         }
    284     }
     281                }
     282                CDBConst::obj.Add(temporary);
     283                if(basbuf[i]=='\0') break;
     284            }
     285            else{
     286                int result = JumpStatement( basbuf, i );
     287                if( result == -1 ){
     288                    //エラー
     289                    return false;
     290                }
     291                else if( result == 1 ){
     292                    //ジャンプした場合
     293                    i--;
     294                }
     295            }
     296        }
     297    }
     298    return true;
    285299}
    286300
  • BasicCompiler_Common/common.h

    r15 r16  
    471471
    472472//Intermediate_Step2.cpp
    473 void GetConstInfo(void);
     473bool GetConstInfo(void);
    474474void ChangeCommandToCode(char *buffer);
    475475
     
    575575
    576576//Compile.cpp
     577int JumpStatement(const char *source, int &pos);
    577578void DebugVariable(void);
    578579void Compile(void);
Note: See TracChangeset for help on using the changeset viewer.