Gibt es Parsing-Tools wie gcc-xml für die C++11-Codesyntax?

Ich muss ein einfaches Tool schreiben, das eine einfache Analyse über vorhandenen C++-Code zurückgibt.

Und so suche ich nach einem C++-Parser, der mir zumindest Informationen zu Headern geben würde:

  • Liste der Benutzertypen,
  • Liste der Funktionen,
  • Liste der Methoden von Benutzertypen.

Für den ersten Schritt würde das reichen.

Ich habe das perfekte Tool gefunden: gcc-xml , das diese Sache macht, aber es schlägt mit C++ 11-Code und jünger fehl. Gibt es eine Lösung für diese Aufgabe? Ich denke, das muss es, denn Compiler, die C++ 11 unterstützen, verstehen Code irgendwie :-)

Aufgrund der inhärenten Komplexität gibt es kein „einfaches“ Werkzeug für die Verarbeitung von C++. Es gibt komplexe Tools, die scheinbar einfache Aufgaben ermöglichen.

Antworten (3)

Ich würde doxygen empfehlen - obwohl die C++11-Unterstützung ein paar ausstehende Fehler zu haben scheint, sollte es Ihnen einen sehr guten Start geben.

  • Frei
  • Liste der Typen - ja
  • Liste der Funktionen - ja
  • Liste der Methoden von Benutzertypen - ja

Ebenfalls:

  • UML-Diagramme (mit dem Graghviz-Punktwerkzeug).
  • Links zum Code
  • Ermöglicht es Ihnen, Ihren Code zu dokumentieren und die endgültige Dokumentation aus dem Code zu generieren.
  • Benutzerdefinierte Parser für andere Sprachen sind verfügbar.
  • Plattformübergreifend - Mac, Linux, Unix und Windows
  • Mehrere Ausgabeformate
  • weit verbreitet.
Ja, das ist ein großartiges Tool, aber ich bezweifle, dass es hier verwendet werden kann. Ich kann keine C++-API finden, um es zu verwenden ... Ich denke, es ist möglich, es als Konsolentool zu verwenden, werde mir das ansehen.
IIRC, das wxPython-Projekt Phoenix plante, doxygen zu verwenden, um XML für die C++-Bibliotheken zu generieren und diese dann zu analysieren, um die Python-Schnittstellendateien zu erstellen.
@Arkady: Eine C++-API? Ich glaube nicht, dass das "perfekte Tool: gcc-xml" über eine C++-API verfügt, und Sie haben dies in Ihren Anforderungen in Ihrer Frage nicht aufgeführt. Ändern Sie die Anforderungen spontan?

Die gccxml-Site gibt jetzt an, dass sie durch CastXML ersetzt wurde , basierend auf LLVM >= 3.6, das C++ 11 unterstützt.

CastXML funktioniert gut. Laden Sie zur Installation unter OSX eine kompilierte Binärdatei von github.com/thewtex/CastXMLSuperbuild herunter

Unser DMS Software Reengineering Toolkit mit seinem C++ Frontend ist wahrscheinlich ein guter Kandidat für Ihre Aufgabe.

DMS ist als Grundlage für benutzerdefinierte Programmanalyse- und Transformationstools konzipiert. Es bietet ein Ökosystem aus Analysemaschinen, Baumerstellern, Attributgrammatikberechnungen, Symboltabellenverwaltung, Flussanalyse, Mustervergleichen auf Quellebene, Transformationsmaschinen auf Quellebene und Entwicklungstools. Man verwendet DMS, indem man Parser (und erweiterte Analysatoren) für eine oder mehrere interessierende Sprachen einfügt. Für den Fall, dass es keinen handelsüblichen Parser gibt, bietet DMS eine starke Parser-Generierungsmaschinerie zum Erstellen eines solchen Parsers. (Wir haben kürzlich einen Erlang-Parser [nur] als Herausforderung an einem Tag gebaut).

Das C++-Frontend wurde mithilfe der DMS-Unterstützung erstellt. Es verarbeitet praktisch alle (und wir vervollständigen) C++14 in ANSI-, GCC- und Microsoft-Varianten. Mit DMS analysiert es C++-Quelltext mit seinem eigenen vollständigen Präprozessor, erstellt präzise abstrakte Syntaxbäume und genaue Symboltabellen. Es bietet Steuerungs- und Datenflussanalysen auf Methodenebene. Alle diese Informationen stehen einem DMS-Anwender für sein individuelles Tool zur Verfügung.

Wenn Sie Source-to-Source-Transformationen auf den Code anwenden möchten, stellt DMS diese Funktion direkt bereit, indem das Frontend verwendet wird, um die Musterbeschreibungsmaschinerie zu unterstützen. die Transformationen können auf willkürlichen Tatsachen beruhen, die aus den Symboltabellen oder der Strömungsanalysemaschine gezogen werden. Oder Sie könnten einfach XML für Fakten generieren, die Sie mit dem XML-Paket von DMS exportieren möchten.

Um beispielsweise eine Liste von Benutzertypen zu erhalten, würde man die Symboltabellen besuchen (eingebaute DMS-Maschinen unterstützen einen vom Front-End bereitgestellten Besucher) und Einträge auf Typen untersuchen. Man kann exotischere Dinge tun; Beispielsweise können Sie zu einem beliebigen Ausdrucksbaum navigieren und nach dem Typ des Ausdrucks fragen.

Zur Frage von OP:

  • Liste der Benutzertypen: Ja
  • Liste der Funktionen: Ja
  • Liste der Methoden von Benutzertypen: Ja

DMS und das C++-Frontend wurden verwendet, um eine Vielzahl von C++-Tools zu erstellen (auch auf der Website) sowie massive architektonische Änderungen an großen C++-Codes durchzuführen (siehe technische Dokumente auf der Website).