abc プロジェクト
関数名 | 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 変数リスト |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
参照外部変数一覧表
参照先一覧表
関数論理チャート
| +------------------------------------------------------------------------+
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 | } |
+-----+