2

この件に関してあなたの考えをお聞きしたいだけです。ある重要な理由から、C ソース ファイル (例: main.c) の "main()" 関数内で呼び出された関数のすべての関数名を抽出/取得する必要があります。

ソースコードの例:

int main()
{
    int a = functionA(); // functionA must be extracted
    int b = functionB(); // functionB must be extracted
}

ご存知のように、これらの関数呼び出しを識別するためのマーカー/記号として使用できるのは、括弧 "()" だけです。この関数名の抽出を実装する際に、いくつかの要因を既に検討しました。
1. 関数にはパラメータがある場合があります。例: functionA(100)
2. ループ演算子。例: while() 3. その他の演算子。例: if()、else if() 4. スペースを含まない関数呼び出し間のその他の演算子。例: functionA()+functionB()

現時点では、あなたの言っていることはわかります。これは $$$ の苦痛です...だから、あなたの考えやアイデアを共有してください...そして、これについては我慢してください...

注:これはC++言語です...

4

3 に答える 3

3

FLEX (または LEX) と BISON (または YACC) を組み合わせて Small C++ パーサーを作成できます。

  1. C++ の文法を取る
  2. 上記のツールを使用して C++ プログラム パーサーを生成する
  3. そのプログラムに、言及している関数呼び出しをカウントさせる

あなたがする必要があることには少し複雑すぎるかもしれませんが、それは確かにうまくいくはずです。そして、LEX/YACC は素晴らしいツールです。

于 2010-10-24T10:20:14.510 に答える
2

1 つのオプションは、独自の C トークナイザーを作成し (単純: 文字列、文字定数、およびコメントをスキップするように十分注意してください)、{開いている の数をカウントし、その中の識別子 + のインスタンスを見つける単純なパーサーを作成すること(です。ただし、これは 100% 正しいわけではありません。このオプションの欠点は、プリプロセッサ ディレクティブ (#includeおよび など) を実装するのが面倒なことです。ファイルで定義され#defineたマクロ ( など) から呼び出される関数が存在する可能性があります。getchar#include

100% 有効なオプションは、.cファイルをアセンブリ ファイル (例: gcc -S file.c) にコンパイルcallし、file.S. .c同様のオプションは、ファイルをオブジェクト ファイルにコンパイルすることです。たとえば、 を使用gcc -c file.cして逆アセンブリ ダンプを生成し、指示objdump -d file.oを検索しcallます。

別のオプションは、Clang / LLVM を使用してパーサーを見つけることです。

于 2010-10-24T10:26:58.053 に答える
2

gnucflowが役立つかもしれません

于 2010-10-24T10:38:46.777 に答える