AST à partir de code C
Je veux effectuer certaines transformations sur C code source. J'ai besoin d'un outil sur linux qui génère une complète AST à partir du code source de sorte que je peux appliquer mes transformations sur cette AST et puis convertir le code source C. J'ai essayé ELSA mais il n'est pas compilé. (J'utilise Ubuntu 8.4). Quelqu'un peut-il suggérer un meilleur outil/de l'application?
- Je crois OpenC++ est aussi proche que vous obtiendrez à droite maintenant.
Vous devez vous connecter pour publier un commentaire.
Je recommanderais clang. Il est assez complet C mise en œuvre avec la plupart des extensions de gcc, et le code est très compréhensible. De leur C++ mise en œuvre est incomplète, mais si vous ne se soucient que de générer ASTs à partir de code C qui doit être fine. En fonction de ce que vous voulez faire, vous pouvez soit utiliser clang comme une bibliothèque et de travailler avec l'ASTs directement, ou ont clang les jeter à la console.
clang-cc -rewrite-blocks
.Voir pycparser - un pur Python AST générateur de C.
Il y a deux projets que je suis au courant et que vous pourriez trouver utiles:
Ils à la fois analyser un standard de code source C pour permettre davantage d'analyses et de transformation. Je n'ai pas utilisé de sorte que vous devez vérifier vous-même si elles correspondent à vos besoins.
La suggestion de l'utilisation de GCC est aussi valable, bien sûr. Je sais il n'y a pas beaucoup de documentation sur cet aspect de la gcc, si.
Pour obtenir AST XML de sortie, vous pouvez essayer d'utiliser cscan de MarpaX::Langues::C::AST. Le résultat devrait ressembler à:
xml
<cscan>
<typedef_hash>
<typedef id="GLenum" before="unsigned int" after="" file="/usr/include/GL/gl.h"/>
...
http://www.antlr.org
http://ctool.sourceforge.net/
Notre Logiciel DMS de Réingénierie, Trousse à outils a été utilisé sur d'énormes systèmes de climatisation, d'analyse, d'analyse, de transformation et de régénération du code C. Fonctionne sur Windows, et sera exécuté sur Linux avec Wine, mais il ne poignée de Linux-style (CCG) du code C.
Je ne peux pas souligner assez la capacité pour un aller-retour le code source C: analyser, construire des arbres, de transformer, de se régénérer compilable code C avec les commentaires et soit prettyprinted ou avec l'original du programmeur de l'indentation. Quelques-uns des autres réponses ici suggèrent des systèmes qui peuvent le faire de manière robuste.
Le fait que la DMS est conçu pour mener à bien le programme de transformations (contrairement à d'autres systèmes suggéré dans les réponses ici) est aussi un grand avantage. DMS fournir de l'arbre-modèle correspond et réécrit; il augmente la capacité de ce avec le plein contrôle et analyse de flux de données pour être utilisés pour étendre les conditions que vous aimeriez match. Un outil intention d'être un compilateur est juste que, et vous aurez un moment très difficile de le persuader de ne pas être un compilateur, et au lieu d'être un moteur de transformation que l'OP a demandé.
Voir https://stackoverflow.com/a/2173477/120163 par exemple ASTs produit par DMS.
J'ai fait de petites quantités de travail sur la source-à-source de transformations et j'ai trouvé CIL être très puissant pour cette tâche. CIL a l'avantage d'être un cadre spécialement conçu pour source statique de l'analyse et de transformation. Il peut également traiter les code avec n'importe quel montant de laide GCC extensions spécifiques(Il a été utilisé pour traiter le noyau Linux, comme un exemple.) Malheureusement, il est écrit en OCAML, et les analyses/transformations construit à l'aide, il doit également être writtne en OCAML, ce qui peut être problématique si vous n'avez jamais utilisé il.
Sinon, clang est censé avoir un relativement facilement piratable le code et il peut certainement être utilisé pour produire de C AST.
Vous pouvez essayer de générer de l'AST (Abstract syntax Tree) à l'aide de Lex et Yacc sur Linux:
lex et yacc
de lex et yacc pour ast
L'Elkhound et Elsa code source, version 2005.08.22 b à partir de scottmcpeak.com/elkhound/est obsolète (vieux style C++.h fichiers d'en-tête).
Elsa de travail et une partie de Oink: http://www.cubewano.org/oink/#Gettingthecode
Je viens tout juste de me travaille maintenant sous Ubuntu 9.10.
Comment prendre environ gcc et de l'écriture personnalisée backend pour elle? Je ne l'ai jamais fait ni même travaillé sur le code source de gcc, donc je ne sais pas comment dur il serait.