abc プロジェクト
21.16. Pass2_Line 関数説明

関数名 Pass2_Line
定義ファイル名pass2.cpp
定義行 104
宣言形式 void Pass2_Line ( TList * TokenList , int sPos , int ePos , TList * ValDataList )
概要 構文解析を1行ごとに行う
sPosからePosのトークンを全て処理すること。(ePosは、LineEndを示す)
いくつかのまとまった処理は、サブルーチンとすること。
戻り値
パラメタ説明 TokenList トークンリスト
sPos 開始位置
ePos 終了位置
ValDataList 変数リスト
機能説明
備考

呼出し元関数一覧表
名称 定義ファイル名 定義行
1 Pass2 pass2.cpp 56

呼出し先関数一覧表
名称 定義ファイル名 定義行
1 AddDataDef pass2.cpp 533
2 AddSubFuncDef pass2.cpp 455
3 ErrMsg pass2.cpp 1484
4 Eval pass2.cpp 922
5 FindEndDo pass2.cpp 1254
6 IMPLICIT pass2.cpp 1326
7 ResetModule pass2.cpp 1291
8 Add

9 AnsiCompareText

参照外部変数一覧表
名称 定義ファイル名 定義行
1 ImplType pass2.cpp 23
2 Indent pass2.cpp 22
3 ModuleIdx pass2.cpp 20
4 NestLevel pass2.cpp 21

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

関数論理チャート

        |  +------------------------------------------------------------------------+ 
   104  +--+ void Pass2_Line(TList *TokenList,int sPos,int ePos,TList *ValDataList) | 
   105     | {                                                                      | 
           +--+---------------------------------------------------------------------+ 
   106        +--- TToken *Token,*ValToken;
   107        +--- int TokId;
   108        +--- int UseTokLen;
   109        +--- double dData;
   110        +--- AnsiString TokStr;
   111        +--- int ValIdx;
   112        +--- TValData *ValData;
   113        +--- int TmpRefCount;
   114        |    
   115        +--- Token = (TToken *)TokenList->Items[sPos];
   116        +--- TokId = Token->TokId;
              |  +--------------------------+ 
   117        +--+ if(TokId == tid_Label){  | 
              |  +--+-----------------------+ 
   118        |     +--- // ラベルを除いて、もう一度呼び出す。 (文でも可能なため)
   119        |     +--- sPos++;
   120        |     +--- Token = (TToken *)TokenList->Items[sPos];
   121        |     +--- TokId = Token->TokId;
              |   +-+---+ 
   122        |   |  }  | 
              |   +-----+ 
              |  +----------------+ 
   123        +--+ switch(TokId){ | 
              |  +--+-------------+ 
              |     +-----------+ 
   124        |     |  case -1: | 
              |     +-----------+ 
   125        |     +--- //
   126        |     |    // 代入文 先頭が未定義トークン (変数名)                  
   127        |     |    // キーワードと一致する DO などの変数名はサポートしない。  
   128        |     |    // 行の先頭は、常に変数名となる。 名前の次が(なら配列。    
   129        |     |    //                                                         
   130        |     +--- ValToken = Token; // 変数トークン
   131        |     +--- TokStr = Token->Str;
   132        |     +--- //
   133        |     |    // 変数を vrf_setで追加  
   134        |     |    //                       
              |     |  +------------------------------------------------------------+ 
   135        |     +--+ for(ValIdx = 0 ; ValIdx < ValDataList->Count ; ValIdx++){  | 
              |     |  +--+---------------------------------------------------------+ 
   136        |     |     +--- ValData = (TValData *)ValDataList->Items[ValIdx];
              |     |     |  +--------------------------------------------------+ 
   137        |     |     +--+ if((AnsiCompareText(ValData->Str,TokStr) == 0)&& | 
   138        |     |     |  |     (ValData->ModuleIdx == ModuleIdx)){          | 
              |     |     |  +--+-----------------------------------------------+ 
   139        |     |     |     +--- Token->ValData = ValData; // トークンに変数を関連付ける
   140        |     |     |     +--- ValData->SetCount++;
   141        |     |     |     +--- ValIdx = ValDataList->Count+10;
              |     |     |     |  +--------+ 
   142        |     |     |     +--+ break; | 
              |     |     |     |  +--------+ 
              |     |     |   +-+---+ 
   143        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   144        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +--------------------------------------+ 
   145        |     +--+ if(ValIdx != ValDataList->Count+10){ | 
              |     |  +--+-----------------------------------+ 
   146        |     |     +--- // 最初に出現した変数
   147        |     |     +--- ValData = new TValData(TokStr);
   148        |     |     +--- ValDataList->Add((void *)ValData);
   149        |     |     +--- ValData->ModuleIdx = ModuleIdx;
   150        |     |     +--- ValData->DataType = ImplType[TokStr[1]]; // 暗黙の宣言
   151        |     |     +--- Token->ValData = ValData; // トークンに変数を関連付ける
   152        |     |     +--- ValData->SetCount++;
              |     |   +-+---+ 
   153        |     |   |  }  | 
              |     |   +-----+ 
   154        |     +--- TmpRefCount = ValData->RefCount;
   155        |     +--- Token = (TToken *)TokenList->Items[++sPos]; // 次のトークンを所得
              |     |  +--------------------------------+ 
   156        |     +--+ if(Token->TokId == tid_Kakko){ | 
              |     |  +--+-----------------------------+ 
   157        |     |     +--- // 配列 a(i,j) = など
   158        |     |     |    // 配列の添え字部分の解析を行ない TokenとValListをセット 
   159        |     |     |    //                                                       
   160        |     |     +--- ValData->ArrayOrFuncF = true;
   161        |     |     +--- sPos++; // skip "("
              |     |     |  +------+ 
   162        |     |     +--+ do{  | 
              |     |     |  +--+---+ 
   163        |     |     |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
              |     |     |     |  +----------------------+ 
   164        |     |     |     +--+ if(UseTokLen == -1){ | 
              |     |     |     |  +--+-------------------+ 
              |     |     |     |     |  +--------+ 
   165        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   166        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   167        |     |     |     +--- sPos += UseTokLen;
   168        |     |     |     +--- Token = (TToken *)TokenList->Items[sPos]; // 次のトークンを所得
              |     |     |     |  +------------------------------------------------------+ 
   169        |     |     |     +--+ if(Token->TokId == tid_Kannma){ // ","の場合は、次へ | 
              |     |     |     |  +--+---------------------------------------------------+ 
   170        |     |     |     |     +--- Token = (TToken *)TokenList->Items[++sPos];
              |     |     |     |   +-+---+ 
   171        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+-----------------------------------+ 
   172        |     |     |   |  }while(Token->TokId != tid_Kokka); | 
              |     |     |   +-------------------------------------+ 
   173        |     |     +--- sPos++; // Skip ")"
   174        |     |     +--- Token = (TToken *)TokenList->Items[sPos];
              |     |   +-+---+ 
   175        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +------------------------------+ 
   176        |     +--+ if(Token->TokId != tid_Set){ | 
              |     |  +--+---------------------------+ 
   177        |     |     +--- ErrMsg(TokenList,sPos,"式に'='がありません。");
              |     |   +-+---+ 
   178        |     |   |  }  | 
              |     |   +-----+ 
   179        |     +--- sPos++; // Skip "="
   180        |     +--- // 右辺部分の評価とトークンの処理を行う。
   181        |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
              |     |  +----------------------------------------+ 
   182        |     +--+ if(TmpRefCount != ValData->RefCount){  | 
              |     |  +--+-------------------------------------+ 
   183        |     |     +--- //
   184        |     |     |    // Val = の右辺で Valの参照があった場合は、    
   185        |     |     |    // Val = Val + ... として扱っている。          
   186        |     |     |    // if(TmpRefCount < ValData->RefCount) と同等  
   187        |     |     |    //                                             
   188        |     |     +--- ValToken->RefType = vrf_refset;
              |     |   +-+---+ 
   189        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-------+ 
   189        |     |   |  else{  | 
              |     |   +-+-------+ 
   190        |     |     +--- ValToken->RefType = vrf_set;
              |     |   +-+---+ 
   191        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +--------+ 
   192        |     +--+ break; | 
              |     |  +--------+ 
              |     +-------------------------------------+ 
   193        |     |  case tid_LineEnd:   // 行の終わり  | 
              |     +-------------------------------------+ 
              |     |  +--------+ 
   194        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------+ 
   195        |     |  case tid_null: | 
              |     +-----------------+ 
              |     +-------------------------------------------+ 
   196        |     |  case tid_Comment1:  // !で始まるコメント | 
              |     +-------------------------------------------+ 
              |     +-------------------------------------------+ 
   197        |     |  case tid_Comment2:  // !で始まるコメント | 
              |     +-------------------------------------------+ 
              |     +-------------------------------------+ 
   198        |     |  case tid_ConstStr:  // 文字列定数  | 
              |     +-------------------------------------+ 
              |     +-----------------------------------------------------------------+ 
   199        |     |  case tid_Label:     // 文番号、またはラベル (必要に応じて検索) | 
              |     +-----------------------------------------------------------------+ 
              |     |  +--------+ 
   200        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------+ 
   201        |     |  case tid_END:  | 
              |     +-----------------+ 
   202        |     +--- // モジュールを終了。(次行から次モジュールとなる)
   203        |     |    // Endの後の名前は、Skipする。                       
   204        |     +--- NestLevel--;
              |     |  +----------------------+ 
   205        |     +--+ if(NestLevel == 0){  | 
              |     |  +--+-------------------+ 
   206        |     |     +--- ModuleIdx++;
   207        |     |     +--- ResetModule();
   208        |     |     +--- Indent = 0;
              |     |   +-+---+ 
   209        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +--------+ 
   210        |     +--+ break; | 
              |     |  +--------+ 
   211        |     +--- // Program関連
              |     +-------------------------------------+ 
   212        |     |  case tid_PROGRAM:       // PROGRAM | 
              |     +-------------------------------------+ 
              |     +-------------------------------------+ 
   213        |     |  case tid_MODULE:        // MODULE  | 
              |     +-------------------------------------+ 
              |     +---------------------------------------+ 
   214        |     |  case tid_INTERFACE:     // INTERFACE | 
              |     +---------------------------------------+ 
   215        |     +--- // とりあえずなし。現状では、サブの呼び出しは対象外
   216        |     +--- NestLevel++;
              |     |  +--------+ 
   217        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------------------------------+ 
   218        |     |  case tid_SUBROUTINE:    // SUBROUTINE  | 
              |     +-----------------------------------------+ 
              |     +---------------------------------------+ 
   219        |     |  case tid_FUNCTION:      // FUNCTION  | 
              |     +---------------------------------------+ 
   220        |     +--- AddSubFuncDef(TokenList,sPos,ePos,ValDataList);
   221        |     +--- NestLevel++;
              |     |  +--------+ 
   222        |     +--+ break; | 
              |     |  +--------+ 
              |     +---------------------------------------+ 
   223        |     |  case tid_CONTAINS:      // CONTAINS  | 
              |     +---------------------------------------+ 
              |     +---------------------------------+ 
   224        |     |  case tid_USE:           // USE | 
              |     +---------------------------------+ 
   225        |     +--- // とりあえずなし。現状では、サブの呼び出しは対象外
              |     |  +--------+ 
   226        |     +--+ break; | 
              |     |  +--------+ 
   227        |     +--- // データ宣言関連、変数(定数)定義をValDataListに追加する。
              |     +---------------------+ 
   228        |     |  case tid_INTEGER:  | 
              |     +---------------------+ 
              |     +-----------------+ 
   229        |     |  case tid_REAL: | 
              |     +-----------------+ 
              |     +-----------------------------+ 
   230        |     |  case tid_DOUBLEPRECISION:  | 
              |     +-----------------------------+ 
              |     +-----------------------+ 
   231        |     |  case tid_CHARACTER:  | 
              |     +-----------------------+ 
              |     +---------------------+ 
   232        |     |  case tid_LOGICAL:  | 
              |     +---------------------+ 
              |     +---------------------+ 
   233        |     |  case tid_COMPLEX:  | 
              |     +---------------------+ 
              |     +-----------------------+ 
   234        |     |  case tid_DIMENSION:  | 
              |     +-----------------------+ 
              |     +-----------------------+ 
   235        |     |  case tid_PARAMETER:  | 
              |     +-----------------------+ 
   236        |     +--- //
   237        |     |    // データ宣言関連、変数(定数)定義をValDataListに追加する。        
   238        |     |    // 変数のデータ型が必要となるため必須                              
   239        |     |    // PARAMETERの定数処理も、式の評価を行って計算する。(可能な限り) 
   240        |     |    //  Exp. REAL,PARAMETER ABC = 12*4 ; PARAMETER (N=3)               
   241        |     |    //                                                                 
   242        |     +--- AddDataDef(TokenList,sPos,ePos,ValDataList);
              |     |  +--------+ 
   243        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------------------------------------+ 
   244        |     |  case tid_IMPLICIT:      // 暗黙の型宣言変更  | 
              |     +-----------------------------------------------+ 
   245        |     +--- IMPLICIT(TokenList,sPos+1,ePos);
              |     |  +--------+ 
   246        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------+ 
   247        |     |  case tid_TYPE: | 
              |     +-----------------+ 
   248        |     +--- NestLevel++; // Typeは、Endまでがブロックとなる。
              |     |  +--------+ 
   249        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------------------------------------------------+ 
   250        |     |  case tid_NAMELIST: // NameListは、READ,WRITEで使われる.  | 
              |     +-----------------------------------------------------------+ 
              |     +-------------------------+ 
   251        |     |  case tid_ALLOCATABLE:  | 
              |     +-------------------------+ 
              |     +---------------------+ 
   252        |     |  case tid_POINTER:  | 
              |     +---------------------+ 
              |     +-------------------+ 
   253        |     |  case tid_TARGET: | 
              |     +-------------------+ 
              |     +-----------------+ 
   254        |     |  case tid_SAVE: | 
              |     +-----------------+ 
              |     +---------------------+ 
   255        |     |  case tid_PRIVATE:  | 
              |     +---------------------+ 
              |     +-------------------+ 
   256        |     |  case tid_PUBLIC: | 
              |     +-------------------+ 
              |     +---------------------+ 
   257        |     |  case tid_EXTERNAL: | 
              |     +---------------------+ 
              |     +-----------------------+ 
   258        |     |  case tid_INTRINSIC:  | 
              |     +-----------------------+ 
              |     +-------------------+ 
   259        |     |  case tid_INTENT: | 
              |     +-------------------+ 
              |     +---------------------+ 
   260        |     |  case tid_OPTIONAL: | 
              |     +---------------------+ 
              |     +-------------------+ 
   261        |     |  case tid_WHERE:  | 
              |     +-------------------+ 
   262        |     +--- //動的記憶割付け
              |     +---------------------+ 
   263        |     |  case tid_ALLOCATE: | 
              |     +---------------------+ 
              |     +-----------------------+ 
   264        |     |  case tid_DEALLOCATE: | 
              |     +-----------------------+ 
              |     +---------------------+ 
   265        |     |  case tid_NULLIFY:  | 
              |     +---------------------+ 
   266        |     +--- // すべて、読み飛ばす。(当面ポインタ、構造体は対象外とする)
   267        |     |    // ポインタ、構造体を含む部分は、スクリプトで変換不可とする。  
              |     |  +--------+ 
   268        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------+ 
   269        |     |  case tid_CALL: | 
              |     +-----------------+ 
   270        |     +--- // Callは、その次のサブルーチン名をSkipしてから
   271        |     |    // 後の変数を RWの属性をつけて設定する。(型の一致チェックなどは行わない) 
   272        |     +--- #if 1   // Callの変数
   273        |     +--- sPos++; // Skip サブルーチン名
   274        |     |                                   
   275        |     +--- Token = (TToken *)TokenList->Items[++sPos]; // 次のトークンを所得
              |     |  +--------------------------------+ 
   276        |     +--+ if(Token->TokId == tid_Kakko){ | 
              |     |  +--+-----------------------------+ 
   277        |     |     +--- // 配列 a(i,j) = など
   278        |     |     |    // 配列の添え字部分の解析を行ない TokenとValListをセット 
   279        |     |     |    //                                                       
   280        |     |     +--- sPos++; // skip "("
              |     |     |  +------+ 
   281        |     |     +--+ do{  | 
              |     |     |  +--+---+ 
   282        |     |     |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
   283        |     |     |     +--- //                if(UseTokLen == -1){
              |     |     |     |  +----------------------+ 
   284        |     |     |     +--+ if(UseTokLen <= 0){  | 
              |     |     |     |  +--+-------------------+ 
              |     |     |     |     |  +--------+ 
   285        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   286        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   287        |     |     |     +--- sPos += UseTokLen;
   288        |     |     |     +--- Token = (TToken *)TokenList->Items[sPos]; // 次のトークンを所得
              |     |     |     |  +------------------------------------------------------+ 
   289        |     |     |     +--+ if(Token->TokId == tid_Kannma){ // ","の場合は、次へ | 
              |     |     |     |  +--+---------------------------------------------------+ 
   290        |     |     |     |     +--- Token = (TToken *)TokenList->Items[++sPos];
              |     |     |     |   +-+---+ 
   291        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+-----------------------------------+ 
   292        |     |     |   |  }while(Token->TokId != tid_Kokka); | 
              |     |     |   +-------------------------------------+ 
   293        |     |     +--- sPos++; // Skip ")"
   294        |     |     +--- Token = (TToken *)TokenList->Items[sPos];
              |     |   +-+---+ 
   295        |     |   |  }  | 
              |     |   +-----+ 
   296        |     +--- #endif
              |     |  +--------+ 
   297        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------------+ 
   298        |     |  case tid_DO: // DO文 | 
              |     +-----------------------+ 
   299        |     +--- Indent++;
   300        |     +--- Token->JmpTokenPos = FindEndDo(TokenList,sPos);
   301        |     +--- Token = (TToken *)TokenList->Items[++sPos]; // 次のトークンを所得
   302        |     +--- ValToken = Token; // 変数トークン
   303        |     +--- TokStr = Token->Str;
   304        |     +--- //
   305        |     |    // 変数を vrf_setで追加  
   306        |     |    //                       
              |     |  +------------------------------------------------------------+ 
   307        |     +--+ for(ValIdx = 0 ; ValIdx < ValDataList->Count ; ValIdx++){  | 
              |     |  +--+---------------------------------------------------------+ 
   308        |     |     +--- ValData = (TValData *)ValDataList->Items[ValIdx];
              |     |     |  +--------------------------------------------------+ 
   309        |     |     +--+ if((AnsiCompareText(ValData->Str,TokStr) == 0)&& | 
   310        |     |     |  |     (ValData->ModuleIdx == ModuleIdx)){          | 
              |     |     |  +--+-----------------------------------------------+ 
   311        |     |     |     +--- Token->ValData = ValData; // トークンに変数を関連付ける
   312        |     |     |     +--- ValData->SetCount++;
   313        |     |     |     +--- ValIdx = ValDataList->Count+10;
              |     |     |     |  +--------+ 
   314        |     |     |     +--+ break; | 
              |     |     |     |  +--------+ 
              |     |     |   +-+---+ 
   315        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   316        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +--------------------------------------+ 
   317        |     +--+ if(ValIdx != ValDataList->Count+10){ | 
              |     |  +--+-----------------------------------+ 
   318        |     |     +--- // 最初に出現した変数
   319        |     |     +--- ValData = new TValData(TokStr);
   320        |     |     +--- ValDataList->Add((void *)ValData);
   321        |     |     +--- ValData->ModuleIdx = ModuleIdx;
   322        |     |     +--- ValData->DataType = ImplType[TokStr[1]]; // 暗黙の宣言
   323        |     |     +--- Token->ValData = ValData; // トークンに変数を関連付ける
   324        |     |     +--- ValData->SetCount++;
              |     |   +-+---+ 
   325        |     |   |  }  | 
              |     |   +-----+ 
   326        |     +--- TmpRefCount = ValData->RefCount;
   327        |     +--- Token = (TToken *)TokenList->Items[++sPos]; // 次のトークンを所得
              |     |  +--------------------------------+ 
   328        |     +--+ if(Token->TokId == tid_Kakko){ | 
              |     |  +--+-----------------------------+ 
   329        |     |     +--- // 配列 a(i,j) = など
   330        |     |     |    // 配列の添え字部分の解析を行ない TokenとValListをセット 
   331        |     |     |    //                                                       
   332        |     |     +--- ValData->ArrayOrFuncF = true;
   333        |     |     +--- sPos++; // skip "("
              |     |     |  +------+ 
   334        |     |     +--+ do{  | 
              |     |     |  +--+---+ 
   335        |     |     |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
              |     |     |     |  +----------------------+ 
   336        |     |     |     +--+ if(UseTokLen == -1){ | 
              |     |     |     |  +--+-------------------+ 
              |     |     |     |     |  +--------+ 
   337        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   338        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   339        |     |     |     +--- sPos += UseTokLen;
   340        |     |     |     +--- Token = (TToken *)TokenList->Items[sPos]; // 次のトークンを所得
              |     |     |     |  +------------------------------------------------------+ 
   341        |     |     |     +--+ if(Token->TokId == tid_Kannma){ // ","の場合は、次へ | 
              |     |     |     |  +--+---------------------------------------------------+ 
   342        |     |     |     |     +--- Token = (TToken *)TokenList->Items[++sPos];
              |     |     |     |   +-+---+ 
   343        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+-----------------------------------+ 
   344        |     |     |   |  }while(Token->TokId != tid_Kokka); | 
              |     |     |   +-------------------------------------+ 
   345        |     |     +--- sPos++; // Skip ")"
   346        |     |     +--- Token = (TToken *)TokenList->Items[sPos];
              |     |   +-+---+ 
   347        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +------------------------------+ 
   348        |     +--+ if(Token->TokId != tid_Set){ | 
              |     |  +--+---------------------------+ 
   349        |     |     +--- ErrMsg(TokenList,sPos,"式に'='がありません。");
              |     |   +-+---+ 
   350        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-------+ 
   350        |     |   |  else{  | 
              |     |   +-+-------+ 
   351        |     |     +--- sPos++; // Skip "="
              |     |     |  +------+ 
   352        |     |     +--+ do{  | 
              |     |     |  +--+---+ 
   353        |     |     |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
              |     |     |     |  +----------------------+ 
   354        |     |     |     +--+ if(UseTokLen <= 0){  | 
              |     |     |     |  +--+-------------------+ 
              |     |     |     |     |  +--------+ 
   355        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   356        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
   357        |     |     |     +--- sPos += UseTokLen;
   358        |     |     |     +--- Token = (TToken *)TokenList->Items[sPos]; // 次のトークンを所得
              |     |     |     |  +------------------------------------------------------+ 
   359        |     |     |     +--+ if(Token->TokId == tid_Kannma){ // ","の場合は、次へ | 
              |     |     |     |  +--+---------------------------------------------------+ 
   360        |     |     |     |     +--- Token = (TToken *)TokenList->Items[++sPos];
              |     |     |     |   +-+---+ 
   361        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+-----------------------------------+ 
   362        |     |     |   |  }while(Token->TokId != tid_Kokka); | 
              |     |     |   +-------------------------------------+ 
   363        |     |     +--- sPos++; // Skip ")"
   364        |     |     +--- Token = (TToken *)TokenList->Items[sPos];
              |     |   +-+---+ 
   365        |     |   |  }  | 
              |     |   +-----+ 
   366        |     +--- //
   367        |     |    // 式の右辺の解析を行う。                    
   368        |     |    // 右辺が定数の場合は、Tokenに定数をセット! 
   369        |     |    //                                           
   370        |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
              |     |  +----------------------------------------+ 
   371        |     +--+ if(TmpRefCount != ValData->RefCount){  | 
              |     |  +--+-------------------------------------+ 
   372        |     |     +--- ValToken->RefType = vrf_refset;
              |     |   +-+---+ 
   373        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-------+ 
   373        |     |   |  else{  | 
              |     |   +-+-------+ 
   374        |     |     +--- ValToken->RefType = vrf_set;
              |     |   +-+---+ 
   375        |     |   |  }  | 
              |     |   +-----+ 
              |     |  +--------+ 
   376        |     +--+ break; | 
              |     |  +--------+ 
   377        |     |    
   378        |     +--- // 制御文
              |     +---------------+ 
   379        |     |  case tid_IF: | 
              |     +---------------+ 
   380        |     +--- //
   381        |     |    // IF文は、その後の変数を参照として追加する。  
   382        |     |    //                                             
   383        |     +--- sPos++; // Skip IF
   384        |     +--- UseTokLen = Eval(TokenList,sPos,ePos,ValDataList,&dData);
   385        |     +--- Indent++;
              |     |  +--------+ 
   386        |     +--+ break; | 
              |     |  +--------+ 
              |     +-------------------+ 
   387        |     |  case tid_SELECT: | 
              |     +-------------------+ 
              |     +---------------------+ 
   388        |     |  case tid_DOWHILE:  | 
              |     +---------------------+ 
   389        |     +--- Indent++;
              |     |  +--------+ 
   390        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------+ 
   391        |     |  case tid_THEN: | 
              |     +-----------------+ 
              |     +-----------------+ 
   392        |     |  case tid_ELSE: | 
              |     +-----------------+ 
              |     +-------------------+ 
   393        |     |  case tid_ELSEIF: | 
              |     +-------------------+ 
              |     |  +--------+ 
   394        |     +--+ break; | 
              |     |  +--------+ 
              |     +-------------------+ 
   395        |     |  case tid_ENDIF:  | 
              |     +-------------------+ 
              |     +-------------------+ 
   396        |     |  case tid_ENDDO:  | 
              |     +-------------------+ 
   397        |     +--- Indent--;
              |     |  +--------+ 
   398        |     +--+ break; | 
              |     |  +--------+ 
              |     +-----------------+ 
   399        |     |  case tid_CASE: | 
              |     +-----------------+ 
              |     +-----------------+ 
   400        |     |  case tid_GOTO: | 
              |     +-----------------+ 
              |     +-------------------+ 
   401        |     |  case tid_RETURN: | 
              |     +-------------------+ 
              |     +-----------------+ 
   402        |     |  case tid_STOP: | 
              |     +-----------------+ 
              |     |  +--------+ 
   403        |     +--+ break; | 
              |     |  +--------+ 
   404        |     +--- // 入出力
              |     +-----------------+ 
   405        |     |  case tid_READ: | 
              |     +-----------------+ 
              |     +-------------------+ 
   406        |     |  case tid_WRITE:  | 
              |     +-------------------+ 
              |     +-------------------+ 
   407        |     |  case tid_PRINT:  | 
              |     +-------------------+ 
              |     +-----------------------+ 
   408        |     |  case tid_BACKSPACE:  | 
              |     +-----------------------+ 
              |     +---------------------+ 
   409        |     |  case tid_INQUIRE:  | 
              |     +---------------------+ 
              |     +-------------------+ 
   410        |     |  case tid_REWIND: | 
              |     +-------------------+ 
              |     +-------------------+ 
   411        |     |  case tid_CLOSE:  | 
              |     +-------------------+ 
              |     +-----------------+ 
   412        |     |  case tid_OPEN: | 
              |     +-----------------+ 
              |     +---------------------+ 
   413        |     |  case tid_ENDFILE:  | 
              |     +---------------------+ 
              |     +-------------------+ 
   414        |     |  case tid_FORMAT: | 
              |     +-------------------+ 
   415        |     +--- // すべて、読み飛ばす。
   416        |     |    // 入出力を含む部分は、スクリプトで変換不可とする。  
              |     |  +--------+ 
   417        |     +--+ break; | 
              |     |  +--------+ 
   418        |     +--- // その他
              |     +-----------------------+ 
   419        |     |  case tid_ASSOCIATED: | 
              |     +-----------------------+ 
              |     +---------------------+ 
   420        |     |  case tid_CONTINUE: | 
              |     +---------------------+ 
              |     +-------------------+ 
   421        |     |  case tid_CYCLE:  | 
              |     +-------------------+ 
              |     +-----------------+ 
   422        |     |  case tid_DATA: | 
              |     +-----------------+ 
              |     +-----------------+ 
   423        |     |  case tid_EXIT: | 
              |     +-----------------+ 
   424        |     +--- // すべて、読み飛ばす。
   425        |     |    // 入出力を含む部分は、スクリプトで変換不可とする。  
              |     |  +--------+ 
   426        |     +--+ break; | 
              |     |  +--------+ 
              |   +-+---+ 
   427        |   |  }  | 
              |   +-----+ 
            +-+---+ 
   428      |  }  | 
            +-----+