1

C ソース ファイルがあり、関数内の特定のローカル変数を見つけてそれをグローバルにしたい場合 - 別のツールで C ファイルを処理できるようにする (私が作成したツールではありません) 最も簡単な方法は何でしょうか?これを行う?私は正規表現を使用することを考えていましたが、それでも独自の問題があります。それは Java でミニ C パーサーを書くようなものです..多くの作業:S

これを簡単にするのに役立つライブラリはありますか?

たとえば、変数「i」をグローバル変数にしたいとします。ユーザーは、関数名と変数名を指定します (ただし、変数の型、つまり「int」は指定しません)。

正規表現を使用して関数を見つけることができます-確かに。しかし、そこからは、最善のアプローチが何であるかが本当にわかりません.... CDTプラグインは役に立ちますか?

例:

 /* 
  * add.c
  * a simple C program
  *
  */

#include <stdio.h>
#define LAST 10

int main()
{
    int i = 0;
    int sum = 0;

    for ( i = 1; i <= LAST; i++ ) {
      sum += i;
    } /*-for-*/
    printf("sum = %d\n", sum);

    return 0;
}

に変換:

 /* 
  * add.c
  * a simple C program
  *
  */

#include <stdio.h>
#define LAST 10

int i = 0;

int main()
{

    int sum = 0;

    for ( i = 1; i <= LAST; i++ ) {
      sum += i;
    } /*-for-*/
    printf("sum = %d\n", sum);

    return 0;
}
4

3 に答える 3

2

些細な例だけを行う場合は、Perl または Java 正規表現を使用してこれをハックできます。実際のパーサーが必要なため、複雑なプログラムでは確実に機能しません。

当社のDMS ソフトウェア リエンジニアリング ツールキットとそのC フロント エンドは、これにかなり確実に使用できます。

DMS は、プログラミング言語の記述によってパラメーター化された汎用プログラム分析および変換機能を提供します。DMS の C Front は、C の正確な構文を DMS に説明します (GCC や MS を含む C のさまざまな方言)。事実上、完全なパーサーを提供し、Abstract Syntax ツリー (およびその逆: AST からの C コード ジェネレーター) を生成します。これにより、DMS は前処理を含め、C ソース ファイルを正確に読み取ることができます。

解析された AST 形式のコードを使用して、DMS 関数を作成したり、パターンを記述して関数定義、特にターゲット変数を検索したりできます。次に、DMS コードまたは別のソースからソースへの変換を使用して、関数から変数を持ち上げたり、コードを挿入してその変数の状態変化を追跡したりして、それを確認できるようにします。

したがって、DMS といくつかのカスタム コードを使用すると、目的の効果を得ることができます。あなたが提供した例は、おそらくDMSで行うのはかなり簡単ですが、学習曲線はまだたくさんあります。DMS が扱う言語が複雑であるため、DMS は複雑であり、その使用方法を習得する必要があります。したがって、これは初心者向けの午後のエクササイズではありません。

注: 前処理されたプログラムに対してこれを行う必要があります (そうしないと、通常、それらを確実に解析することができなくなります)。したがって、これはコンパイルの直前に行うべきものであり、最終的なコードの一部になるべきではありません。

コードを永続的に変更したい場合は、前処理されていないコードを解析する必要があります。それは非常に難しいです。DMS の C フロント エンドは、プリプロセッサ ディレクティブが「構造化」されている範囲でこれを行うことができます。それらの約95%がそうです。つまり、構造化されていないものを修正するか (1 回限りの手動変更)、解析できないファイルを「不運」で拒否するかのいずれかです。

DMS の代わりに GCC を使用することもできます。結局のところ、非常によくテストされた C パーサーがあります。ただし、変更された C コードを生成するのには役立ちません。もう 1 つの代替手段は Clang です。これは、かなり優れた代替手段として急速に登場しています。C++ を解析すると思います。C、特にエンドユーザーが使用している可能性のあるCの方言についてはよくわかりません(あなたは言いませんでした)。DMS のような AST と、動作する可能性のあるコードへの「パッチ」を生成するための一種のスキームがあります。

于 2012-07-20T19:12:26.383 に答える
1

そのような変換を行う方法を考え出すことができたとしても、それは良い考えではないと思います. 建設と破壊の間を移動するため、プログラムは同じままではありません。また、すべての型がデフォルトで構築可能またはコピー可能であるとは限らないため、一般に変換は不可能です。

いくつかの単純な型だけに興味がありますか? 次に、それをソリューションの一部にします。元のコードは生成されますか? そうでなければ、名前だけでローカル オブジェクトを識別できるとどのように信頼できるでしょうか。異なるタイプのオブジェクトに同じ名前を使用することもできます。

于 2012-07-20T19:04:00.873 に答える
1

私が最初に要求することは、これが必要な正確な時期とその理由、およびプログラムのセマンティクスに悪影響を与えずに安全に実行できる時期を特定する方法の完全な仕様です。これは本当に悪い考えです。明らかに、あなたに課題を与えた人たちは、計り知れないほどの実装の複雑さ、または意味論への悪影響について何も知りません。したがって、彼らも適切な仕様を思いつくことができず、最終的にはあなたを解放するだろうと推測しています.

また、この議論、特に Ira Baxter のコメントにも注意を向けたいと思います。私は生計を立てるためにコンパイラを構築していました。フォーラムで学んだり、質問したりする作業ではありません。

于 2012-07-21T05:17:23.597 に答える