Question

Quels sont les bons outils pour obtenir un démarrage rapide pour l'analyse et l'analyse du code C / C ++?

En particulier, je suis à la recherche d'outils open source qui gèrent le C / C ++ préprocesseur et la langue. De préférence, ces outils utiliseraient lex / yacc (ou flex / bison) pour la grammaire, et ne pas être trop compliqué. Ils doivent gérer les derniers ANSI C / C ++ définitions.

Voici ce que je l'ai trouvé à ce jour, mais ne l'ai pas regardé en détail les (pensées?):

  • CScope - analyseur de la vieille école C. Ne semble pas faire une analyse syntaxique complète, cependant. Décrit comme un « grep » glorifiée pour trouver des fonctions C.
  • GCC - compilateur open source préférée de tout le monde. Très compliqué, mais semble tout faire. Il y a un projet lié à la création d'extensions de GCC appelés GEM , mais n'a pas été mis à jour depuis GCC 4.1 (2006).
  • PUMA - Purs Manipulateur. (À partir de la page: « Le but de ce projet est de fournir une bibliothèque de classes pour l'analyse et la manipulation des sources de C / C. Pour ça but PUMA propose des cours pour la numérisation, l'analyse syntaxique et bien sûr la manipulation C / C ++ sources. »). Cela semble prometteur, mais n'a pas été mis à jour depuis 2001. Apparemment, PUMA a été incorporé dans AspectC ++ , mais même ce projet n'a pas été mis à jour depuis 2006.
  • Divers C / C grammaires de premières. Vous pouvez obtenir c-c ++ - 1.2.tar.gz grammaires, mais cela a été unmaintained depuis 1997. un peu de recherche Google tire vers le haut d'autres grammaires de base lex / yacc qui pourrait servir comme point de départ.
  • Toutes les autres?

J'espère utiliser comme point de départ pour la traduction C / C ++ source dans un nouveau langage de jouet.

Merci! -Matt

(Ajouté 2/9): Une précision: je veux extraire l'information sémantique du préprocesseur en plus du code C / C ++ lui-même. Je ne veux pas « #define foo 42 » disparaître dans l'entier « 42 », mais rester attaché au nom « foo ». Cela, malheureusement, exclut plusieurs solutions qui exécutent le préprocesseur premier et unique fournissent le C / C ++ parse tree)

Était-ce utile?

La solution

Parsing C ++ est extrêmement difficile parce que la grammaire est indécidable. Pour citer Yossi Kreinin :

  

grammaire compliquée Remarquablement

     

doit être interprété littéralement "Remarquablement", parce que toutes les langues populaires hors-contexte (ou "presque" sans contexte) grammaires, en C ++ a indécidable grammaire. Si vous aimez les compilateurs et les parseurs, vous savez probablement ce que cela signifie. Si vous n'êtes pas dans ce genre de chose, il y a un exemple simple montrant le problème avec l'analyse syntaxique C ++: est AA BB(CC); une définition d'objet ou d'une déclaration de fonction? Il se trouve que la réponse dépend en grande partie sur le code avant la déclaration - le « contexte ». Cela montre (à un niveau intuitif) que la grammaire C est tout à fait de sensible au contexte.

Autres conseils

Vous pouvez regarder clang qui utilise LLVM pour l'analyse syntaxique.

Support C ++ entièrement maintenant lien

Le générateur d'analyseur syntaxique ANTLR a a grammaire C / C ++ ainsi que le préprocesseur. Je ne l'ai jamais utilisé, je ne peux pas dire à quel point complète son analyse de C ++ va être. ANTLR lui-même a été un outil utile pour moi à quelques reprises pour l'analyse syntaxique des langues beaucoup plus simple.

En fonction de votre problème gccxml pourrait être votre réponse. Fondamentalement, il analyse la source en utilisant GCC et vous donne XML facile à digérer d'arbre syntaxique. Avec gccxml vous avez terminé une fois pour toutes.

pycparser est un analyseur complet pour C (C99) écrit en Python. Il dispose d'un back-end AST entièrement configurable, il est donc utilisé comme base pour tout type de traitement de la langue que vous pourriez avoir besoin.

Ne supporte pas C ++, cependant. Certes, il est beaucoup plus dur que C.


Mise à jour (2012) : à ce moment la réponse, sans aucun doute, serait Clang - il est modulaire, prend en charge l'ensemble C ++ (avec beaucoup de C ++ - 11 fonctions) et une base de code relativement convivial. Il a également une API C pour les liaisons aux langages de haut niveau ( pour Python ).

Jetez un oeil sur la façon dont fonctionne doxygen , le code source complet est disponible et il est base-flex.

Un candidat est trompeur GOLD qui est une boîte à outils d'analyse syntaxique basé sur Windows sans explicitement pour la création de traducteurs . Leur liste de langues supportées fait référence aux langues dans lesquelles on peut mettre en œuvre, parseurs pas la liste des grammaires parse pris en charge.

Ils ont seulement pour C et grammaires C #, C ++ pas.

Parsing C ++ est un défi très complexe .

Il y a le cadre Boost / Esprit, et il y a quelques années, ils ont fait jouer avec l'idée de mettre en œuvre un analyseur C ++ , mais il est loin d'être complète .

analyse syntaxique entièrement et correctement ISO C ++ est loin d'être anodin, et il y avait en fait beaucoup d'efforts connexes. Mais il est un travail en soi complexe qui n'est pas facile à réaliser, sans réécriture d'un frontend complet du compilateur comprendre tous C ++ et préprocesseur. est disponible auprès des gens de Spirit Une implémentation pré-processeur appelé « vague ».

Cela dit, vous pouvez jeter un oeil à gcc plugins utilisant la licence de bibliothèque d'exécution, donc je suppose que les choses vont changer rapidement, une fois que les gens peuvent facilement tirer parti de l'analyseur C ++ à base de gcc-à ces fins à l'aide binaire plugins.

Alors, en un mot: si vous les mâles: EDG, si vous avez besoin libre / open source maintenant : else / Oink sont assez prometteuses, si vous avez du temps, vous voudrez peut-être utiliser gcc pour votre projet.

Une autre option juste pour le code C est cscout .

La grammaire C ++ est un peu notoirement poilu. Il y a un bon fil à Lambda à ce sujet, mais l'essentiel est que la grammaire C ++ peut exiger de façon arbitraire beaucoup préanalyse.

Pour le genre de chose que je suppose que vous pourriez faire, je penserais sur le piratage soit Gnu CC, ou Splint . Gnu CC en particulier ne sépare la partie de génération de langage assez bien, vous pourriez être mieux loti construire une nouvelle g ++ back-end.

En fait, PUMA et AspectC ++ sont encore activement à la fois maintenu et mis à jour. Je cherchais en utilisant AspectC ++ et je me demandais sur le manque de mises à jour moi-même. J'envoyé un courriel à l'auteur qui a dit que les deux AspectC ++ et PUMA sont en cours d'élaboration. Vous pouvez obtenir le code source via SVN https://svn.aspectc.org/repos/ ou vous pouvez obtenir construit binaire régulier http://akut.aspectc.org . Comme avec beaucoup d'excellents projets C ++ ces jours-ci, l'auteur n'a pas le temps de suivre la page Web d'entretien. Sens que si vous avez un emploi à temps plein et une vie.

Elsa bat tout ce que je sais mains vers le bas pour l'analyse syntaxique C de même qu'il ne soit pas conforme à 100%. Je suis fan. Il y a un module qui imprime C ++, de sorte que peut être un bon point de départ pour votre projet de jouet.

comment quelque chose plus facile à comprendre comme petit-C ou Petit C

Voir notre C ++ Front End pour un analyseur C ++ complet: construit, tables de RSHS symbole, le nom ne et la résolution de type. Vous pouvez même analyser et de conserver le préprocesseur directives. L'extrémité avant C de est construit au-dessus de notre DMS Software Reengineering Boîte à outils, qui vous permet d'utiliser ces informations pour mener à bien arbitraire code source change en utilisant des transformations source-source.

DMS est le moteur idéal pour la mise en œuvre d'un tel traducteur.

Cela dit, je ne vois pas beaucoup dans votre tâche imaginée; Je ne beaucoup de valeur à voir essayer de remplacer C ++, et vous trouverez la construction un traducteur complet d'une quantité énorme de travail, surtout si votre cible est une langue « jouet ». Et il est probable que peu de point l'analyse syntaxique C ++ en utilisant un analyseur syntaxique robuste, si son seul but est de produire une version isomorphe de C ++ qui est plus facile à analyser (attendre, nous postulons un robuste C ++ déjà!).

EDIT Mai 2012: le C ++ de DMS frontal gère maintenant gcc3 / GCC4 / C ++ 11, Microsoft VisualC 2005/2010. Robustement.

EDIT février 2015:. Gère maintenant 14 C ++ dans les dialectes du CCG et MS

EDIT Août 2015:. Parse maintenant et capture le code et les directives de préprocesseur dans un arbre unifié

A quelque temps je tentais d'écrire un outil qui génère automatiquement des tests unitaires pour les fichiers c.

Pour preprosessing je mets les fichiers à travers GCC. La sortie est laid, mais vous pouvez facilement tracer où dans le code d'origine du fichier prétraité. Mais pour vos besoins que vous pourriez avoir besoin somthing d'autre.

je compteur comme base pour un C analyseur. Il est open source et utilise LEX et YACC. Cela a rendu facile de se lever et courir dans un court laps de temps sans yacc et lex comprendre pleinement.

J'ai aussi écrit une application C depuis la lex & yacc solution ne pouvait pas me aider à la fonctionnalité trace à travers les fonctions et analyser la structure de l'ensemble de la fonction en une seule passe. Il est devenu difficile à maintenir dans un court laps de temps et a été abandonné.

Qu'en est-il à l'aide d'un outil comme GNU CFLOW , qui peut analyser le code et produire cartes de call-graphiques, voici ce que le OpenGroup (page man) dit au sujet de cflow. La version GNU de cflow est livré avec la source et open source aussi ...

Hope this helps, Meilleures salutations, Tom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top