Einfache Möglichkeit, H-Datei für Kommentare mit Python zu analysieren?
Frage
Wie in der einfachen Weise zu analysieren, ein .h Datei geschrieben in C für Kommentare und Entitätsnamen mit Python ?
Wir sind für ein weiteres Schreiben der Inhalte in die Word-Datei bereits entwickelt annehmen.
Quelle Kommentare werden mit einer einfachen Tag-Stil Regeln formatiert. Kommentar-Tags für eine einfache Unterscheidung einer Einheit Kommentar von den anderen und nicht-Dokumentation Kommentaren verwendet. Ein Kommentar kann in mehrzeiligen Form vorliegen. Ein jeder Kommentar haben bleiben gerade auf die Einheitsdefinition:
//ENUM My comment bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
// could be multi-line. Bla bla bla bla bla bla bla bla bla.
enum my_enum
{
//EITEM My enum item 1.
// Just could be multi-line too.
MY_ENUM_ITEM_1,
//EITEM My enum item 2
MY_ENUM_ITEM_2,
};
//STRUCT My struct
struct my_struct {
//MEMBER struct member 1
int m_1_;
};
//FUNC my function 1 description.
// Could be multi-line also.
//INPUT arg1 - first argument
//RETURN pointer to an allocated my_struct instance.
my_struct* func_1(int arg1);
Ein Code-and-Kommentare Baum als Ergebnis dieser Analyse herauskommen soll.
Wie man es macht schnell und ohne Bibliotheken von Drittanbietern mit
Lösung
Hier ist eine schnelle und schmutzige Lösung. Es wird nicht damit umgehen Kommentare in Strings, aber da dies nur für die Header-Dateien ist das kein Problem sein sollte.
S_CODE,S_INLINE,S_MULTLINE = range (3) f = open (sys.argv[1]) state = S_CODE comments = '' i = iter (lambda: f.read (1), '') while True: try: c = i.next () except StopIteration: break if state == S_CODE: if c == '/': c = i.next () if c == '*': state = S_MULTLINE elif c == '/': state = S_INLINE elif state == S_INLINE: comments += c if c == '\n': state == S_CODE elif state == S_MULTLINE: if c == '*': c = i.next () if c == '/': comments += '\n' state = S_CODE else: comments += '*%s' % c else: comments += c print comments
Andere Tipps
Dies ist bereits geschehen. Mehrere Male über.
Hier ist ein Parser für die C-Sprache in Python geschrieben. Beginnen Sie mit diesem.
http://wiki.python.org/moin/SeeGramWrap
Andere Parser.
http://wiki.python.org/moin/LanguageParsing
http://nedbatchelder.com/text/python-parsers.html
Sie könnten wahrscheinlich jede ANSI C Yacc Grammatik herunterladen und in PLY-Format überarbeiten, ohne zu viel Mühe und verwenden, die als Startpunkt.
Vielleicht shlex Modul tun würde?
Wenn nicht, gibt es einige leistungsfähigere Alternativen: http://wiki.python.org/moin/LanguageParsing