2011-11-15 12 views
5

GCCをライブラリとして使用してC/C++/Java/Objective C/Adaコードを解析する方法を知りたい。 私はプリコーディングをバイパスして、接頭辞Myで書かれたすべての関数にプレフィックスを付ける必要があります。 のようにPrint();になりますMyPrint();私はまた変数でこれをしたいと思います。gcc for parsing code

+5

これはかなり大きな要件です。何を試しましたか?あなたが直面している具体的な問題は何ですか? gccチェーンのマニュアルページを読んだことがありますか(前処理やその他のことなし)?また、前処理は、プログラム内でコードを動作させるために必要な唯一のステップではないでしょう。あなたは何をしようとしているのですか? – Corbin

+0

私はclangを使ってみましたが、コンパイルすることはできません。私:パーリングでうまくいかない。 gccチェーンは何ですか?ファイル内にヘッダーやマクロを入れたくないので、前処理をスキップします。基本的に私がしようとしているのは、プレフィックスを付けて関数と変数の名前を変更することです。 – zeitue

+0

ああ、私はgccのツールチェーンを言うつもりだった。実際、それは私が使用すべきであったよりも広い期間でした。私はちょうどあなたが何をしているのかに応じて、gccのmanページと多分link manページを述べたはずです。 – Corbin

答えて

3

あなたはここに見ることができます:
http://codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/

これは、C++のコードを解析するためにgccのプラグインインターフェイスを使用する方法の説明です。他の言語も同じように扱うべきです。

また、あなたは、Mozillaから豚肉を試すことができます。
https://wiki.mozilla.org/Pork

私はそれ(豚肉)をしようとしたとき、私はこのようなスクリプトを時間を過ごすかそこら修正する問題をコンパイルしたが、その後 、私は書くことができます:

したがって、すべてのタイプのPRLockを見つけてそれをMutexで再現し、PR_NewLockのような関数 の呼び出しを検索し、それを "new Mutex"に置き換えます。

+0

私はこの問題を今使っています私のコードがおそらく私のシステムをコンパイルするのは新しいです。 – zeitue

+0

またはシステムが古すぎます。gccのプラグインのサポートは、gcc 4.5で再作成されましたので、gccのバージョンが<4.5 ... – fghj

+0

私のシステムは、gcc gcc-3.3 gcc-3.4 gcc-4.0 gcc-4.2 gcc-4.3 gcc-4.4 gcc- 4.5 gcc-4.6 – zeitue

2

sparse Cパーサーを調べることができます。これは、多くのC(Linuxカーネルソースで使用されているC言語のすべてで、法的なANSI-CやGNU-C拡張のかなり良いサブセットです)を理解し、いくつかのサンプルコンパイラバックエンドを提供して、lintのような静的解析ツール型チェックのために。

コードが非常にクリーンで徹底しているように見えますが、コンパイラを示すsparseソースに含まれているexample.cには1955行の長さがあります。

+0

スパースは素晴らしく見えますが、C++をサポートするために継ぎ目がありません。 – zeitue

+0

もちろん、Java/Objective C/Adaはありません。 :)それはCとだけCを行います。 – sarnold

+0

テイラーが言ったように、スパースは素晴らしく見えますが、そのwikiのダウンロードリンクやgit repoリンクのどれもうまくいきません。 – Necrolis

2

Cでは、それを確実に行うことはできません。前処理をスキップすると、一般に、有効なCコードが解析されません。例えば。

#define FOO 
#define BAR 
#define BAZ 

FOO void BAR qux BAZ(void) { } 

はどのようにパーサは、前処理を行わずquxのこの関数定義を認識するようになっていますか?

+0

私は、前処理をスキップしてマクロを展開したくないということを意味し、最終コードにヘッダーを付けたくありません。 – zeitue

2

最初に、GCCはライブラリではなく、(LLVMとは対照的に)1つに構成されていません。

C、C++、Adaのソースコードを解析する理由は何ですか?私が考えるであろう

(GCC 4.6バージョンを想定)いずれかCで書かれたプラグインスルー GCCを延長、または好ましくはGCC(免責条項を拡張するMELT、ハイレベルのドメイン固有の言語を使用して:私は、主著者午前メルテ)。

しかし、GCCをライブラリとして使用することは、現実的ではありません。

本当にあなたが達成したいと思っているところでは、MELTは正しいツールです。しかし、それは文書化されていません。 [email protected]のリストを使用して質問してください。

また、GCCの内部表現を部分的に理解する必要があるため、GCCの拡張に多少の作業(おそらく1週間以上)がかかることに注意してください。

+0

MELTはうまくいくように見えますが、C/C++コードのまま残そうとしています。これは私のプロジェクトの残りの部分に書かれているので、Javaも知っていますし、PythonとValaを学んでいます。 – zeitue

2

C & C++

+0

いくつかのGCCプラグインは何らかの分析を行うことができるので、関連するツールと思われます。 –

+0

Basile:問題はプラグインで、clangはアナライザとパーサーとして構築されていますが、プラグインを使うとツールチェーンの長さは短くなりますが、tbh、最近GCCでLLVM + clangを使用することをお勧めします – Necrolis

+0

**コンパイラプラグイン**は問題ではなく**決定的な利点**として見ることができます:プラグインはコンパイラの内部で正確に動作しますので、コンパイラが見ているものとコンパイラの動作を正確に見ています。また、コンパイラプラグインを使用することは、いくつかの外部ツールよりも邪魔になりません。基本的には、makefileのCFLAGSまたはCXXFLAGSに一連の引数を追加するだけです。 –

2

当社DMS Software Reengineering Toolkitの両方を処理することができますclangにCインタフェース、そのコンパイラのパーサではなく、解析パーサとして作られた、あなたはlibclangのようなものを使用してずっといいんだろう、GCCを忘れますC、C++、Java、Adaコード(現時点ではObjective Cではなく)をさまざまな方言で解析し、コード上で変換を実行できます。 DMSのC and C++フロントエンドにはプリプロセッサが含まれているため、解析する前に前処理を行うことができます。

私はおそらく、 "My ...."という接頭辞を持つすべての関数と(グローバル変数)変数の名前を変更するのが奇妙に思えるかもしれません。

domain C~GCC3. 

rule rewrite_function_names(t: type_designator, i: IDENTIFIER, p: parameter_list, s: statements): 
     function_header->functionheader 
"\t \i(\p) { \s } " -> "\t \renamed\(\i\) (\p) { \s }" ; 

とヘルパー関数識別子ですを含むツリーノードをとる「名前の変更」、およびツリーノードとを返します。しかし、あなたは、いくつかのDMSのルール(ラフGCC3のためのユーザ機能の名前の変更のスケッチとすることを行うことができます名前を変更した識別子。

DMSパターンのみを解析木にマッチするので、あなたは、任意の偽陽性を得ることはありません。

あなたは、例えば(それぞれのlangauge内のさまざまな異なる構文の例を処理するためにいくつかの追加のパターンを必要とするだろうCでは "void"の戻り値の型です。なぜなら、 "void"は構文の型指定子ではなく、グローバル変数の宣言でもあります。異なる言語の異なるdの規則(Adaの構文はCの構文と同じではありません)。

これはあなたの仕事にとって大きなハンマーのように思えるかもしれませんが、本当に信頼できる方法でさまざまな言語に対してこれを行うことを主張すれば、これらすべての言語に対してまともなパーサーを手に入れる問題を回避することは難しいようです。 (そして、これらすべての言語で本当にこれを行うつもりなら、DMSは他の言語を扱うために教えたのと同じようにObjectiveCを扱うよう教えることができます)。

あなたの選択肢は、何らかの種類の文字列ハッキングソリューションです(95%の時間で動作する可能性があります)。あなたがそれで暮らすことができれば、Perlまたは類似のものがあなたの答えでしょう。

+0

良いソリューションのように見えますが、プロプライエタリなソフトウェアに見えます。私は今、ソフトウェアを購入するためのお金を持っていないと私はまた、私はこれを使用していた以外のウィンドウを使用しないでください。 – zeitue