Analyse / lecture de fichiers C-Header en Java

J’ai un fichier C-Header définissant un couple de stucts, contenant plusieurs tableaux de caractères.

Je voudrais parsingr ces fichiers en utilisant Java. Existe-t-il une bibliothèque pour lire les fichiers C-Header dans une structure ou existe-t-il un parsingur de stream qui comprend les fichiers C-Header?

Juste pour plus d’arrière-plan (je cherche simplement un parsingur C-Header, pas une solution à ce problème particulier): j’ai un fichier texte contenant des données et un fichier C-Header expliquant la structure. Les deux sont un peu dynamics, je ne souhaite donc pas générer de fichiers de classe Java.

Exemple:

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

Type2, Type3 etc. sont similaires.

Structure de données:

 type1ffffffffffaaaaa 

Vous pouvez utiliser un parsingur C existant pour Java. Bien sûr, cela fait beaucoup plus que d’parsingr les fichiers d’en-tête, mais cela ne devrait pas vous nuire.

Nous utilisons l’parsingur du projet Eclipse CDT . Ceci est un plugin Eclipse, mais nous l’utilisons avec succès en dehors d’Eclipse. Nous devons simplement regrouper 3 fichiers JAR d’Eclipse avec l’parsingur JAR.

Pour utiliser l’parsingur CDT, commencez par implémenter org.eclipse.cdt.core.model.ILanguage , par exemple org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage . Vous pouvez y appeler getTranslationUnit en lui passant le code et des éléments d’aide. Un fichier de code est représenté par une instance org.eclipse.cdt.core.parser.FileContent (du moins dans CDT7, cela semble beaucoup changer). Le moyen le plus simple de créer un tel object est FileContent.createForExternalFileLocation(filename) ou FileContent.create(filename, content) . De cette façon, vous n’aurez plus à vous soucier du IFile Eclipse IFile , qui ne semble fonctionner que dans les projets et les espaces de travail.

L’ IASTTranslationUnit vous récupérez représente l’intégralité du fichier AST. Tous les nœuds qui s’y trouvent sont des instances de types IASTSomething , par exemple, IASTDeclaration etc. Vous pouvez implémenter votre propre sous-classe org.eclipse.cdt.core.dom.ast.ASTVisitor pour effectuer une itération via l’AST à l’aide du modèle de visiteur. Si vous avez besoin d’aide supplémentaire, demandez simplement.

Les fichiers JAR que nous utilisons sont org.eclipse.cdt.core.jar , org.eclipse.core.resources.jar , org.eclipse.equinox.common.jar et org.eclipse.osgi.jar .

Edit : j’avais trouvé un article qui contenait des extraits de code source: “Utilisation de l’outil de développement Eclipse C / C ++ en tant qu’parsingur C ++ open source robuste, entièrement fonctionnel et maintenu activement”, mais il n’est plus disponible en ligne (uniquement une version abrégée).

Exemple utilisant Eclipse CDT avec seulement 2 bocaux.
https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
Dans l’exemple, une classe affiche la structure du fichier source sous forme d’arborescence et un autre exemple faisant des interactions sur les api …

Un détail est qu’avec cet api (parsingur Eclipse CDT), vous pouvez parsingr une chaîne en mémoire.

Un autre exemple d’utilisation est:
https://github.com/ricardojlrufino/cplus-libparser
Bibliothèque pour l’extraction de métadonnées (informations sur les classes, méthodes, variables) du code source en C / C ++.

Voir le dossier: https://github.com/ricardojlrufino/cplus-libparser/blob/master/src/main/java/br/com/criativasoft/cpluslibparser/SourceParser.java.

Comme mentionné précédemment, CDT est parfait pour cette tâche. Mais contrairement à ce qui est décrit ci-dessus, je l’ai utilisé depuis un plugin et j’ai pu utiliser IFiles. Ensuite, tout est tellement plus facile. Pour obtenir le “ITranslationUnit”, faites simplement:

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

Je cherchais un #define spécial pour pouvoir:

 ppc = ias.getAllPreprocessorStatements(); 

Pour obtenir toutes les instructions de code prétraitées, chaque instruction dans un élément de tableau. Parfaitement facile.

Vous pouvez essayer d’utiliser ANTLR . Il devrait déjà y avoir de la grammaire C disponible.