abc プロジェクト
関数名 | Pass1_2 |
定義ファイル名 | pass1.cpp |
定義行 | 317 |
宣言形式 | void Pass1_2 ( TList * TokenList ) |
概要 | トークンリストを調べて、 go to などの複数のトークンをひとつにまとめる また、-1(未確定)トークンに値を設定する。 DO や IF などの予約語についての識別もここで行う! |
戻り値 | |
パラメタ説明 | TokenList トークンリスト |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
|
名称 |
定義ファイル名 |
定義行 |
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 |
|
|
参照先一覧表
関数論理チャート
| +--------------------------------+
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 | } |
+-----+