Pycpathser
https://github.com/albertz/pycparser
Un analyseur et un interprète C écrit en Python. Comprend également un générateur d'interface CTYPES automatique.
Il est plus lâche que la grammaire C, c'est-à-dire qu'il devrait soutenir un superset de la langue C en général.
Une partie du support peut un peu incomplète ou mal à ce stade car je n'ai pas vraiment suivi les spécifications linguistiques, mais j'ai plutôt amélioré l'analyseur par itération sur le code source réel.
Projets similaires
Analyseurs / générateurs d'interface ctypes :
- PYCPARSER d'Eli Bendersky. Compléter l'analyseur C99 en pur python. Cela dépend de Python Lex-Yacc (PLY). (Je ne l'ai pas encore testé. Cela semble être le projet le plus complet et le plus professionnel. Si vous ne voulez pas d'interprète C, c'est probablement le projet que vous devez utiliser.)
- pyclibrary (fourche github). Est assez lent et n'a pas bien fonctionné pour moi.
- CTYPESGEN. Utilise également Lex + YACC.
- Codegen. Utilise gcc-xml. Voir ci-dessous sur les inconvénients d'un tel apice.
Interprètes:
- Cinterpreter. Python.
- Cint. Pas dans Python. Probablement le plus célèbre.
- Ch. Pas dans Python. N'est pas vraiment gratuit.
- débogueur UPS. Pas dans Python.
- Picoc. Pas dans Python. "Un très petit interprète C."
- Bic. Pas dans Python.
Pourquoi ce projet?
- Être plus flexible. Il est beaucoup plus facile maintenant avec un analyseur manuel de faire des opérations à certains niveaux du tuyau d'analyse.
- Je voulais avoir un code autonome qui peut également facilement fonctionner du côté de l'utilisateur final. Ainsi, l'utilisateur final peut simplement mettre à jour la LIB et ses en-têtes, puis une application à l'aide de ce Python Lib utilisera automatiquement la LIB mise à jour. Ce n'est pas possible si vous avez généré l'interface CTYPES statiquement (via un outil basé sur GCC-XML ou si).
- Je voulais implémenter Pysdl et je ne voulais pas traduire les en-têtes SDL à la main. De plus, je ne voulais pas utiliser les outils existants pour le faire pour éviter de maintenir davantage le travail à un moment donné. Voir le projet pour plus d'informations.
- Cette fonctionnalité pourrait être utilisée de manière similaire pour de nombreuses autres bibliothèques C.
- Un défi pour moi. Juste pour le plaisir. :)
Exemples
- Pysdl. Utilise également l'emballage CTYPES automatique et le mappe sur un module Python.
- Pycpython. Interprétez Cpython dans Python.
- Pylua. Interprétez Lua dans Python.
Voir également les tests / test_interpreter. {C, py} 'Hello World' Exemple.
Essayez également ./demos/interactive_interpreter.py --debug .
État actuel
- De nombreux programmes C simples devraient être analysés et interpréter correctement maintenant.
- Je suis sûr que les types de pointes de fonction sont traités de manière incorrecte. Par exemple
typedef void f(); et typedef void (*f)(); sont les mêmes en ce moment. Voir cpre3_parse_typedef et effectuez des tests si vous souhaitez résoudre ce problème. - De nombreuses fonctions de la bibliothèque C standard sont toujours manquantes.
- Il pourrait y avoir des bogues. :)
- C ++ n'est pas encore pris en charge. :)
- Le style de code n'est pas conforme aux conventions PEP8 et Python standard dans de nombreux endroits, car elle est assez ancienne. De plus, il devrait probablement être restructuré, car il a trop grandi dans les fichiers uniques. Je répète lentement ça.
Comment fonctionne l'interprète
C'est probablement un peu inhabituel. Nous enroulons les fonctions de bibliothèque standard C les plus importantes directement à la LIBC native, via ctypes . Nous traduisons le code C analysé en un Python AST équivalent (via ast ), ce qui fait un usage intensif de ctypes . Ensuite, nous exécutons ce code Python généré. Mais nous pouvons également le jeter. Ainsi, nous pouvons compiler le code C à un programme Python équivalent.

--- Albert Zeyer, http://www.az2000.de