abc プロジェクト
21.12. Pass1 関数説明

関数名 Pass1
定義ファイル名pass1.cpp
定義行 50
宣言形式 void Pass1 ( AnsiString SrcFileName , TList * TokenList )
概要 トークンリストを生成する。
生成したトークンは、TokenListに追加される。
戻り値 なし
パラメタ説明 SrcFileName ソースファイル名
TokenList 生成したトークンの格納先
機能説明
備考

呼出し元関数一覧表
名称 定義ファイル名 定義行
1 TMainF::FormActivate main.cpp 299

呼出し先関数一覧表
名称 定義ファイル名 定義行
1 TMainF::err main.cpp 271
2 Add

3 AnsiString

4 Delete

5 IntToStr

6 Last

7 printf

8 Read

9 strchr

参照外部変数一覧表
名称 定義ファイル名 定義行
1 CurLineNo pass1.cpp 27
2 CurPos pass1.cpp 28
3 MainF main.cpp 26
4 TokSepChar pass1.cpp 25

参照先一覧表
名称 種別 定義ファイル名 定義行
1 TToken クラス pass1.h 216

関数論理チャート

        |  +------------------------------------------------------+ 
    50  +--+ void Pass1(AnsiString SrcFileName,TList *TokenList)  | 
    51     | {                                                    | 
           +--+---------------------------------------------------+ 
    52        +--- int pos,size;
    53        +--- TFileStream *Stream;
    54        +--- char c,cBuff[1024],TokBuff[1024];
    55        +--- int cBuffPos = 0;
    56        +--- int TokBuffPos = 0;
    57        +--- AnsiString TokStr;
    58        +--- AnsiString s;
    59        |    
    60        +--- Stream = new TFileStream(SrcFileName,fmOpenRead);
    61        +--- size = Stream->Size;
    62        +--- CurLineNo = 1;
    63        +--- CurPos = 0;
    64        |    
              |  +------------------------------------+ 
    65        +--+ for(pos = 0 ; pos < size ; pos++){ | 
              |  +--+---------------------------------+ 
    66        |     +--- Stream->Read(&c,sizeof(c));
    67        |     +--- //      if(c == '/* TODO :  */:'){
    68        |     |    //          MainF->print(IntToStr(pos)); 
    69        |     |    //      }                                
    70        |     |                                             
              |     |  +----------------------------------------------------------------------+ 
    71        |     +--+ if(c == '\t'){ // もし、TABが入っていたら、Err,スペース1つにする。  | 
              |     |  +--+-------------------------------------------------------------------+ 
    72        |     |     +--- // TABの部分を [TAB]に変えた1行を表示したい。
    73        |     |     +--- cBuff[cBuffPos++] = '[';
    74        |     |     +--- cBuff[cBuffPos++] = 'T';
    75        |     |     +--- cBuff[cBuffPos++] = 'A';
    76        |     |     +--- cBuff[cBuffPos++] = 'B';
    77        |     |     +--- cBuff[cBuffPos++] = ']';
              |     |     |  +------------------------------------+ 
    78        |     |     +--+ while((c != '\n')&&(pos < size)){  | 
              |     |     |  +--+---------------------------------+ 
    79        |     |     |     +--- Stream->Read(&c,sizeof(c));
              |     |     |     |  +----------------+ 
    80        |     |     |     +--+ if(c == '\t'){ | 
              |     |     |     |  +--+-------------+ 
    81        |     |     |     |     +--- cBuff[cBuffPos++] = '[';
    82        |     |     |     |     +--- cBuff[cBuffPos++] = 'T';
    83        |     |     |     |     +--- cBuff[cBuffPos++] = 'A';
    84        |     |     |     |     +--- cBuff[cBuffPos++] = 'B';
    85        |     |     |     |     +--- cBuff[cBuffPos++] = ']';
              |     |     |     |   +-+---+ 
    86        |     |     |     |   |  }  | 
              |     |     |     |   +-+---+ 
              |     |     |     |   +-+-------+ 
    86        |     |     |     |   |  else{  | 
              |     |     |     |   +-+-------+ 
    87        |     |     |     |     +--- cBuff[cBuffPos++] = c;
              |     |     |     |   +-+---+ 
    88        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
    89        |     |     |     +--- pos++;
              |     |     |   +-+---+ 
    90        |     |     |   |  }  | 
              |     |     |   +-----+ 
    91        |     |     +--- cBuff[cBuffPos++] = '\0';
    92        |     |     +--- MainF->err("TAB文字が含まれています。");
    93        |     |     +--- MainF->err("Line = "+IntToStr(CurLineNo));
    94        |     |     +--- MainF->err(cBuff);
    95        |     |     +--- cBuffPos = 0;
    96        |     |     +--- CurLineNo++;
              |     |     |  +------------+ 
    97        |     |     +--+ continue;  | 
              |     |     |  +------------+ 
              |     |   +-+---+ 
    98        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +----------------+ 
    99        |     +--+ if(c == '\r'){ | 
              |     |  +--+-------------+ 
              |     |     |  +----------------------------------------+ 
   100        |     |     +--+ continue; // '\r' 0x0d は、無視する。  | 
              |     |     |  +----------------------------------------+ 
              |     |   +-+---+ 
   101        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +----------------+ 
   102        |     +--+ if(c != '\n'){ | 
              |     |  +--+-------------+ 
   103        |     |     +--- //
   104        |     |     |    // 継続行のチェックと処理を行う。        
   105        |     |     |    //  6桁目が 空白か0でなければ、継続行  
   106        |     |     |    //  その前が空白である条件もつけた。     
   107        |     |     |    //                                       
              |     |     |  +----------------------------------------------------------------+ 
   108        |     |     +--+ if((cBuffPos == 5)&&(c != ' ')&&(c != '0')                     | 
   109        |     |     |  |     &&(cBuff[0] == ' ')&&(cBuff[1] == ' ')                     | 
   110        |     |     |  |     &&(cBuff[2] == ' ')&&(cBuff[3] == ' ')                     | 
   111        |     |     |  |     &&(cBuff[4] == ' ')                                        | 
   112        |     |     |  |     &&(((TToken *)TokenList->Last())->TokId == tid_LineEnd)){  | 
              |     |     |  +--+-------------------------------------------------------------+ 
   113        |     |     |     +--- TokenList->Delete(TokenList->Count-1); // 最終トークンをCut
   114        |     |     |     +--- cBuff[cBuffPos++] = c;
              |     |     |     |  +----------------------------------------+ 
   115        |     |     |     +--+ continue; // 継続文字を無視して、継続  | 
              |     |     |     |  +----------------------------------------+ 
              |     |     |   +-+---+ 
   116        |     |     |   |  }  | 
              |     |     |   +-----+ 
   117        |     |     +--- cBuff[cBuffPos++] = c;
              |     |   +-+---+ 
   118        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-----------------------------------------------------------------------+ 
   118        |     |   |  else{  // 改行コード '\n' 0x0A (Windowsの場合は、1つ前に 0x0dが来る)  | 
              |     |   +-+-----------------------------------------------------------------------+ 
   119        |     |     +--- cBuff[cBuffPos++] = '\0';
   120        |     |     +--- s.printf("%4d:",CurLineNo);
   121        |     |     +--- #if 0
   122        |     |     +--- MainF->print(s+cBuff);
   123        |     |     +--- #endif
   124        |     |     +--- cBuffPos = 0;
   125        |     |     +--- CurLineNo++;
              |     |   +-+---+ 
   126        |     |   |  }  | 
              |     |   +-----+ 
   127        |     +--- //
   128        |     |    // コメント開始かどうかをチェックして、コメントなら終わりまでSkip  
   129        |     |    //                                                                 
              |     |  +--------------------------------------------------------------+ 
   130        |     +--+ if(((cBuffPos == 1)&&(((c == 'C')||(c == 'c')||(c == '*')))) | 
   131        |     |  |     ||(c == '!')){                                           | 
              |     |  +--+-----------------------------------------------------------+ 
   132        |     |     +--- TokStr = c;
              |     |     |  +------------------------------------+ 
   133        |     |     +--+ while((c != '\n')&&(pos < size)){  | 
              |     |     |  +--+---------------------------------+ 
   134        |     |     |     +--- Stream->Read(&c,sizeof(c));
   135        |     |     |     +--- cBuff[cBuffPos++] = c;
   136        |     |     |     +--- TokStr += c;
   137        |     |     |     +--- pos++;
              |     |     |   +-+---+ 
   138        |     |     |   |  }  | 
              |     |     |   +-----+ 
   139        |     |     +--- // 改行コードの処理
   140        |     |     +--- cBuff[cBuffPos-1] = '\0';
   141        |     |     +--- s.printf("%4d:",CurLineNo);
   142        |     |     +--- #if 0
   143        |     |     +--- MainF->print(s+cBuff);
   144        |     |     +--- #endif
   145        |     |     +--- cBuffPos = 0;
   146        |     |     +--- CurLineNo++;
   147        |     |     |    
              |     |     |  +------------------------+ 
   148        |     |     +--+ if(TokStr[1] == '!'){  | 
              |     |     |  +--+---------------------+ 
   149        |     |     |     +--- CurPos = Stream->Position;
   150        |     |     |     +--- TokenList->Add((void *)new TToken(TokStr,tid_Comment1));
   151        |     |     |     +--- TokenList->Add((void *)new TToken("",tid_LineEnd));
   152        |     |     |     +--- c = '\n'; // 改行コードでの処理を継続 (次がコメント前からの継続行?)
              |     |     |   +-+---+ 
   153        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------+ 
   153        |     |     |   |  else{  | 
              |     |     |   +-+-------+ 
   154        |     |     |     +--- CurPos = Stream->Position;
   155        |     |     |     +--- TokenList->Add((void *)new TToken(TokStr,tid_Comment2));
   156        |     |     |     +--- TokenList->Add((void *)new TToken("",tid_LineEnd));
              |     |     |     |  +------------+ 
   157        |     |     |     +--+ continue;  | 
              |     |     |     |  +------------+ 
              |     |     |   +-+---+ 
   158        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   159        |     |   |  }  | 
              |     |   +-----+ 
   160        |     +--- //
   161        |     |    // 文字列開始かどうかをチェックして文字列なら終わりまでスキップ  
   162        |     |    // 継続行があっても、閉じるまで読み続ける。                      
   163        |     |    // 直前が include キーワードならば、再帰呼び出しで処理を行う。   
   164        |     |    //                                                               
              |     |  +--------------------------------+ 
   165        |     +--+ if((c == '\'')||(c == '\"')){  | 
              |     |  +--+-----------------------------+ 
              |     |     |  +----------------------+ 
   166        |     |     +--+ if(TokBuffPos != 0){ | 
              |     |     |  +--+-------------------+ 
   167        |     |     |     +--- TokBuff[TokBuffPos] = '\0';
   168        |     |     |     +--- TokStr = AnsiString(TokBuff);
              |     |     |     |  +--------------------+ 
   169        |     |     |     +--+ if(TokStr != ""){  | 
              |     |     |     |  +--+-----------------+ 
   170        |     |     |     |     +--- CurPos = Stream->Position;
   171        |     |     |     |     +--- TokenList->Add((void *)new TToken(TokStr,-1));
              |     |     |     |   +-+---+ 
   172        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   173        |     |     |     +--- TokBuffPos = 0;
              |     |     |   +-+---+ 
   174        |     |     |   |  }  | 
              |     |     |   +-----+ 
   175        |     |     +--- TokStr = c;
              |     |     |  +----------------+ 
   176        |     |     +--+ if(c == '\''){ | 
              |     |     |  +--+-------------+ 
              |     |     |     |  +--------------------+ 
   177        |     |     |     +--+ while(pos < size){ | 
              |     |     |     |  +--+-----------------+ 
   178        |     |     |     |     +--- Stream->Read(&c,sizeof(c));
   179        |     |     |     |     +--- cBuff[cBuffPos++] = c;
              |     |     |     |     |  +----------------+ 
   180        |     |     |     |     +--+ if(c == '\''){ | 
              |     |     |     |     |  +--+-------------+ 
   181        |     |     |     |     |     +--- Stream->Read(&c,sizeof(c));
   182        |     |     |     |     |     +--- cBuff[cBuffPos++] = c;
   183        |     |     |     |     |     +--- pos++;
              |     |     |     |     |     |  +----------------+ 
   184        |     |     |     |     |     +--+ if(c != '\''){ | 
              |     |     |     |     |     |  +--+-------------+ 
   185        |     |     |     |     |     |     +--- TokStr += '\'';
   186        |     |     |     |     |     |     +--- Stream->Position = Stream->Position-1; // ひとつ戻る
              |     |     |     |     |     |     |  +--------+ 
   187        |     |     |     |     |     |     +--+ break; | 
              |     |     |     |     |     |     |  +--------+ 
              |     |     |     |     |     |   +-+---+ 
   188        |     |     |     |     |     |   |  }  | 
              |     |     |     |     |     |   +-----+ 
              |     |     |     |     |   +-+---+ 
   189        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
   190        |     |     |     |     +--- TokStr += c;
   191        |     |     |     |     +--- pos++;
              |     |     |     |   +-+---+ 
   192        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   193        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------+ 
   193        |     |     |   |  else{  | 
              |     |     |   +-+-------+ 
   194        |     |     |     +--- c = 0;
              |     |     |     |  +------------------------------------+ 
   195        |     |     |     +--+ while((c != '\"')&&(pos < size)){  | 
              |     |     |     |  +--+---------------------------------+ 
   196        |     |     |     |     +--- Stream->Read(&c,sizeof(c));
   197        |     |     |     |     +--- cBuff[cBuffPos++] = c;
   198        |     |     |     |     +--- TokStr += c;
   199        |     |     |     |     +--- pos++;
              |     |     |     |   +-+---+ 
   200        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   201        |     |     |   |  }  | 
              |     |     |   +-----+ 
   202        |     |     +--- CurPos = Stream->Position;
   203        |     |     +--- TokenList->Add((void *)new TToken(TokStr,tid_ConstStr));
   204        |     |     +--- TokBuffPos = 0;
   205        |     |     |    
   206        |     |     +--- #if 0  // 現在 includeはSkip もし入れるならば、StrPosの調整と OrgStrの調整が必要となる
   207        |     |     +--- //
   208        |     |     |    // もし、1つ前のトークンが includeの場合は、ファイルを開いて再帰で  
   209        |     |     |    // トークンを追加する。                                              
   210        |     |     |    // ファイルが見つからない場合は、Skipする。                          
   211        |     |     |    //                                                                   
              |     |     |  +----------------------------+ 
   212        |     |     +--+ if(TokenList->Count > 1){  | 
              |     |     |  +--+-------------------------+ 
   213        |     |     |     +--- TToken *Token;
   214        |     |     |     +--- AnsiString FileName;
   215        |     |     |     |    
   216        |     |     |     +--- Token = (TToken *)TokenList->Items[TokenList->Count-2];
              |     |     |     |  +--------------------------------------------------+ 
   217        |     |     |     +--+ if(AnsiCompareText(Token->Str,"include") == 0){  | 
              |     |     |     |  +--+-----------------------------------------------+ 
   218        |     |     |     |     +--- FileName = TokStr.SubString(2,TokStr.Length()-2);
              |     |     |     |     |  +----------------------------+ 
   219        |     |     |     |     +--+ if(FileExists(FileName)){  | 
              |     |     |     |     |  +--+-------------------------+ 
   220        |     |     |     |     |     +--- MainF->print("------------ start include "+ TokStr + " --------------");
   221        |     |     |     |     |     +--- Pass1(FileName,TokenList); // 再帰で呼ばれる。
   222        |     |     |     |     |     +--- MainF->print("------------ end include "+ TokStr + " --------------");
              |     |     |     |     |   +-+---+ 
   223        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
              |     |     |     |   +-+---+ 
   224        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   225        |     |     |   |  }  | 
              |     |     |   +-----+ 
   226        |     |     +--- #endif
              |     |     |  +------------+ 
   227        |     |     +--+ continue;  | 
              |     |     |  +------------+ 
              |     |   +-+---+ 
   228        |     |   |  }  | 
              |     |   +-----+ 
   229        |     +--- //
   230        |     |    // セパレータまで、1つのトークンとして扱う。  
   231        |     |    //                                             
              |     |  +------------------------------------+ 
   232        |     +--+ if(strchr(TokSepChar,c) == NULL){  | 
              |     |  +--+---------------------------------+ 
   233        |     |     +--- TokBuff[TokBuffPos++] = c;
              |     |     |  +------------+ 
   234        |     |     +--+ continue;  | 
              |     |     |  +------------+ 
              |     |   +-+---+ 
   235        |     |   |  }  | 
              |     |   +-----+ 
   236        |     |    
   237        |     +--- //
   238        |     |    // セパレータがあったので、そこまでをトークンとして処理する。      
   239        |     |    // さらに、セパレータ自身もトークンとして追加する。                
   240        |     |    // セパレータ自身のトークン追加は、<=などの演算子の場合があるが、  
   241        |     |    // その処理は、TokenListを生成後に行う。(NULLにしてPack()で詰める) 
   242        |     |    //                                                                 
              |     |  +----------------------+ 
   243        |     +--+ if(TokBuffPos != 0){ | 
              |     |  +--+-------------------+ 
   244        |     |     +--- TokBuff[TokBuffPos] = '\0';
   245        |     |     +--- TokStr = AnsiString(TokBuff);
              |     |     |  +--------------------+ 
   246        |     |     +--+ if(TokStr != ""){  | 
              |     |     |  +--+-----------------+ 
   247        |     |     |     +--- CurPos = Stream->Position-1;
   248        |     |     |     +--- TokenList->Add((void *)new TToken(TokStr,-1));
              |     |     |   +-+---+ 
   249        |     |     |   |  }  | 
              |     |     |   +-----+ 
   250        |     |     +--- TokBuffPos = 0;
              |     |   +-+---+ 
   251        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +----------------+ 
   252        |     +--+ if(c != ' '){  | 
              |     |  +--+-------------+ 
   253        |     |     +--- //
   254        |     |     |    // & 継続行のチェックと処理を行う。                    
   255        |     |     |    //  1)行の最後が & で終わっていれば、継続行          
   256        |     |     |    //      さらに次の行の先頭位置が&ならば、そこまでSkip  
   257        |     |     |    //  改行コードまでは、トークンとして処理済みとする。   
   258        |     |     |    //                                                     
              |     |     |  +----------------+ 
   259        |     |     +--+ if(c == '\n'){ | 
              |     |     |  +--+-------------+ 
              |     |     |     |  +------------------------------------------------+ 
   260        |     |     |     +--+ if(((TToken *)TokenList->Last())->Str == "&"){ | 
              |     |     |     |  +--+---------------------------------------------+ 
   261        |     |     |     |     +--- c = 0;
              |     |     |     |     |  +----------------------------------+ 
   262        |     |     |     |     +--+ while((c != ' ')&&(pos < size)){ | 
              |     |     |     |     |  +--+-------------------------------+ 
   263        |     |     |     |     |     +--- Stream->Read(&c,sizeof(c));
   264        |     |     |     |     |     +--- cBuff[cBuffPos++] = c;
              |     |     |     |     |     |  +----------------+ 
   265        |     |     |     |     |     +--+ if(c == '&'){  | 
              |     |     |     |     |     |  +--+-------------+ 
   266        |     |     |     |     |     |     +--- TokBuffPos = 0;
              |     |     |     |     |     |     |  +--------+ 
   267        |     |     |     |     |     |     +--+ break; | 
              |     |     |     |     |     |     |  +--------+ 
              |     |     |     |     |     |   +-+---+ 
   268        |     |     |     |     |     |   |  }  | 
              |     |     |     |     |     |   +-----+ 
   269        |     |     |     |     |     +--- TokBuff[TokBuffPos++] = c;
   270        |     |     |     |     |     +--- pos++;
              |     |     |     |     |   +-+---+ 
   271        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
              |     |     |     |   +-+---+ 
   272        |     |     |     |   |  }  | 
              |     |     |     |   +-+---+ 
              |     |     |     |   +-+-------+ 
   272        |     |     |     |   |  else{  | 
              |     |     |     |   +-+-------+ 
              |     |     |     |     |  +------------------------------------------------------------+ 
   273        |     |     |     |     +--+ if(((TToken *)TokenList->Last())->TokId != tid_LineEnd ){  | 
              |     |     |     |     |  +--+---------------------------------------------------------+ 
   274        |     |     |     |     |     +--- CurPos = Stream->Position;
   275        |     |     |     |     |     +--- TokenList->Add((void *)new TToken(c,tid_LineEnd));
              |     |     |     |     |   +-+---+ 
   276        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
              |     |     |     |   +-+---+ 
   277        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   278        |     |     |     +--- /*
   279        |     |     |     |        :: については、void Pass1_2(TList *TokenList) でのトークン結合に修正      
   280        |     |     |     |        OrgStrの所得に問題があったため。 修正。2007/1/19                           
   281        |     |     |     |                                                                                   
   282        |     |     |     |                }else if((c == ':')&&(((TToken *)TokenList->Last())->Str == ":")){ 
   283        |     |     |     |                    // : が連続している場合は、 :: となる(構造体用)               
   284        |     |     |     |                    ((TToken *)TokenList->Last())->Str += ":";                     
   285        |     |     |     |    */                                                                             
              |     |     |   +-+---+ 
   286        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------+ 
   286        |     |     |   |  else{  | 
              |     |     |   +-+-------+ 
   287        |     |     |     +--- CurPos = Stream->Position;
   288        |     |     |     +--- TokenList->Add((void *)new TToken(c,-1));
              |     |     |   +-+---+ 
   289        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   290        |     |   |  }  | 
              |     |   +-----+ 
              |   +-+---+ 
   291        |   |  }  | 
              |   +-----+ 
   292        +--- delete Stream;
              |  +------------------------------------------------------------+ 
   293        +--+ if(((TToken *)TokenList->Last())->TokId != tid_LineEnd ){  | 
              |  +--+---------------------------------------------------------+ 
   294        |     +--- CurPos = Stream->Position;
   295        |     +--- TokenList->Add((void *)new TToken("\n",tid_LineEnd));
              |   +-+---+ 
   296        |   |  }  | 
              |   +-----+ 
            +-+---+ 
   297      |  }  | 
            +-----+