2012-04-24 14 views
5

複数の文字配列を含むいくつかのスタウトを定義するC-Headerファイルがあります。Javaを使用してC-Headerファイルを解析/読み込む

私はJavaを使用してこれらのファイルを解析したいと思います。 C-Headerファイルを構造体に読み込むためのライブラリがありますか、C-Headerファイルを理解できるストリームパーサーはありますか?

私はちょうどC-ヘッダーパーサーを探しています。この特定の問題の解決策ではありません。 私はデータを含むテキストファイルとその構造を説明するC-Headerファイルを持っています。どちらもダイナミックなビットですので、Javaクラスファイルを生成したくありません。

例:

#define TYPE1 
typedef struct type1 
{ 
char name1[10]; 
char name2[5]; 
} 
#endif 

タイプ2、タイプ3などが類似しています。

データ構造:

type1ffffffffffaaaaa 
+0

lexとyaccのマニュアルページ(フレックスとバイソン)が役に立ちます –

+0

ああ、私はyaccを忘れていました。私はすでにこれに既存のソリューションが存在することを期待していました。しかし、私はyaccを使って自分のストリーミングパーサーを作ることができたと思う。 – PhilW

+0

@PhilW、パーサーを作成しましたか?私は、プリプロセッサ定義(整数定数のみ)を含むCヘッダを解析する必要があります。これらの定数をCヘッダからJavaアプリケーションに取得する必要があります。もちろん私は自分のものを実装する前に何らかの準備が整った解決策を探しています=) –

答えて

12

既存のCパーサーをJava用に使用できます。もちろん、ヘッダーファイルを解析する以上のことはしますが、それはあなたを傷つけるものではありません。

Eclipse CDTプロジェクトのパーサーを使用します。これはEclipseプラグインですが、Eclipseの外で正常に使用するには、Eclipseの3つのJARファイルをパーサーJARにバンドルするだけです。

CDTパーサーを使用するには、org.eclipse.cdt.core.model.ILanguageの実装で開始します(例:org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage)。 getTranslationUnitにコードといくつかのヘルパーを渡すことができます。コードファイルはorg.eclipse.cdt.core.parser.FileContentインスタンスで表されます(少なくともCDT7ではこれは大きく変わるようです)。このようなオブジェクトを作成する最も簡単な方法はFileContent.createForExternalFileLocation(filename)またはFileContent.create(filename, content)です。この方法で、Eclipse IFileのことを気にする必要はありません。これはプロジェクトやワークスペース内でのみ機能するようです。

IASTTranslationUnitは、ファイルのAST全体を表します。その中のすべてのノードは、IASTDeclarationなどのIASTSomethingタイプのインスタンスです。org.eclipse.cdt.core.dom.ast.ASTVisitorの独自のサブクラスを実装して、visitorパターンを使用してASTを反復処理できます。さらなる助けが必要な場合は、ただ聞いてください。

使用するJARファイルは、org.eclipse.cdt.core.jar,org.eclipse.core.resources.jar,org.eclipse.equinox.common.jarおよびorg.eclipse.osgi.jarです。

編集:私はこのために、ソースコードスニペットが含まれている紙発見した: 「オープンソースC++パーサ、活発にメンテナンス、完全に機能性、堅牢としてのEclipse C/C++開発ツーリングを使用する」が、それはありますもはやオンラインでは入手できなくなりました(短縮バージョンとしてのみ)。

+0

良いフィット感のように聞こえる!あなたはこれを行う方法についていくつかのキーワードまたはポインタを投げてもらえますか? (このシナリオの主なクラスは何ですか?) – PhilW

+0

実際に私は質問があります:上記のサンプルでは、​​ "#define type1"というマクロがあります - どうすれば私のASTVisitorを訪問できますか? – PhilW

+0

私たちのコードはそれらのどれも持っていないので、どのようにプリプロセッサのステートメントをサポートしているのか分かりません。しかし 'IASTTranslationUnit'には' #define'のようなプリプロセッサのステートメントにアクセスできるいくつかのメソッドがあります。 –

4

Eclipse CDTを使用している例は、2つのジャーだけです。
- https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
この例では、ソースファイルの構造をツリーとして表示し、別の例ではAPIのインタラクションを表示するクラスがあります。

このapi(Eclipse CDT Parser)を使用すると、メモリ内の文字列からを解析することができます。

使用の別の例である:
https://github.com/ricardojlrufino/cplus-libparser
メタデータ抽出のためのライブラリC/C++ソースコードの(クラス、メソッド、変数についての情報)。

は、ファイルを参照してください: https://github.com/ricardojlrufino/cplus-libparser/blob/master/src/main/java/br/com/criativasoft/cpluslibparser/SourceParser.java

3

すでに述べたように、CDTは、このタスクに最適です。しかし、上記とは異なり、私はプラグイン内から使用し、IFilesを使用することができました。その後、すべてがとても簡単です。 「ITranslationUnitは」ただやる取得するには、次の

ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(myIFile); 
IASTTranslationUnit ias = tu.getAST(); 

を私はつまり、特別に#defineを探していたので、私はちょうどでした:

ppc = ias.getAllPreprocessorStatements(); 

すべての前処理コードステートメント、配列内の各ステートメントを取得するには-素子。完璧に簡単です。

関連する問題