7

複数の char 配列を含むいくつかのスタクトを定義する C ヘッダー ファイルがあります。

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

詳細な背景 (この特定の問題の解決策ではなく、C ヘッダー パーサーを探しているだけです): データを含むテキスト ファイルと、構造を説明する C ヘッダー ファイルがあります。どちらも少し動的なので、Java クラス ファイルを生成したくありません。

例:

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

Type2、Type3なども同様です。

データ構造:

type1ffffffffffaaaaa
4

4 に答える 4

16

Java 用の既存の C パーサーを使用できます。もちろん、ヘッダー ファイルの解析以外にも多くのことを行いますが、それで問題が生じることはありません。

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)です。IFileこの方法では、プロジェクトとワークスペース内でのみ機能するように見えるEclipse のことを気にする必要はありません。

返される は、ファイルのIASTTranslationUnitAST 全体を表します。その中のすべてのノードはIASTSomething、たとえばなどの型のインスタンスです。ビジター パターンを使用して AST を反復処理IASTDeclarationする独自のサブクラスを実装できます。org.eclipse.cdt.core.dom.ast.ASTVisitorさらにサポートが必要な場合は、お尋ねください。

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

編集: このためのソース コード スニペットを含む論文を見つけました。短縮バージョン)。

于 2012-04-24T15:04:55.413 に答える
6

2 つの jar のみでEclipse CDTを使用する例。
- https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
例では、ソース ファイルの構造をツリーとして表示するクラスと、API で相互作用を行う別の例があります ...

詳細は、この api (Eclipse CDT パーサー) を使用すると、メモリ内の文字列から解析を実行できることです。

別の使用例:
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

于 2014-12-16T02:41:26.713 に答える
4

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

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

つまり、特別な #define を探していたので、次のようにすることができました。

ppc = ias.getAllPreprocessorStatements();

すべての前処理済みコード ステートメントを取得するには、array-element 内の各ステートメントを取得します。完全に簡単です。

于 2015-10-15T15:13:03.090 に答える
2

ANTLRを使用してみることができます。そのための既存の C 文法がすでにいくつかあるはずです。

于 2012-04-24T15:04:33.710 に答える