Wie parse ich eine C-Header-Datei?

Lesezeit: 2 Minuten

Benutzer-Avatar
Waffelmann

Kennt jemand eine schicke Möglichkeit, C-Header-Dateien in Python zu verwenden? Zum Beispiel habe ich ein C-Programm, das eine globale Variable enthält:

typedef struct ImageInfo
{
    uint8_t revisionMajor;
    uint8_t revisionMinor;
    uint16_t checksum;    

} ImageInfo;

ImageInfo gImageInfo;   /* Placed at a specific address by the linker */

Ich möchte in der Lage sein, die vom C-Compiler/Linker generierte Binärdatei zu nehmen und diese Struktur mit einem Python-Skript zu analysieren (und möglicherweise zu ändern).

  • Die Struktur existiert wahrscheinlich nicht “in der Binärdatei” als solche – sie “existiert” nicht wirklich bis zur Ausführungszeit, nachdem das Programm vom Betriebssystem in den RAM geladen wurde. Was genau versuchst du also zu tun?

    – Craig McQueen

    23. Dezember 2009 um 23:53 Uhr

  • Hoppla, ich habe vergessen zu erwähnen, dass die globale Variable im Nur-Lese-Speicher (dh Flash oder ROM) abgelegt wird. Im obigen Beispiel würde gImageInfo am Offset 0x1000 in der Binärdatei platziert und ich möchte in der Lage sein, die Struktur mit Python auszulesen und die Revisionsinformationen zu erhalten, um die Prüfsumme zu überprüfen.

    – Waffelmann

    28. Dezember 2009 um 13:53 Uhr

Benutzer-Avatar
Matt Anderson

Dies wurde gestern auf SO erwähnt; Ich hatte noch keine Gelegenheit, es genauer zu überprüfen, aber ich habe vor, es zu tun. Das pycparserein “in Python geschriebener C-Parser und AST-Generator”.

https://github.com/eliben/pycparser

  • Obwohl diese Antwort angeblich eine alte Geschichte ist, verdient sie mindestens 2 weitere positive Stimmen – sie bietet die Möglichkeit, genau das zu tun, was der ursprüngliche Beitrag verlangt.

    – Synthesizerpatel

    20. November 2010 um 13:03 Uhr

Benutzer-Avatar
Vijay Mathew

Sehen Sie sich diesen in Python geschriebenen C++-Header-Parser an. Sie können mit einem dieser Tools auch Ihren eigenen Parser schreiben:

  • Tolle Referenzen: Ich kannte einige dieser Module nicht. Ich würde gerne wissen, wie voll ausgestattet sie im Vergleich zu pygccxml sind (das eindeutig einen Vorsprung hat, da es von GCC unterstützt wird). Das Schreiben eines C++-Parsers ist notorisch schwierig (obwohl die Frage sich auf das C-Parsing bezog). Es wäre schön, wenn möglich etwas Leichteres als den vollständigen GCCXML-basierten Stack zu verwenden.

    – jkp

    23. Dezember 2009 um 8:55 Uhr

Benutzer-Avatar
jkp

Schauen Sie sich an pygccxml. Ich verwende es, um In-Memory-Graphen meines C/C++-Quellcodes zu erstellen, die ich als Grundlage für viele Codegenerierungsaufgaben verwenden kann.

PS: Als ich mit Python-basierter Codegenerierung anfing, versuchte ich tatsächlich, selbst einen Parser zu schreiben: Ersparen Sie sich den Schmerz und gehen Sie nicht einmal dorthin! (sieht aber so aus, als hättest du schon Ahnung …) pygccxml ist alles, was du willst und mehr 🙂

Für den gleichen Zweck, den ich in Erwägung ziehe Bibliothekes ist kein vollständiger C-Parser, aber es zielt darauf ab, C-Header-Dateien zu parsen, daher ist es viel einfacher zu verwenden als pycparser oder ein gccxml-basierter Parser: obwohl schwach dokumentiert, versuchen Sie es einfach CParser.py testHeader.h und du wirst sehen, wie es funktioniert.

Hängt von Pyparsing ab und ist, soweit ich verstehe, reines Python.

1312470cookie-checkWie parse ich eine C-Header-Datei?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy