abc プロジェクト
メンバ関数名 | TScript |
定義ファイル名 | pass3.cpp |
定義行 | 116 |
所属名 | TScript |
アクセス属性 | public |
宣言形式 | TScript ( TList * TokenList , int sPos ) |
概要 | スクリプトデータを生成する。スクリプトの種類に応じた処理が行われる。 必要な場合は、スクリプト変数生成も行われる。 |
戻り値 | |
パラメタ説明 | TokenList トークンリスト sPos トークンリスト開始位置 |
機能説明 | |
備考 | |
呼出し先関数一覧表
参照メンバ変数一覧表
参照先一覧表
関数論理チャート
| +----------------------------------------------+
116 +--+ TScript::TScript(TList *TokenList,int sPos) |
117 | { |
+--+-------------------------------------------+
118 +--- AnsiString s,s1;
119 +--- int pos;
120 +--- int i;
121 +--- TToken *Token = (TToken *)TokenList->Items[sPos];
122 +--- TokStrList = new TStringList;
123 |
124 +--- TokPos = sPos;
125 +--- Str = Token->Str; // 注釈全体の文字列
126 +--- ScValDataList = NULL;
127 +--- TuneRegion = NULL;
128 +--- ScType = sct_install;
129 +--- ScAction = sca_none;
130 +--- ScRegion = scr_none;
131 |
132 +--- // Fitting関連のデータ
133 +--- FittingType = 0;
134 +--- FittingDegree = 0; // 多項式の次数
135 +--- SampledList = NULL; // intの形で Sampledの値がセット
136 |
137 +--- //
138 | // トークンに分解する。
139 | // Scriptでのセパレータは、通常より少ない。
140 | // これは、least-squares などを1トークンとして扱うため。
141 | //
142 +--- s1 = "";
143 +--- s = Str;
| +--------------------------------------+
144 +--+ for(i = 1 ; i <= s.Length() ; i++){ |
| +--+-----------------------------------+
| | +------------------------------------------------------------------+
145 | +--+ if((s[i] == ' ')||(s[i] == '(')||(s[i] == ')')||(s[i] == ',')){ |
| | +--+---------------------------------------------------------------+
146 | | |
147 | | +--- s1 = Trim(s1);
| | | +----------------+
148 | | +--+ if(s1 != ""){ |
| | | +--+-------------+
149 | | | +--- TokStrList->Add(s1);
| | | +-+---+
150 | | | | } |
| | | +-----+
151 | | +--- s1 = s[i];
| | | +----------------+
152 | | +--+ if(s1 != " "){ |
| | | +--+-------------+
153 | | | +--- TokStrList->Add(s1);
| | | +-+---+
154 | | | | } |
| | | +-----+
155 | | +--- s1 = "";
| | +-+---+
156 | | | } |
| | +-+---+
| | +-+-------+
156 | | | else{ |
| | +-+-------+
157 | | +--- s1 += s[i];
| | +-+---+
158 | | | } |
| | +-----+
| +-+---+
159 | | } |
| +-----+
160 +--- s1 = Trim(s1);
| +----------------+
161 +--+ if(s1 != ""){ |
| +--+-------------+
162 | +--- TokStrList->Add(s1);
| +-+---+
163 | | } |
| +-----+
164 +--- /*
165 | for(i = 0 ; i < TokStrList->Count ; i++){
166 | MainF->print(TokStrList->Strings[i]);
167 | }
168 | */
169 +--- // スクリプトトークン解析
170 +--- i = 0;
171 +--- i++; // Skip "!ABCLib$"
| +------------------------------+
172 +--+ if(i >= TokStrList->Count){ |
| +--+---------------------------+
| | +----------+
173 | +--+ return; |
| | +----------+
| +-+---+
174 | | } |
| +-----+
175 +--- s = TokStrList->Strings[i++];
| +----------------------------------------+
176 +--+ if(AnsiCompareText(s,"install") == 0){ |
| +--+-------------------------------------+
177 | +--- ScType = sct_install; // 自動チューニング種類
| +-+---+
178 | | } |
| +-+---+
| +-+-------------------------------------------+
178 | | else if(AnsiCompareText(s,"static") == 0){ |
| +-+-------------------------------------------+
179 | +--- ScType = sct_static; // 自動チューニング種類
| +-+---+
180 | | } |
| +-+---+
| +-+---------------------------------------------+
180 | | else if(AnsiCompareText(s,"dynamic") == 0){ |
| +-+---------------------------------------------+
181 | +--- ScType = sct_dynamic; // 自動チューニング種類
182 | |
| +-+---+
183 | | } |
| +-+---+
| +-+-----------------------------------------+
183 | | else if(AnsiCompareText(s,"name") == 0){ |
| +-+-----------------------------------------+
184 | +--- ScType = sct_name; // 自動チューニング種類
| +-+---+
185 | | } |
| +-+---+
| +-+-----------------------------------------------+
185 | | else if(AnsiCompareText(s,"parameter") == 0){ |
| +-+-----------------------------------------------+
186 | +--- ScType = sct_parameter;
| +-+---+
187 | | } |
| +-+---+
| +-+-------------------------------------------+
187 | | else if(AnsiCompareText(s,"select") == 0){ |
| +-+-------------------------------------------+
188 | +--- ScType = sct_select;
| +-+---+
189 | | } |
| +-+---+
| +-+-----------------------------------------------+
189 | | else if(AnsiCompareText(s,"according") == 0){ |
| +-+-----------------------------------------------+
190 | +--- ScType = sct_according;
| +-+---+
191 | | } |
| +-+---+
| +-+-------------------------------------------+
191 | | else if(AnsiCompareText(s,"varied") == 0){ |
| +-+-------------------------------------------+
192 | +--- ScType = sct_varied;
| +-+---+
193 | | } |
| +-+---+
| +-+---------------------------------------------+
193 | | else if(AnsiCompareText(s,"fitting") == 0){ |
| +-+---------------------------------------------+
194 | +--- ScType = sct_fitting;
| +-+---+
195 | | } |
| +-+---+
| +-+-------------------------------------------+
195 | | else if(AnsiCompareText(s,"pripro") == 0){ |
| +-+-------------------------------------------+
196 | +--- ScType = sct_pripro;
| +-+---+
197 | | } |
| +-+---+
| +-+---------------------------------------------+
197 | | else if(AnsiCompareText(s,"postpro") == 0){ |
| +-+---------------------------------------------+
198 | +--- ScType = sct_postpro;
| +-+---+
199 | | } |
| +-+---+
| +-+-------------------------------------------+
199 | | else if(AnsiCompareText(s,"debug") == 0){ |
| +-+-------------------------------------------+
200 | +--- ScType = sct_debug;
| +-+---+
201 | | } |
| +-+---+
| +-+-------------------------------------------------------+
201 | | else if(AnsiCompareText(s,"ABCLib_DynPefThis") == 0){ |
| +-+-------------------------------------------------------+
202 | +--- ScType = sct_DynPefThis;
| +-+---+
203 | | } |
| +-+---+
| +-+-------------------------------------------+
203 | | else if(AnsiCompareText(s,"Number") == 0){ |
| +-+-------------------------------------------+
204 | +--- ScType = sct_Number;
| +-+---+
205 | | } |
| +-+---+
| +-+-------------------------------------------+
205 | | else if(AnsiCompareText(s,"BPset") == 0){ |
| +-+-------------------------------------------+
206 | +--- ScType = sct_BPset;
| +-+---+
207 | | } |
| +-+---+
| +-+-------------+
207 | | else{ // 式 |
| +-+-------------+
208 | +--- ScType = sct_command; // 自動チューニング種類
209 | +--- // コマンドの場合は、TokStrListを1つだけに修正する。
210 | +--- TokStrList->Clear();
211 | +--- s = Str;
212 | +--- s.Delete(1,8); // Delete "!ABCLib$"
213 | +--- s = " "+Trim(s);
214 | +--- TokStrList->Add(s);
| | +----------+
215 | +--+ return; |
| | +----------+
| +-+---+
216 | | } |
| +-----+
217 +--- // 機能をチェック
| +------------------------------+
218 +--+ if(i >= TokStrList->Count){ |
| +--+---------------------------+
| | +----------+
219 | +--+ return; |
| | +----------+
| +-+---+
220 | | } |
| +-----+
| +----------------------------+
221 +--+ if(ScType == sct_fitting){ |
| +--+-------------------------+
222 | +--- GetFittingParam(TokenList,i);
| | +----------+
223 | +--+ return; |
| | +----------+
| +-+---+
224 | | } |
| +-----+
225 +--- s = TokStrList->Strings[i++];
| +----------------------------------------+
226 +--+ if(AnsiCompareText(s,"define") == 0){ |
| +--+-------------------------------------+
227 | +--- ScAction = sca_define;
| +-+---+
228 | | } |
| +-+---+
| +-+---------------------------------------------+
228 | | else if(AnsiCompareText(s,"variable") == 0){ |
| +-+---------------------------------------------+
229 | +--- ScAction = sca_variable;
| +-+---+
230 | | } |
| +-+---+
| +-+-------------------------------------------+
230 | | else if(AnsiCompareText(s,"select") == 0){ |
| +-+-------------------------------------------+
231 | +--- ScAction = sca_select;
| +-+---+
232 | | } |
| +-+---+
| +-+-------------------------------------------+
232 | | else if(AnsiCompareText(s,"unroll") == 0){ |
| +-+-------------------------------------------+
233 | +--- ScAction = sca_unroll;
| +-+---+
234 | | } |
| +-+---+
| +-+-------+
234 | | else{ |
| +-+-------+
235 | +--- ScAction = sca_none;
236 | +--- i--; // 該当なしの場合は、1つ戻す。
| +-+---+
237 | | } |
| +-----+
238 +--- //
239 | // 対象変数リストを作成する。 () 内の場合
240 | //
241 +--- TScValData *ScValData;
| +------------------------------+
242 +--+ if(i >= TokStrList->Count){ |
| +--+---------------------------+
| | +----------+
243 | +--+ return; |
| | +----------+
| +-+---+
244 | | } |
| +-----+
245 +--- s = TokStrList->Strings[i++];
| +----------------+
246 +--+ if(s == "("){ |
| +--+-------------+
| | +--------------------------------------+
247 | +--+ for(; i < TokStrList->Count ; i++){ |
| | +--+-----------------------------------+
248 | | +--- s = TokStrList->Strings[i];
| | | +----------------+
249 | | +--+ if(s == ")"){ |
| | | +--+-------------+
250 | | | +--- i++;
| | | | +--------+
251 | | | +--+ break; |
| | | | +--------+
| | | +-+---+
252 | | | | } |
| | | +-----+
253 | | +--- s = TokStrList->Strings[i];
| | | +----------------+
254 | | +--+ if(s == ","){ |
| | | +--+-------------+
| | | | +------------+
255 | | | +--+ continue; |
| | | | +------------+
| | | +-+---+
256 | | | | } |
| | | +-----+
257 | | +--- // 変数を追加する。(同名の変数があれば、共有する)
258 | | +--- ScValData = GetScValData(TokenList,s);
259 | | +--- ScValData->RefCount++;
| | | +----------------------------+
260 | | +--+ if(ScValDataList == NULL){ |
| | | +--+-------------------------+
261 | | | +--- ScValDataList = new TList;
| | | +-+---+
262 | | | | } |
| | | +-----+
263 | | +--- ScValDataList->Add((void *)ScValData);
| | +-+---+
264 | | | } |
| | +-----+
| +-+---+
265 | | } |
| +-+---+
| +-+-------+
265 | | else{ |
| +-+-------+
266 | +--- i--;
| +-+---+
267 | | } |
| +-----+
268 +--- //
269 | // 変数の後の region start , region end をチェックして ScRegionにセット
270 | // sub region start , sub region end も対象となる。
271 | //
| +------------------------------+
272 +--+ if(i >= TokStrList->Count){ |
| +--+---------------------------+
| | +----------+
273 | +--+ return; |
| | +----------+
| +-+---+
274 | | } |
| +-----+
275 +--- s = TokStrList->Strings[i++];
| +----------------------------------------+
276 +--+ if(AnsiCompareText(s,"region") == 0){ |
| +--+-------------------------------------+
| | +------------------------------+
277 | +--+ if(i >= TokStrList->Count){ |
| | +--+---------------------------+
| | | +----------+
278 | | +--+ return; |
| | | +----------+
| | +-+---+
279 | | | } |
| | +-----+
280 | +--- s = TokStrList->Strings[i++];
| | +--------------------------------------+
281 | +--+ if(AnsiCompareText(s,"start") == 0){ |
| | +--+-----------------------------------+
282 | | +--- ScRegion = scr_start;
| | +-+---+
283 | | | } |
| | +-+---+
| | +-+-----------------------------------------+
283 | | | else if(AnsiCompareText(s,"end") == 0){ |
| | +-+-----------------------------------------+
284 | | +--- ScRegion = scr_end;
| | +-+---+
285 | | | } |
| | +-----+
| +-+---+
286 | | } |
| +-+---+
| +-+-----------------------------------------+
286 | | else if(AnsiCompareText(s,"sub") == 0){ |
| +-+-----------------------------------------+
287 | +--- s = TokStrList->Strings[i++];
| | +----------------------------------------+
288 | +--+ if(AnsiCompareText(s,"region") == 0){ |
| | +--+-------------------------------------+
| | | +------------------------------+
289 | | +--+ if(i >= TokStrList->Count){ |
| | | +--+---------------------------+
| | | | +----------+
290 | | | +--+ return; |
| | | | +----------+
| | | +-+---+
291 | | | | } |
| | | +-----+
292 | | +--- s = TokStrList->Strings[i++];
| | | +--------------------------------------+
293 | | +--+ if(AnsiCompareText(s,"start") == 0){ |
| | | +--+-----------------------------------+
294 | | | +--- ScRegion = scr_substart;
| | | +-+---+
295 | | | | } |
| | | +-+---+
| | | +-+-----------------------------------------+
295 | | | | else if(AnsiCompareText(s,"end") == 0){ |
| | | +-+-----------------------------------------+
296 | | | +--- ScRegion = scr_subend;
| | | +-+---+
297 | | | | } |
| | | +-----+
| | +-+---+
298 | | | } |
| | +-----+
| +-+---+
299 | | } |
| +-----+
+-+---+
300 | } |
+-----+