2010-03-06 4 views
5

Gibt es eine Bibliothek für Python, mit der ich C++ - Code analysieren kann?Python-Code zum Parsen und Prüfen von C++

Zum Beispiel möchte ich einige C++ - Code analysieren und die Namen aller Klassen und ihrer Mitgliedsfunktionen/Variablen finden.

Ich kann mir ein paar Wege vorstellen, wie man es mithilfe von regulären Ausdrücken zusammenhackt, aber wenn es eine vorhandene Bibliothek gibt, wäre es hilfreicher.

+0

edit: Ich unterstellte nicht, dass durch Verwendung eines regulären Ausdrucks ich C++ richtig analysieren könnte, das wäre absurd, da es eine nicht-reguläre Sprache ist. Ich meinte, dass für das, was ich brauche, eine Regex genügen könnte. – Mike

+0

Selbst für diesen begrenzten Fall bezweifle ich, dass Sie es mit einer Regex alleine machen könnten. Vielleicht, wenn Sie es auf einfache, wohlerzogene Klassen ohne Makro- oder Vorlagenmagie (und vielleicht auch ohne Vererbung) eingrenzen. – jalf

+0

Haben Sie versucht http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/? – refi64

Antwort

7

In der Vergangenheit habe ich für solche Zwecke verwendet habe gccxml (ein C++ Parser, emittiert leicht parseable XML) - ich meine eigenen Python-Schnittstellen, um es gehackt, aber jetzt gibt es ein pygccxml was schön, dass up-Paket sollte für Sie.

+0

pygccxml sieht gut aus, ich hatte es vorher nicht bemerkt. –

0

Wie wäre es mit pyparsing?

+1

Von dieser Seite: "Das Pypar-Modul ist ein alternativer Ansatz zum Erstellen und Ausführen einfacher Grammatiken". 1) C++ hat keine "einfache" Grammatik. 2) Die meisten Leute, die versuchen, einen C++ Parser zu bauen, scheitern einfach; es ist eine viel größere Arbeit, die Sie sich vorstellen können. –

+1

Ich weiß, dass es unmöglich ist, C++ korrekt mit Pyparsen zu analysieren, aber der Autor der Frage baut, soweit ich weiß, keinen Compiler für C++ auf, daher könnte Pyapsing für ihn ausreichen. Lass ihn der Richter sein. –

+0

das wäre nicht hilfreich, weil ich die einfache Grammatik selbst schreiben müsste. danke für den Vorschlag – Mike

4

Das Parsen von C++ ist Lichtjahre von etwas, was man mit einem regulären Ausdruck machen kann. Sie benötigen einen vollständigen C++ - Parser, und sie sind ziemlich schwer zu erstellen. Ich war über mehrere Jahre daran beteiligt, einen zu bauen und zu verfolgen, wer es tut. Ich weiß nichts von dem Versuch, in Python zu versuchen.

Der, an dem ich arbeite, ist DMS C++ Front End. Es bietet nicht nur Parsing, sondern volle Namen und Typ Auflösung. Nach dem Parsen können Sie im Detail detaillierte Informationen über den Code in beliebiger Detailtiefe extrahieren, einschließlich arbiträrer Details zum Funktionsinhalt.

Sie könnten die Verwendung von GCCXML, die einen Parser enthält, in Erwägung ziehen und werden, glaube ich, die Namen aller Klassen, Funktionen und Top-Level-Variablen erzeugen. GCCXML gibt Ihnen keine Informationen darüber, was innerhalb einer Funktion ist.

+0

+1 für gccxml ... suchen genau das zu sein, was ich brauche. – Mike

1

Dies ist ein wenig außerhalb Ihrer Frage Umfang ... aber je nachdem, was Sie erreichen möchten, ist vielleicht Exuberant Ctags lohnt sich zu betrachten.

+0

guter Vorschlag, wäre es noch hilfreicher, wenn es eine Bibliothek gäbe, die die Ausgabe von Ctags parsen könnte – Mike

1

Haben nicht versucht, aber die Verwendung der Python-Bindungen von LLVM Clang Parser kann funktionieren; siehe here.

Verwandte Themen