-3

C プログラムを制御フロー グラフに変換するための Java コードが必要です。

誰でも私を助けてくれませんか?

4

1 に答える 1

2

7 月 12 日締め切りを迎えるのは大変ですが、あなたならやり遂げることができます。

このプロジェクトを自分で完了する場合に使用する一般的な戦略は次のとおりです。

  1. 入力 C ファイル (翻訳単位とも呼ばれます) を前処理します。これにより、前処理された翻訳単位が生成されます。
  2. 前処理された翻訳単位を抽象構文木 (AST) として解析します。
  3. nAST をトラバースして、関数宣言ごとにグラフ ノードを作成します。(関数名, n) をマップに追加します。
  4. AST をトラバースして、制御フローのグラフを作成します。制御フロー グラフで次の特殊なケースをどのように表現するかを検討してください。
    • ラベル付きステートメント
    • if/else
    • ifが続かないelse
    • goto
    • switch
    • breakフォールスルー ケースおよびswitch.
    • do... while、、、などのwhileループfor
    • breakループ内
    • continueループ内
    • return
    • 通常の関数呼び出し
    • 関数ポインターのターゲットの呼び出し
    • void関数定義の終了(いいえreturn)
    • int main()int main(int, char**)の終わり。return
    • exit
    • 中間値
  5. グラフをDOT 形式で出力します。

このテスト プログラムを使用することをお勧めします。これには、「特別な」ケースがすべて含まれていると思います。

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

void usage(const char *arg0)
{
    fprintf(stderr, "Usage: %s [INTEGER]\n", arg0);
    fprintf(stderr, "Dummy program\n");
    exit(EXIT_FAILURE);
}

int g_a;

void init()
{
    g_a = 3;
}

int return_4()
{
    return 4;
}

void uninit()
{
}

int main(int argc, char **argv)
{
    if (argc <= 1) {
        usage(argv[0]);
    }

    if (argc > 2) {
        printf("You only need to pass one argument.\n");
    }
    else {
        init();
    }

    const int i = atoi(argv[1]);
    int j;
before_switch: j = 0;
switch_i: switch (i) {
        case 3:
            for(; j < 3; ++j)
                printf(".");
        case 17:
            for(; j < 17; ++j)
                printf(".");
            if (i == 3 || i == 17)
                printf("\n");
        case -4:
            printf("You picked one of my favorite numbers (17, 3, and -4)!\n");
            break;

        case -1:
            printf("Cleaning up\n");
            goto cleanup;

        default:
            printf("I don't like that number.\n");
    }

    j = 0;
do_loop_1: do {
        if (j++ % 2 == 0)
            continue;
        if (j == 10)
            break;

        printf("j is %d.\n", j);
    } while(j < 30);

    j = 10;
    while (j > 0) {
        if (4 == return_4())
            break;
        --j;
    }

    void (*voidFn)() = &uninit;
    voidFn();
    init();

cleanup:
    uninit();
    return EXIT_SUCCESS;
}

また、次のオープン ソース ライブラリも使用します。

  1. 翻訳単位を前処理するための C プリプロセッサの純粋な Java 実装であるJCPP
  2. ANTLR C文法と一緒に解析するためのANTLR
  3. グラフ データ構造とグラフ描画用のGrappa (必要な場合)
于 2010-06-21T19:36:57.827 に答える