Je voudrais savoir comment utiliser GCC comme bibliothèque pour analyser le code C/C++/Java/Objective C/Ada de mon programme. Je veux contourner le préprocesseur et préfixer toutes les fonctions qui sont écrites par l'utilisateur avec un préfixe My. Comme par exemple Print();
devient MyPrint();
Je souhaite également le faire avec les variables.
Réponses
Trop de publicités?Vous pouvez regarder ici :
http://codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/
Ceci est une description de l'utilisation de l'interface plugin de gcc pour analyser le code C++. Les autres langages devraient être traités de la même manière.
Vous pouvez également essayer le porc de Mozilla :
https://wiki.mozilla.org/Pork
Quand je l'ai essayé (porc), j'ai passé une heure ou deux à corriger les problèmes de compilation, mais ensuite je peux écrire des scripts comme ceci :
rewrite SyncPrimitiveUpgrade {
type PRLock* => Mutex*
call PR_NewLock() => new Mutex()
call PR_Lock(lock) => lock->Lock()
call PR_Unlock(lock) => lock->Unlock()
call PR_DestroyLock(lock) => delete lock
}
Ainsi, il a trouvé tous les types de PRLock et les a remplacés par des Mutex, il a également recherché l'appel de fonctions comme PR_NewLock et le remplace par "new Mutex".
Vous pourriez souhaiter enquêter sur le éparses Analyseur C. Il comprend beaucoup de C (tout le C utilisé dans les sources du noyau Linux, ce qui est un assez bon sous-ensemble des extensions ANSI-C et GNU-C légales) et fournit quelques exemples de compilateurs pour fournir une vue d'ensemble de la situation. lint
-Outil d'analyse statique similaire pour la vérification des types.
Bien que le code semble très propre et minutieux, votre tâche pourrait être plus facile à réaliser via un autre mécanisme -- la fonction example.c
inclus dans le sparse
La source qui démontre un compilateur fait 1955 lignes.
En C, vous ne pouvez pas le faire de manière fiable. Si vous sautez le prétraitement, vous n'aurez -- en général -- pas de code C valide à analyser. Par exemple
#define FOO
#define BAR
#define BAZ
FOO void BAR qux BAZ(void) { }
Comment l'analyseur syntaxique est-il censé reconnaître cette définition de fonction de qux sans faire le prétraitement ?
Premièrement, GCC n'est pas une bibliothèque, et n'est pas structuré pour l'être (contrairement à LLVM).
Pourquoi (i.e. pour quoi faire) voulez-vous analyser le code source C, C++, Ada ?
Je considérerais (en supposant un GCC 4.6 version) extension de GCC soit par le biais de plugins écrits en C, ou de préférence en utilisant MELT MELT, un langage de haut niveau spécifique à un domaine pour étendre GCC (disclaimer : je suis l'auteur principal de MELT).
Mais utiliser GCC comme une bibliothèque n'est pas du tout réaliste.
Je pense vraiment que pour ce que vous voulez réaliser, MELT est le bon outil. Cependant, il est mal documenté. Veuillez utiliser le gcc-melt@googlegroups.com
liste pour poser des questions.
Et soyez conscient que l'extension de GCC demande une certaine quantité de travail (plus d'une semaine peut-être), car vous devez comprendre en partie les représentations internes de GCC.
- Réponses précédentes
- Plus de réponses