ich suche nun seit einiger Zeit nach einem C++ Parser, der in Python geschrieben
ist oder via extending von Python aus benutzt werden kann.
Ich finde hier aber entweder Lösungen, die nur einen Bruchteil der Syntax von
C++ verstehen oder Vorschläge, wie man einen solchen Parser schreiben könnte.
Leider gibt es sehr viele Möglichkeiten, von denen jede eine intensive
Einarbeitung verlangt. Deswegen wollte ich hier mal fragen, was ihr für die
einfachste Lösung haltet und ob es vielleicht noch ganz andere Varianten gibt.
1. Grammatik Tools
- ANTLR
hierfür gibt es schon eine C++ Grammatik, die allerdings C++ Code erzeugt.
Ich weiß nicht, wie groß der Aufwand ist diese umzuschreiben.
pyparsing
scheint ein nettes Modul zu sein, aber noch keine C++ Grammatik zu finden?
Eine vollständige C++ Grammatik zu schreiben erscheint mir ein wenig aussichtslos
2.1 nette C++ parser 2.2 Python Binding Tools
- Pyrex/SWIG
Wenn ich es richtig verstehe muss man mit für alle c++ Header einen Wrapper Header schreiben.
Aufwand schätze ich sehr hoch ein.
Boost.Python + Py++
mit Py++ kann man sich diese Wrapper Header erstellen lassen, klingt einfach!- python-ogre(source via svn) benutzt inzwischen wieder Boost mit Py++.
Wenn man in den code schaut (/code_generators/...)
sieht es aber alles andere als einfach aus.
Habe für OpenC++ das mal versucht. Mir ist nicht ganz klar welchen Header ich
durch Py++ jagen muss (einen? alle? selbst erstellen?) und wie man aus dem
Ergebnis dann eine von diesen shared libraries bekomme, die man in python
importieren kann.
- python-ogre(source via svn) benutzt inzwischen wieder Boost mit Py++.
- GCCXML
gccxml ist ein guter Ansatz. Es druckt die interne Repräsentation aus,
die GCC beim compilieren erstellt. D.h. die gesamte C++ Syntax wird erkannt.
Leider werden bei der Ausgabe keine function bodies ausgegeben,
nur Funktions und Klassen Deklarationen(?).
Tragisch, weil es mit pygccxml schon ein Python Binding gibt.
Eine Erweiterung hierfür wurde schon von djlauk.de geschrieben (thread,download),
habe diese aber nicht zum Laufen bekommen.
Elkhound/Elsa
mit Elsa kann man c++ Dateien parsen und den "Abstract Syntax Tree" als xml ausgeben.
Man könnte mit diesen Dateien weiterarbeiten, dann bleibt Parsen und interne
Repräsentation als Aufgabe.
Leider sieht die xml Ausgabe ein wenig wirr aus, Ausschnitt:Code: Alles auswählen
<declarator _id="AST0x83083c0" decl="AST0x83082d8" var="TY0x8313588" type="TY0x8313740" context="1"> <d_func _id="AST0x83082d8" loc="main.c:1:5" base="AST0x8308260" params="FL0x83082c0" cv="0" ismember="false"> <d_name _id="AST0x8308260" loc="main.c:1:5" name="AST0x8308248"> <pq_name _id="AST0x8308248" loc="main.c:1:5" name="main"> </pq_name> </d_name> <list_d_func_params _id="FL0x83082c0"> <_List_Item item="AST0x83082c0"> <asttypeid _id="AST0x83082c0" spec="AST0x8308270" decl="AST0x8308298">
btw. das Zielsystem ist Linux (ubuntu).
Grüße W.