abc プロジェクト
14.8.17. MakeSelectData メンバ関数説明 |
メンバ関数名 | MakeSelectData |
定義ファイル名 | TuneRegion.cpp |
定義行 | 187 |
所属名 | TTuneRegion |
アクセス属性 | public |
宣言形式 | void MakeSelectData ( int sPos ) |
概要 | Selectの解析を行う |
戻り値 | |
パラメタ説明 | sPos 開始位置 |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
参照外部変数一覧表
参照メンバ変数一覧表
参照先一覧表
関数論理チャート
| +--------------------------------------------+
187 +--+ void TTuneRegion::MakeSelectData(int sPos) |
188 | { |
+--+-----------------------------------------+
189 +--- int i,j,k,k2;
190 +--- TToken *Token;
191 +--- TScript *Script;
192 +--- AnsiString s;
193 +--- TScValData *ScValData;
194 +--- AnsiString ScValName;
195 +--- int Nest;
196 +--- TSubRegion *SubRegion;
197 +--- TValData *ValData;
198 +--- bool InSubRegionF = false;
199 |
200 +--- Token = (TToken *)TokenList->Items[sPos];
201 |
202 +--- //
203 | // 対象変数名を所得
204 | //
205 +--- ScValData = NULL;
206 +--- ScValName = "";
207 +--- //
208 | // 名前、参照変数(Setが先の場合は、不要)を求める
209 | //
210 | // Name指定なし時の対策 Add 2004/08/26
211 +--- Name = IntToStr(MainF->TuneRegionList->Count+1);
| +------------------------------+
212 +--+ if(TuneGroup == tgInstall){ |
| +--+---------------------------+
213 | +--- FuncName = "ABCLib_Install"+Name;
| +-+---+
214 | | } |
| +-+---+
| +-+---------------------------------+
214 | | else if(TuneGroup == tgStatic){ |
| +-+---------------------------------+
215 | +--- FuncName = "ABCLib_Static"+Name;
| +-+---+
216 | | } |
| +-+---+
| +-+---------------------------------+
216 | | else if(TuneGroup == tgDynamic){ |
| +-+---------------------------------+
217 | +--- FuncName = "ABCLib_Dynamic"+Name;
| +-+---+
218 | | } |
| +-----+
219 +--- Nest = 0;
220 +--- ArgValList->Clear();
| +------------------------------------------+
221 +--+ for(i = sPos ; i <= TokenEndPos ; i++){ |
| +--+---------------------------------------+
222 | +--- Token = (TToken *)TokenList->Items[i];
| | +----------------+
223 | +--+ if(Nest != 1){ |
| | +--+-------------+
224 | | +--- //
225 | | | // TRのネストは、Skipするが、
226 | | | // 変数に関しては、チェック対象とする。
227 | | | // 複数のSubRegionでの変数の参照・代入は統一していることが前提。
228 | | | //
| | | +----------------------------+
229 | | +--+ if(Token->Script != NULL){ |
| | | +--+-------------------------+
230 | | | +--- Script = (TScript *)Token->Script;
| | | | +------------------------------------+
231 | | | +--+ if(Script->ScRegion == scr_start){ |
| | | | +--+---------------------------------+
232 | | | | +--- Nest++;
| | | | +-+---+
233 | | | | | } |
| | | | +-+---+
| | | | +-+---------------------------------------+
233 | | | | | else if(Script->ScRegion == scr_end){ |
| | | | +-+---------------------------------------+
234 | | | | +--- Nest--;
| | | | +-+---+
235 | | | | | } |
| | | | +-----+
| | | +-+---+
236 | | | | } |
| | | +-----+
| | | +------------+
237 | | +--+ continue; |
| | | +------------+
| | +-+---+
238 | | | } |
| | +-----+
| | +----------------------------+
239 | +--+ if(Token->Script != NULL){ |
| | +--+-------------------------+
240 | | +--- Script = (TScript *)Token->Script;
| | | +----------------------------------------------------------+
241 | | +--+ if(Script->ScRegion == scr_start){ // region Start |
| | | +--+-------------------------------------------------------+
242 | | | +--- Nest++; // TR ネスト部分の処理
| | | | +------------+
243 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
244 | | | | } |
| | | +-+---+
| | | +-+-----------------------------------------------+
244 | | | | else if(Script->ScType == sct_name){ // name |
| | | +-+-----------------------------------------------+
245 | | | +--- Name = Script->TokStrList->Strings[2];
| | | | +------------------------------+
246 | | | +--+ if(TuneGroup == tgInstall){ |
| | | | +--+---------------------------+
247 | | | | +--- FuncName = "ABCLib_Install"+Name;
| | | | +-+---+
248 | | | | | } |
| | | | +-+---+
| | | | +-+---------------------------------+
248 | | | | | else if(TuneGroup == tgStatic){ |
| | | | +-+---------------------------------+
249 | | | | +--- FuncName = "ABCLib_Static"+Name;
| | | | +-+---+
250 | | | | | } |
| | | | +-+---+
| | | | +-+---------------------------------+
250 | | | | | else if(TuneGroup == tgDynamic){ |
| | | | +-+---------------------------------+
251 | | | | +--- FuncName = "ABCLib_Dynamic"+Name;
| | | | +-+---+
252 | | | | | } |
| | | | +-----+
| | | +-+---+
253 | | | | } |
| | | +-+---+
| | | +-+-------------------------------------------------+
253 | | | | else if(Script->ScType == sct_Number){ // number |
| | | +-+-------------------------------------------------+
254 | | | +--- Number = atoi(Script->TokStrList->Strings[2].c_str());
| | | +-+---+
255 | | | | } |
| | | +-+---+
| | | +-+---------------------------------------------------------+
255 | | | | else if(Script->ScType == sct_according){ // Acoording |
| | | +-+---------------------------------------------------------+
| | | | +----------------------------------------------------------------------+
256 | | | +--+ if(!InSubRegionF){ // SubRegion内の acordingは、SubRegion内のみ有効 |
| | | | +--+-------------------------------------------------------------------+
257 | | | | +--- UseAccordingF = true;
258 | | | | +--- AccordingStr = Token->OrgStr;
| | | | +-+---+
259 | | | | | } |
| | | | +-----+
| | | +-+---+
260 | | | | } |
| | | +-+---+
| | | +-+---------------------------------------+
260 | | | | else if(Script->ScType == sct_varied){ |
| | | +-+---------------------------------------+
261 | | | +--- //
262 | | | | // varried処理を行う。
263 | | | | //
| | | | +--------------------------------------------------------------------+
264 | | | +--+ if(!InSubRegionF){ // SubRegion内の variedは、SubRegion内のみ有効 |
| | | | +--+-----------------------------------------------------------------+
| | | | | +------------------------------------+
265 | | | | +--+ if(Script->ScValDataList == NULL){ |
| | | | | +--+---------------------------------+
266 | | | | | +--- MainF->err("varied の変数指定が見つかりません。");
| | | | | | +----------+
267 | | | | | +--+ return; |
| | | | | | +----------+
| | | | | +-+---+
268 | | | | | | } |
| | | | | +-----+
| | | | | +----------------------------------------+
269 | | | | +--+ if(Script->ScValDataList->Count == 0){ |
| | | | | +--+-------------------------------------+
270 | | | | | +--- MainF->err("varied の変数指定が見つかりません。");
| | | | | | +----------+
271 | | | | | +--+ return; |
| | | | | | +----------+
| | | | | +-+---+
272 | | | | | | } |
| | | | | +-----+
| | | | | +------------------------------------------------------+
273 | | | | +--+ for(k = 0 ; k < Script->ScValDataList->Count ; k++){ |
| | | | | +--+---------------------------------------------------+
274 | | | | | +--- ScValData = (TScValData *)Script->ScValDataList->Items[k];
275 | | | | | +--- variedValName[variedCount] = ScValData->Str;
276 | | | | | +--- variedValData[variedCount] = ScValData;
277 | | | | | +--- DoToken[variedCount] = NULL;
| | | | | | +------------------------------------------------------+
278 | | | | | +--+ for(j = 0 ; j < Script->TokStrList->Count-1 ; j++){ |
| | | | | | +--+---------------------------------------------------+
279 | | | | | | +--- s = Script->TokStrList->Strings[j];
| | | | | | | +--------------------------------------+
280 | | | | | | +--+ if(AnsiCompareText(s,"from") == 0){ |
| | | | | | | +--+-----------------------------------+
281 | | | | | | | +--- s = Script->TokStrList->Strings[j+1];
282 | | | | | | | +--- variedFromValue[variedCount] = atoi(s.c_str());
| | | | | | | +-+---+
283 | | | | | | | | } |
| | | | | | | +-+---+
| | | | | | | +-+---------------------------------------+
283 | | | | | | | | else if(AnsiCompareText(s,"to") == 0){ |
| | | | | | | +-+---------------------------------------+
284 | | | | | | | +--- s = Script->TokStrList->Strings[j+1];
285 | | | | | | | +--- variedToValue[variedCount] = atoi(s.c_str());
| | | | | | | +-+---+
286 | | | | | | | | } |
| | | | | | | +-----+
| | | | | | +-+---+
287 | | | | | | | } |
| | | | | | +-----+
288 | | | | | +--- variedCount++;
| | | | | +-+---+
289 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
290 | | | | | } |
| | | | +-----+
| | | +-+---+
291 | | | | } |
| | | +-+---+
| | | +-+-----------------------------------------+
291 | | | | else if(Script->ScType == sct_fitting){ |
| | | +-+-----------------------------------------+
292 | | | +--- //
293 | | | | // Fitting指定子の処理を行う。(TuneRegionへデータ複写のみ)
294 | | | | //
295 | | | +--- FittingType = Script->FittingType;
296 | | | +--- FittingDegree = Script->FittingDegree;
297 | | | +--- SampledList = Script->SampledList;
298 | | | +--- // }else if(Script->ScRegion == scr_substart){ // Sub region Start
| | | +-+---+
299 | | | | } |
| | | +-+---+
| | | +-+-------------------------------------------------------------------+
299 | | | | else if((Script->ScRegion == scr_substart) |
300 | | | | &&(Script->ScType == sct_select)){ // Sub region Start |
| | | +-+-------------------------------------------------------------------+
301 | | | +--- InSubRegionF = true;
302 | | | +--- SubRegion = new TSubRegion();
303 | | | +--- SubRegion->TokenStartPos = i;
304 | | | +--- SubRegion->ScType = Script->ScType;
305 | | | +--- SubRegion->AccordingStr = AccordingStr;
306 | | | +--- SubRegionList->Add((void *)SubRegion);
307 | | | |
| | | | +----------------------------------------------------------+
308 | | | +--+ for(j = 0 ; j < variedCount ; j++){ // varidCountを継承 |
| | | | +--+-------------------------------------------------------+
309 | | | | +--- SubRegion->variedValName[j] = variedValName[j];
310 | | | | +--- SubRegion->variedValData[j] = variedValData[j];
311 | | | | +--- SubRegion->variedFromValue[j] = variedFromValue[j];
312 | | | | +--- SubRegion->variedToValue[j] = variedToValue[j];
| | | | +-+---+
313 | | | | | } |
| | | | +-----+
314 | | | +--- SubRegion->variedCount = variedCount;
315 | | | |
| | | | +--------------------------------------+
316 | | | +--+ for(j = i ; j <= TokenEndPos ; j++){ |
| | | | +--+-----------------------------------+
317 | | | | +--- Token = (TToken *)TokenList->Items[j];
| | | | | +----------------------------+
318 | | | | +--+ if(Token->Script != NULL){ |
| | | | | +--+-------------------------+
319 | | | | | +--- Script = (TScript *)Token->Script;
| | | | | | +------------------------------------+
320 | | | | | +--+ if(Script->ScRegion == scr_start){ |
| | | | | | +--+---------------------------------+
321 | | | | | | +--- // Nestしている場合は、region end まで Skipする。
| | | | | | | +----------------------------------+
322 | | | | | | +--+ for( ; j <= TokenEndPos ; j++){ |
| | | | | | | +--+-------------------------------+
323 | | | | | | | +--- Token = (TToken *)TokenList->Items[j];
| | | | | | | | +----------------------------+
324 | | | | | | | +--+ if(Token->Script != NULL){ |
| | | | | | | | +--+-------------------------+
325 | | | | | | | | +--- Script = (TScript *)Token->Script;
| | | | | | | | | +----------------------------------+
326 | | | | | | | | +--+ if(Script->ScRegion == scr_end){ |
| | | | | | | | | +--+-------------------------------+
| | | | | | | | | | +--------+
327 | | | | | | | | | +--+ break; |
| | | | | | | | | | +--------+
| | | | | | | | | +-+---+
328 | | | | | | | | | | } |
| | | | | | | | | +-----+
| | | | | | | | +-+---+
329 | | | | | | | | | } |
| | | | | | | | +-----+
| | | | | | | +-+---+
330 | | | | | | | | } |
| | | | | | | +-----+
| | | | | | +-+---+
331 | | | | | | | } |
| | | | | | +-+---+
| | | | | | +-+-----------------------------------------+
331 | | | | | | | else if(Script->ScRegion == scr_subend){ |
| | | | | | +-+-----------------------------------------+
| | | | | | | +--------+
332 | | | | | | +--+ break; |
| | | | | | | +--------+
| | | | | | +-+---+
333 | | | | | | | } |
| | | | | | +-+---+
| | | | | | +-+---------------------------------------------------------+
333 | | | | | | | else if(Script->ScType == sct_according){ // Acoording |
| | | | | | +-+---------------------------------------------------------+
334 | | | | | | +--- UseAccordingF = true;
335 | | | | | | +--- SubRegion->AccordingStr = Token->OrgStr;
| | | | | | +-+---+
336 | | | | | | | } |
| | | | | | +-+---+
| | | | | | +-+---------------------------------------+
336 | | | | | | | else if(Script->ScType == sct_varied){ |
| | | | | | +-+---------------------------------------+
337 | | | | | | +--- //
338 | | | | | | | // varried処理を行う。
339 | | | | | | | //
| | | | | | | +------------------------------------+
340 | | | | | | +--+ if(Script->ScValDataList == NULL){ |
| | | | | | | +--+---------------------------------+
341 | | | | | | | +--- MainF->err("varied の変数指定が見つかりません。");
| | | | | | | | +----------+
342 | | | | | | | +--+ return; |
| | | | | | | | +----------+
| | | | | | | +-+---+
343 | | | | | | | | } |
| | | | | | | +-----+
| | | | | | | +----------------------------------------+
344 | | | | | | +--+ if(Script->ScValDataList->Count == 0){ |
| | | | | | | +--+-------------------------------------+
345 | | | | | | | +--- MainF->err("varied の変数指定が見つかりません。");
| | | | | | | | +----------+
346 | | | | | | | +--+ return; |
| | | | | | | | +----------+
| | | | | | | +-+---+
347 | | | | | | | | } |
| | | | | | | +-----+
| | | | | | | +------------------------------------------------------+
348 | | | | | | +--+ for(k = 0 ; k < Script->ScValDataList->Count ; k++){ |
| | | | | | | +--+---------------------------------------------------+
349 | | | | | | | +--- ScValData = (TScValData *)Script->ScValDataList->Items[k];
350 | | | | | | | +--- SubRegion->variedValName[variedCount] = ScValData->Str;
351 | | | | | | | +--- SubRegion->variedValData[variedCount] = ScValData;
| | | | | | | | +--------------------------------------------------------+
352 | | | | | | | +--+ for(k2 = 0 ; k2 < Script->TokStrList->Count-1 ; k2++){ |
| | | | | | | | +--+-----------------------------------------------------+
353 | | | | | | | | +--- s = Script->TokStrList->Strings[k2];
| | | | | | | | | +--------------------------------------+
354 | | | | | | | | +--+ if(AnsiCompareText(s,"from") == 0){ |
| | | | | | | | | +--+-----------------------------------+
355 | | | | | | | | | +--- s = Script->TokStrList->Strings[k2+1];
356 | | | | | | | | | +--- SubRegion->variedFromValue[variedCount] = atoi(s.c_str());
| | | | | | | | | +-+---+
357 | | | | | | | | | | } |
| | | | | | | | | +-+---+
| | | | | | | | | +-+---------------------------------------+
357 | | | | | | | | | | else if(AnsiCompareText(s,"to") == 0){ |
| | | | | | | | | +-+---------------------------------------+
358 | | | | | | | | | +--- s = Script->TokStrList->Strings[k2+1];
359 | | | | | | | | | +--- SubRegion->variedToValue[variedCount] = atoi(s.c_str());
| | | | | | | | | +-+---+
360 | | | | | | | | | | } |
| | | | | | | | | +-----+
| | | | | | | | +-+---+
361 | | | | | | | | | } |
| | | | | | | | +-----+
362 | | | | | | | +--- SubRegion->variedCount++;
| | | | | | | +-+---+
363 | | | | | | | | } |
| | | | | | | +-----+
| | | | | | +-+---+
364 | | | | | | | } |
| | | | | | +-----+
| | | | | +-+---+
365 | | | | | | } |
| | | | | +-----+
| | | | +-+---+
366 | | | | | } |
| | | | +-----+
367 | | | +--- SubRegion->TokenEndPos = j;
| | | | +------------------------+
368 | | | +--+ if(j >= TokenEndPos){ |
| | | | +--+---------------------+
369 | | | | +--- MainF->err("sub region endが見つかりません。");
| | | | +-+---+
370 | | | | | } |
| | | | +-----+
371 | | | |
| | | +-+---+
372 | | | | } |
| | | +-+---+
| | | +-+-----------------------------------------+
372 | | | | else if(Script->ScRegion == scr_subend){ |
| | | +-+-----------------------------------------+
373 | | | +--- InSubRegionF = false;
| | | +-+---+
374 | | | | } |
| | | +-----+
| | +-+---+
375 | | | } |
| | +-----+
| +-+---+
376 | | } |
| +-----+
377 +--- MakeArgValList(); // TRのサブルーチンに渡す引数リストを生成する。
378 +--- //
379 | // Case数を計算する。
380 | // SubRegionがある場合は、各SubReguionの varied数だけのCaseの総和
381 | // SubRegionがない場合は、varied数だけのCase
382 | //
| +--------------------------------+
383 +--+ if(SubRegionList->Count > 0){ |
| +--+-----------------------------+
384 | +--- int SubCaseCount;
385 | |
386 | +--- CaseCount = 0;
| | +----------------------------------------------+
387 | +--+ for(j = 0 ; j < SubRegionList->Count; j++){ |
| | +--+-------------------------------------------+
388 | | +--- SubRegion = (TSubRegion *)SubRegionList->Items[j];
389 | | +--- SubCaseCount = 1;
| | | +--------------------------------------------------------------------------+
390 | | +--+ for(k = 0 ; k < SubRegion->variedCount ; k++){ // SubRegionがない場合の |
| | | +--+-----------------------------------------------------------------------+
391 | | | +--- SubCaseCount *= (SubRegion->variedToValue[k] - SubRegion->variedFromValue[k] + 1);
| | | +-+---+
392 | | | | } |
| | | +-----+
393 | | +--- SubRegion->CaseCount = SubCaseCount;
394 | | +--- CaseCount += SubCaseCount;
| | +-+---+
395 | | | } |
| | +-----+
| +-+---+
396 | | } |
| +-+---+
| +-+-------+
396 | | else{ |
| +-+-------+
397 | +--- // SubRegionがない場合の処理
398 | +--- CaseCount = 1;
| | +--------------------------------------------------------------+
399 | +--+ for(k = 0 ; k < variedCount ; k++){ // SubRegionがない場合の |
| | +--+-----------------------------------------------------------+
400 | | +--- CaseCount *= (variedToValue[k] - variedFromValue[k] + 1);
| | +-+---+
401 | | | } |
| | +-----+
| +-+---+
402 | | } |
| +-----+
403 +--- //
404 | // varied from to で定数に置換される変数は、引数リストから参照扱いをCUT
405 | // 現状、同一名で、片側は変数として使用、もう一方は引数と指定使用は出来ない。
406 | // 最終的には、エラーメッセージが必要?
407 | //
| +----------------------------------------------+
408 +--+ for(i = 0 ; i < SubRegionList->Count; i++){ |
| +--+-------------------------------------------+
409 | +--- SubRegion = (TSubRegion *)SubRegionList->Items[i];
| | +------------------------------------------------+
410 | +--+ for(k = 0 ; k < SubRegion->variedCount ; k++){ |
| | +--+---------------------------------------------+
411 | | +--- s = SubRegion->variedValName[k];
| | | +--------------------------------------------+
412 | | +--+ for(j = 0 ; j < ArgValList->Count ; j++){ |
| | | +--+-----------------------------------------+
| | | | +------------------------------------------------------+
413 | | | +--+ if(AnsiCompareText(ArgValList->Strings[j],s) == 0){ |
| | | | +--+---------------------------------------------------+
414 | | | | +--- ArgValList->Strings[j] = "";
| | | | +-+---+
415 | | | | | } |
| | | | +-----+
| | | +-+---+
416 | | | | } |
| | | +-----+
| | +-+---+
417 | | | } |
| | +-----+
| +-+---+
418 | | } |
| +-----+
| +--------------------------------------+
419 +--+ for(k = 0 ; k < variedCount ; k++){ |
| +--+-----------------------------------+
420 | +--- s = variedValName[k];
| | +--------------------------------------------+
421 | +--+ for(j = 0 ; j < ArgValList->Count ; j++){ |
| | +--+-----------------------------------------+
| | | +------------------------------------------------------+
422 | | +--+ if(AnsiCompareText(ArgValList->Strings[j],s) == 0){ |
| | | +--+---------------------------------------------------+
423 | | | +--- ArgValList->Strings[j] = "";
| | | +-+---+
424 | | | | } |
| | | +-----+
| | +-+---+
425 | | | } |
| | +-----+
| +-+---+
426 | | } |
| +-----+
427 +--- //
428 | // ArgValListを定義順にSortする。
429 | // ""(最初に代入で使用)も、必要なので、削除はしないこと
430 | //
431 +--- SortArgValList();
432 +--- SaveAndResetValBits(TokenStartPos,TokenEndPos); // 変数識別を、保存してリセット
+-+---+
433 | } |
+-----+