abc プロジェクト
21.13. Pass1_2 関数説明

関数名 Pass1_2
定義ファイル名pass1.cpp
定義行 317
宣言形式 void Pass1_2 ( TList * TokenList )
概要 トークンリストを調べて、 go to などの複数のトークンをひとつにまとめる
また、-1(未確定)トークンに値を設定する。
DO や IF などの予約語についての識別もここで行う!
戻り値
パラメタ説明 TokenList トークンリスト
機能説明
備考

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

呼出し先関数一覧表
名称 定義ファイル名 定義行
1 MakeTokStrTbl pass1.cpp 585
2 Add

3 AddObject

4 AnsiCompareText

5 c_str

6 Find

7 IndexOf

8 Length

9 Pack

10 strlen

11 strtod

12 UpperCase

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

関数論理チャート

        |  +--------------------------------+ 
   317  +--+ void Pass1_2(TList *TokenList) | 
   318     | {                              | 
           +--+-----------------------------+ 
   319        +--- int i,j;
   320        +--- TToken *Token,*LastToken;
   321        +--- AnsiString s,s1,s2,TokStr,LastTokStr;
   322        +--- int sIdx1,sIdx2,tIdx;
   323        +--- TStringList *ConnectStr1;
   324        +--- TStringList *ConnectStr2;
   325        +--- TStringList *TokStrTbl;
   326        +--- char c;
   327        |    
              |  +----------------------------+ 
   328        +--+ if(TokenList->Count == 0){ | 
              |  +--+-------------------------+ 
              |     |  +----------+ 
   329        |     +--+ return;  | 
              |     |  +----------+ 
              |   +-+---+ 
   330        |   |  }  | 
              |   +-----+ 
   331        +--- ConnectStr1 = new TStringList;
   332        +--- ConnectStr2 = new TStringList;
   333        +--- TokStrTbl = new TStringList;
   334        |    
   335        +--- // 結合されるトークンのリスト
   336        +--- /*
   337        |        ConnectStr1->Add("do");ConnectStr2->Add("while");          
   338        |        ConnectStr1->Add("go");ConnectStr2->Add("to");             
   339        |        ConnectStr1->Add("else");ConnectStr2->Add("if");           
   340        |        ConnectStr1->Add("end");ConnectStr2->Add("if");            
   341        |        ConnectStr1->Add("end");ConnectStr2->Add("do");            
   342        |        ConnectStr1->Add("double");ConnectStr2->Add("precision");  
   343        |        ConnectStr1->Add("*");ConnectStr2->Add("*");               
   344        |        ConnectStr1->Add("/");ConnectStr2->Add("/");               
   345        |        ConnectStr1->Add("<");ConnectStr2->Add("=");               
   346        |        ConnectStr1->Add(">");ConnectStr2->Add("=");               
   347        |        ConnectStr1->Add("=");ConnectStr2->Add("=");               
   348        |        ConnectStr1->Add("/");ConnectStr2->Add("=");               
   349        |        // :: をここでの結合に修正した。 2007/1/19                 
   350        |        ConnectStr1->Add(":");ConnectStr2->Add(":");               
   351        |    */                                                             
   352        +--- ConnectStr1->Add("do");
   352        +--- ConnectStr2->AddObject("while",(TObject *)tid_DOWHILE);
   353        +--- ConnectStr1->Add("go");
   353        +--- ConnectStr2->AddObject("to",(TObject *)tid_GOTO);
   354        +--- ConnectStr1->Add("else");
   354        +--- ConnectStr2->AddObject("if",(TObject *)tid_ELSEIF);
   355        +--- ConnectStr1->Add("end");
   355        +--- ConnectStr2->AddObject("if",(TObject *)tid_ENDIF);
   356        +--- ConnectStr1->Add("end");
   356        +--- ConnectStr2->AddObject("do",(TObject *)tid_ENDDO);
   357        +--- ConnectStr1->Add("double");
   357        +--- ConnectStr2->AddObject("precision",(TObject *)tid_DOUBLEPRECISION);
   358        +--- ConnectStr1->Add("*");
   358        +--- ConnectStr2->AddObject("*",(TObject *)tid_Opr);
   359        +--- ConnectStr1->Add("/");
   359        +--- ConnectStr2->AddObject("/",(TObject *)tid_Opr);
   360        +--- ConnectStr1->Add("<");
   360        +--- ConnectStr2->AddObject("=",(TObject *)tid_Opr);
   361        +--- ConnectStr1->Add(">");
   361        +--- ConnectStr2->AddObject("=",(TObject *)tid_Opr);
   362        +--- ConnectStr1->Add("=");
   362        +--- ConnectStr2->AddObject("=",(TObject *)tid_Opr);
   363        +--- ConnectStr1->Add("/");
   363        +--- ConnectStr2->AddObject("=",(TObject *)tid_Opr);
   364        +--- // :: をここでの結合に修正した。 2007/1/19
   365        +--- ConnectStr1->Add(":");
   365        +--- ConnectStr2->AddObject(":",(TObject *)tid_KoronKoron);
   366        |    
   367        +--- MakeTokStrTbl(TokStrTbl);
   368        |    
   369        +--- sIdx1 = -1;
   370        +--- LastToken = (TToken *)TokenList->Items[0];
              |  +------------------------------------------+ 
   371        +--+ for(i = 0 ; i < TokenList->Count ; i++){ | 
              |  +--+---------------------------------------+ 
   372        |     +--- Token = (TToken *)TokenList->Items[i];
   373        |     +--- TokStr = Token->Str;
              |     |  +--------------------+ 
   374        |     +--+ if(TokStr == ":"){ | 
              |     |  +--+-----------------+ 
   375        |     |     +--- // :の前は無条件にラベル種類になる。 << 配列宣言の (1:n)でエラー
   376        |     |     |    // :の前で、その前の前がtid_LineEdnの場合のみラベルに                
   377        |     |     |    //  修正 2007/1/14                                                   
   378        |     |     |    // 数値のラベル等が発生する可能性があるが、ここではチェックしない。  
              |     |     |  +--------------------------------------------------------------------------+ 
   379        |     |     +--+ if((i >= 2)&&(((TToken *)TokenList->Items[i-2])->TokId == tid_LineEnd)){ | 
              |     |     |  +--+-----------------------------------------------------------------------+ 
   380        |     |     |     +--- LastToken->TokId = tid_Label;
   381        |     |     |     +--- LastToken->Str += ":";
   382        |     |     |     +--- delete Token;
   383        |     |     |     +--- TokenList->Items[i] = NULL;
   384        |     |     |     +--- sIdx1 = -1;
              |     |     |     |  +------------+ 
   385        |     |     |     +--+ continue;  | 
              |     |     |     |  +------------+ 
              |     |     |   +-+---+ 
   386        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   387        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-------------------------------------------+ 
   387        |     |   |  else if(LastToken->TokId == tid_LineEnd){  | 
              |     |   +-+-------------------------------------------+ 
   388        |     |     +--- // 行の先頭の数値もラベルとする。
              |     |     |  +--------------------------------------------------------------+ 
   389        |     |     +--+ if((TokStr != "")&&(TokStr[1] >= '0')&&(TokStr[1] <= '9')){  | 
              |     |     |  +--+-----------------------------------------------------------+ 
   390        |     |     |     +--- LastToken->TokId = tid_Label;
   391        |     |     |     +--- sIdx1 = -1;
              |     |     |     |  +------------+ 
   392        |     |     |     +--+ continue;  | 
              |     |     |     |  +------------+ 
              |     |     |   +-+---+ 
   393        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   394        |     |   |  }  | 
              |     |   +-----+ 
   395        |     +--- //
   396        |     |    // 2つのトークンを1つにまとめるタイプかどうかをチェックする。  
   397        |     |    //                                                               
   398        |     +--- #if 1
              |     |  +----------------------------------------------------+ 
   399        |     +--+ if(sIdx1 != -1){ // 前のトークンが一致可能性あり。 | 
              |     |  +--+-------------------------------------------------+ 
              |     |     |  +------------------------------------------------+ 
   400        |     |     +--+ for(j = sIdx1 ; j < ConnectStr1->Count ; j++){ | 
              |     |     |  +--+---------------------------------------------+ 
              |     |     |     |  +----------------------------------------------------------------+ 
   401        |     |     |     +--+ if(AnsiCompareText(ConnectStr1->Strings[j],LastTokStr) != 0){  | 
              |     |     |     |  +--+-------------------------------------------------------------+ 
   402        |     |     |     |     +--- // j は ConncetrStr1の検索範囲外。
              |     |     |     |     |  +--------+ 
   403        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   404        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |     |  +------------------------------------------------------------+ 
   405        |     |     |     +--+ if(AnsiCompareText(ConnectStr2->Strings[j],TokStr) == 0){  | 
              |     |     |     |  +--+---------------------------------------------------------+ 
   406        |     |     |     |     +--- // 一致
   407        |     |     |     |     +--- TokenList->Items[i-1] = NULL;
   408        |     |     |     |     +--- TokStr = LastToken->Str + Token->Str;
   409        |     |     |     |     +--- Token->Str = LastToken->Str + " " + Token->Str;
   410        |     |     |     |     +--- Token->TokId = (int)ConnectStr2->Objects[j];
   411        |     |     |     |     +--- delete LastToken;
   412        |     |     |     |     +--- TokStr = "";
              |     |     |     |     |  +--------+ 
   413        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   414        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   415        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   416        |     |   |  }  | 
              |     |   +-----+ 
   417        |     +--- sIdx1 = ConnectStr1->IndexOf(TokStr);
   418        |     +--- LastTokStr = TokStr;
   419        |     +--- #else
   420        |     +--- sIdx2 = ConnectStr2->IndexOf(Token->Str);
              |     |  +------------------------------------+ 
   421        |     +--+ if((sIdx1 != -1)&&(sIdx2 != -1)){  | 
              |     |  +--+---------------------------------+ 
              |     |     |  +--------------------------------------------------+ 
   422        |     |     +--+ if(AnsiCompareText(ConnectStr1->Strings[sIdx2]   | 
   423        |     |     |  |             ,ConnectStr1->Strings[sIdx1]) == 0){ | 
              |     |     |  +--+-----------------------------------------------+ 
   424        |     |     |     +--- TokenList->Items[i-1] = NULL;
   425        |     |     |     +--- TokStr = LastToken->Str + Token->Str;
   426        |     |     |     +--- Token->Str = LastToken->Str + " " + Token->Str;
   427        |     |     |     +--- delete LastToken;
   428        |     |     |     +--- sIdx1 = -1;
              |     |     |   +-+---+ 
   429        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------+ 
   429        |     |     |   |  else{  | 
              |     |     |   +-+-------+ 
   430        |     |     |     +--- sIdx1 = ConnectStr1->IndexOf(Token->Str);
              |     |     |   +-+---+ 
   431        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   432        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-------+ 
   432        |     |   |  else{  | 
              |     |   +-+-------+ 
   433        |     |     +--- sIdx1 = ConnectStr1->IndexOf(Token->Str);
              |     |   +-+---+ 
   434        |     |   |  }  | 
              |     |   +-----+ 
   435        |     +--- #endif
   436        |     +--- LastToken = Token;
   437        |     +--- //
   438        |     |    // Token->tokId -1 のトークン種別を検索する。  
   439        |     |    //                                             
              |     |  +--------------------------+ 
   440        |     +--+ if(Token->TokId == -1){  | 
              |     |  +--+-----------------------+ 
              |     |     |  +------------------------------------+ 
   441        |     |     +--+ if(TokStrTbl->Find(TokStr,tIdx)){  | 
              |     |     |  +--+---------------------------------+ 
   442        |     |     |     +--- // キーワードで一致トークンの処理
   443        |     |     |     +--- Token->TokId = (Enum_TokId)TokStrTbl->Objects[tIdx];
              |     |     |   +-+---+ 
   444        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------+ 
   444        |     |     |   |  else{  | 
              |     |     |   +-+-------+ 
   445        |     |     |     +--- //
   446        |     |     |     |    // 数値トークンかどうかを調べる。              
   447        |     |     |     |    // 全て0-9なら整数、ただし、精度指定[_X]も対象 
   448        |     |     |     |    // .DEなどの形式が正しい場合は実数             
   449        |     |     |     |    // 精度指定は、は読み飛ばし。                  
   450        |     |     |     |    //                                             
   451        |     |     |     +--- bool RealF = false;
   452        |     |     |     +--- char *cp,*lp;
   453        |     |     |     +--- s = "";
              |     |     |     |  +----------------------------------------------+ 
   454        |     |     |     +--+ for(int j = 1 ; j <= TokStr.Length() ; j++){ | 
              |     |     |     |  +--+-------------------------------------------+ 
   455        |     |     |     |     +--- c = TokStr[j];
              |     |     |     |     |  +------------------------------+ 
   456        |     |     |     |     +--+ if((c == 'D')||(c == 'd')){  | 
              |     |     |     |     |  +--+---------------------------+ 
   457        |     |     |     |     |     +--- c = 'e';
              |     |     |     |     |   +-+---+ 
   458        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-+---+ 
              |     |     |     |     |   +-+-------------------+ 
   458        |     |     |     |     |   |  else if(c == '_'){ | 
              |     |     |     |     |   +-+-------------------+ 
              |     |     |     |     |     |  +--------+ 
   459        |     |     |     |     |     +--+ break; | 
              |     |     |     |     |     |  +--------+ 
              |     |     |     |     |   +-+---+ 
   460        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
   461        |     |     |     |     +--- RealF |= ((c < '0')||(c > '9'));
   462        |     |     |     |     +--- s += c;
              |     |     |     |   +-+---+ 
   463        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   464        |     |     |     +--- cp = s.c_str();
   465        |     |     |     +--- Token->dData = strtod(cp,&lp);
              |     |     |     |  +----------------------------------+ 
   466        |     |     |     +--+ if(lp - cp == (int)strlen(cp)){  | 
              |     |     |     |  +--+-------------------------------+ 
              |     |     |     |     |  +------------+ 
   467        |     |     |     |     +--+ if(RealF){ | 
              |     |     |     |     |  +--+---------+ 
   468        |     |     |     |     |     +--- Token->TokId = tid_ConstReal;
              |     |     |     |     |   +-+---+ 
   469        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-+---+ 
              |     |     |     |     |   +-+-------+ 
   469        |     |     |     |     |   |  else{  | 
              |     |     |     |     |   +-+-------+ 
   470        |     |     |     |     |     +--- Token->TokId = tid_ConstInt;
              |     |     |     |     |   +-+---+ 
   471        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
              |     |     |     |   +-+---+ 
   472        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   473        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   474        |     |   |  }  | 
              |     |   +-----+ 
              |   +-+---+ 
   475        |   |  }  | 
              |   +-----+ 
   476        +--- TokenList->Pack(); // 不要なNULLを削除する。
   477        |                                                 
   478        +--- delete ConnectStr1;
   479        +--- delete ConnectStr2;
   480        +--- delete TokStrTbl;
              |  +------------------------------------------+ 
   481        +--+ for(i = 0 ; i < TokenList->Count ; i++){ | 
              |  +--+---------------------------------------+ 
   482        |     +--- Token = (TToken *)TokenList->Items[i];
   483        |     +--- Token->Idx = i;
              |     |  +------------------------------+ 
   484        |     +--+ if(Token->TokId == tid_Opr){ | 
              |     |  +--+---------------------------+ 
   485        |     |     +--- TokStr = Token->Str;
              |     |     |  +--------------------+ 
   486        |     |     +--+ if(TokStr == "+"){ | 
              |     |     |  +--+-----------------+ 
   487        |     |     |     +--- Token->priority = 1;
              |     |     |   +-+---+ 
   488        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------------------------+ 
   488        |     |     |   |  else if(TokStr == "-"){  | 
              |     |     |   +-+-------------------------+ 
   489        |     |     |     +--- Token->priority = 1;
              |     |     |   +-+---+ 
   490        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------------------------+ 
   490        |     |     |   |  else if(TokStr == "*"){  | 
              |     |     |   +-+-------------------------+ 
   491        |     |     |     +--- Token->priority = 2;
              |     |     |   +-+---+ 
   492        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------------------------+ 
   492        |     |     |   |  else if(TokStr == "/"){  | 
              |     |     |   +-+-------------------------+ 
   493        |     |     |     +--- Token->priority = 3;
              |     |     |   +-+---+ 
   494        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------------------------+ 
   494        |     |     |   |  else if(TokStr == "**"){ | 
              |     |     |   +-+-------------------------+ 
   495        |     |     |     +--- Token->priority = 4;
              |     |     |   +-+---+ 
   496        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-----------------------------------------+ 
   496        |     |     |   |  else if(UpperCase(TokStr) == ".NEQV."){  | 
              |     |     |   +-+-----------------------------------------+ 
   497        |     |     |     +--- Token->priority = 0;
              |     |     |   +-+---+ 
   498        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+---------------------------------------+ 
   498        |     |     |   |  else if(UpperCase(TokStr) == ".EQV."){ | 
              |     |     |   +-+---------------------------------------+ 
   499        |     |     |     +--- Token->priority = 0;
              |     |     |   +-+---+ 
   500        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------+ 
   500        |     |     |   |  else{  | 
              |     |     |   +-+-------+ 
   501        |     |     |     +--- Token->priority = 1; // その他の演算子は 優先順位1
              |     |     |   +-+---+ 
   502        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   503        |     |   |  }  | 
              |     |   +-----+ 
   504        |     +--- #if 0
   505        |     +--- MainF->print(IntToStr(i) + " ["+((TToken *)TokenList->Items[i])->Str+"] Id = "
   506        |     |        + IntToStr(((TToken *)TokenList->Items[i])->TokId));                       
   507        |     +--- #endif
              |   +-+---+ 
   508        |   |  }  | 
              |   +-----+ 
   509        |    
            +-+---+ 
   510      |  }  | 
            +-----+