2012-06-21 6 views
15

Ich habe eine riesige C-Datei (~ 100k Zeilen), die ich in der Lage sein muss zu analysieren. Hauptsächlich muss ich in der Lage sein, Details über einzelne Felder jeder Struktur (wie Feldname und Typ für jedes Feld in der Struktur) aus seiner Definition zu erhalten. Gibt es eine gute (Open Source, die ich in meinem Code verwenden kann), um dies bereits zu tun? Oder sollte ich meinen eigenen Parser dafür schreiben? Wenn ich mein eigenes schreiben muss, kann mir jemand einen guten Start vorschlagen? Ich habe noch nie zuvor mit Python gearbeitet.Parsing C-Code mit Python

Dank

+1

Können Sie ein Beispiel veröffentlichen? Müssen Sie einen C-Compiler testen (und unterstützen unions, structs-in-structs, typedefs, den Präprozessor usw.) oder einfach nur Daten aus einfachen Strukturen herausholen? Irgendetwas sagt mir, dass diese C-Datei JSON, CSV, eine Datenbank sein sollte oder ein anderes * data * -Format, keine 100k LOC C-Datei ... –

+0

... und Sie haben wahrscheinlich auch noch keinen C-Parser geschrieben, Sie wollen das nicht selbst machen, C ist viel komplizierter als Sie denken, dass es ist: Makros, Präprozessor-Bedingungen, enthält, mehrdeutige Syntax, Hersteller-spezifische Syntax, Symboltabellenkonstruktion, ... Finden Sie einen vorhandenen C-Parser, der umfangreiche Validierung hatte und verwenden, auch wenn der C-Parser nicht ist Wenn Sie Python verwenden wollen, um die Ergebnisse zu verarbeiten, fein, aber verwechseln Sie Python nicht mit der Lösung ["Ich habe nie zuvor mit Python gearbeitet" ist kein gutes Zeichen, dass dieser Weg zum Erfolg führt.] –

+0

... Ich schlage vor, Sie betrachten GCCXML, die einen C-Parser enthält und die Art exportiert von Daten, die Sie als XML möchten. –

Antwort

17

Werfen Sie einen Blick auf this link für eine umfangreiche Liste von Parsing für Python verfügbaren Tools. Insbesondere für die Analyse von c-Code, versuchen Sie die pycparser

7

Der richtige Weg, dies zu tun ist fast sicher, Schnittstelle mit dem Front-End eines vorhandenen Compilers, wie gcc, dann arbeiten mit der Zwischendarstellung, anstatt zu versuchen Erstellen Sie Ihren eigenen Parser in jeder Sprache.

Allerdings könnte pycparser, wie von Dhara vorgeschlagen, gut ein guter Ersatz sein, und definitiv besser als jeder Versuch, Ihre eigenen zu rollen.