Frage

Was sind einige gute Tools für einen schnellen Start für das Parsen bekommen und C / C ++ Code zu analysieren?

Insbesondere suche ich nach Open-Source-Tools, die die C / C ++ Präprozessor und Sprache verarbeiten. Vorzugsweise würden diese Tools verwenden lex / yacc (oder flex / Bison) für die Grammatik, und nicht zu kompliziert sein. Sie sollten die neuesten ANSI C / C ++ Definitionen verarbeiten.

Hier ist, was ich bisher gefunden habe, sondern auf sie im Detail nicht sah (Gedanken?):

  • CScope - Old-School-C-Analysator. Scheint nicht ein volles Parse zu tun, wenn. Beschrieben als verherrlicht ‚grep‘ für C-Funktionen zu finden.
  • GCC - Jeder Lieblings Open-Source-Compiler. Sehr kompliziert, aber es scheint alles zu tun. Es gibt ein verwandtes Projekt GCC-Erweiterungen für die Erstellung von GEM genannt, hat aber nicht aktualisiert seit GCC 4.1 (2006).
  • PUMA - Der reine Manipulators. (Von der Seite: „Die Absicht dieses Projektes ist es, bietet eine Bibliothek von Klassen für die Analyse und Manipulation von C / C ++ Quellen. Dafür Zweck PUMA stellt Klassen zum Scannen, Parsen und natürlich Manipulieren C / C ++ Quellen. "). Das sieht vielversprechend aus, aber seit 2001 offenbar PUMA wurde nicht aktualisiert wurde aufgenommen in AspectC ++ , aber auch dieses Projekt hat seit 2006 nicht mehr aktualisiert.
  • Verschiedene C / C ++ roh Grammatiken. Sie können erhalten c-c ++ - Grammatiken-1.2.tar.gz , aber dies hat seit 1997 unmaintained ein wenig Google Such andere grundlegende lex / yacc Grammatiken zieht, die als Ausgangspunkt dienen könnte.
  • Jede andere?

Ich hoffe, diese als Ausgangspunkt zu verwenden, für die Übersetzung von C / C ++ Quelle in eine neue Spielzeugsprache.

Danke! -Matt

(Hinzugefügt 2/9): Nur eine Klarstellung: Ich semantische Informationen aus dem Prä-Prozessor zusätzlich zu dem C / C ++ Code selbst extrahieren möge. Ich will nicht „#define foo 42“ in die ganze Zahl verschwinden „42“, sondern bleiben auf den Namen „foo“ angebracht. Dies ist leider schließt mehrere Lösungen, die den Prä-Prozessor zuerst ausgeführt und liefern nur die C / C ++ Parse-Baum)

War es hilfreich?

Lösung

Parsing C ++ ist extrem hart, weil die Grammatik unentscheidbar ist. Um Zitat Yossi Kreinin :

  

Outstandingly komplizierte Grammatik

     

"Überragend" sollte wörtlich interpretiert werden, da alle gängigen Sprachen haben kontextfreie (oder „fast“ kontextfrei) Grammatiken, während C ++ hat unentscheidbar Grammatik. Wenn Sie Compiler und Parser mögen, werden Sie wahrscheinlich wissen, was das bedeutet. Wenn Sie nicht in diese Art der Sache sind, gibt es ein , um das Problem mit Parsing C ++ zeigt: ist AA BB(CC); eine Objektdefinition oder eine Funktionsdeklaration? Es stellt sich heraus, dass die Antwort schwer auf dem Code hängt vor die Aussage - den „Kontext“. Dies zeigt (auf einer intuitiven Ebene), dass die C ++ Grammatik ist sehr kontextsensitiv.

Andere Tipps

Sie können sehen Klirren das llvm für die Analyse verwendet.

Support C ++ vollständig jetzt Link

Die ANTLR Parser-Generator hat eine Grammatik für C / C ++ sowie Preprocessor. Ich habe es nie benutzt, so kann ich nicht sagen, wie vollständig seine Parsen von C ++ sein werden. ANTLR selbst hat ein paar Mal ein nützliches Werkzeug für mich viel einfache Sprachen für das Parsen.

auf Ihr Problem Je GCCXML könnte Ihre Antwort sein. Grundsätzlich analysiert es die Quelle GCC und dann gibt Ihnen leicht verdaulich XML von Parse-Baum. Mit GCCXML Sie sind ein für allemal erledigt.

pycparser ist ein kompletter Parser für C (C99) in Python geschrieben. Es verfügt über einen voll konfigurierbare AST-Backend, so ist es als Grundlage für jede Art von Sprachverarbeitung verwendet werden, Sie benötigen.

wird nicht unterstützt C ++, though. Zugegeben, es ist viel härter als C.


Update (2012) : zu diesem Zeitpunkt der Antwort, ohne jeden Zweifel, wäre Clang - es modular ist, unterstützt die vollen C ++ (mit vielen C ++ - 11 Funktionen) und hat eine relativ freundliche Codebasis. Es hat auch einen C-API für Bindungen zu Hochsprachen (dh für Python ).

Haben Sie einen Blick an, wie doxygen Werke, vollständige Quellcode verfügbar und es ist flex-basiert.

Ein irreführender Kandidat ist GOLD , die ein kostenloser Windows-basierten Parser Toolkit für die Erstellung von Übersetzern explizit ist . Ihre Liste von Sprachen unterstützt bezieht sich auf die Sprachen, in denen ein Parser implementieren, nicht die Liste der unterstützten Parse-Grammatiken.

Sie haben nur Grammatiken für C und C #, C ++ nicht.

Parsing C ++ ist eine sehr komplexe Herausforderung .

Es ist der Boost-/ Spirit Rahmen und ein paar Jahren haben sie mit dem Gedanken spielen, einen C ++ Parser der Implementierung, aber es ist noch lange nicht abgeschlossen .

vollständig und ordnungsgemäß ISO C ++ Parsen ist alles andere als trivial, und es gab in der Tat viele ähnliche Anstrengungen. Aber es ist ein in sich komplexe Aufgabe, die nicht leicht zu bewerkstelligen ist, ohne einen vollständigen Compiler-Frontend zu Umschreiben alle C ++ verstehen und der Präprozessor. Eine Pre-Prozessorimplementierung „Welle“ genannt wird, ist vom Geist Leuten zur Verfügung.

Wie gesagt, möchten Sie vielleicht einen Blick haben unter gcc Plugins die Laufzeitbibliothek Lizenz verwenden, so würde ich davon ausgehen, dass sich die Dinge schnell ändern werden, leicht wenn die Menschen die gcc-basierte C ++ Parser für solche Zwecke nutzen können binär mit Plug-In.

Also, auf den Punkt gebracht: Wenn Sie die Böcke: EDG, wenn Sie etwas frei / Open-Source- müssen jetzt : else / oink sind recht vielversprechend aus, wenn Sie etwas Zeit haben, möchten Sie vielleicht verwenden gcc für Ihr Projekt.

Eine weitere Option nur für C-Code ist CScout .

Die Grammatik für C ++ ist eine Art notorisch behaart. Es gibt einen guten Faden an Lambda darüber, aber das Wesentliche ist, dass C ++ Grammatik willkürlich erfordern kann viel Look-Ahead.

Für die Art von Sache, die ich denke, Sie tun könnte, würde ich darüber nachdenken, Hacking entweder Gnu CC oder Splint . Gnu CC insbesondere trennt ziemlich gründlich die Sprache Erzeugungsteil aus, so dass Sie am besten sein könnte, eine neue g ++ Backend-off zu bauen.

Eigentlich PUMA und AspectC ++ sind noch beide aktiv gepflegt und aktualisiert. Ich war auf der Suche in AspectC mit ++ und wundere mich über den Mangel an Updates selbst. Ich mailte den Autor, der sagte, dass beide AspectC ++ und PUMA sind noch in der Entwicklung. Sie können durch SVN Quellcode erhalten https://svn.aspectc.org/repos/ oder können Sie regelmäßige binäre baut auf http://akut.aspectc.org bekommen. Wie bei vielen ausgezeichneten c ++ in diesen Tagen Projekte hat der Autor keine Zeit mit Web-Seite Wartung zu halten haben. Das macht Sinn, wenn Sie einen Vollzeit-Job und ein Leben haben.

Elsa schlägt alles, was ich weiß, die Hände nach unten für C ++ Parsing, obwohl es nicht 100% kompatibel ist. Ich bin ein Fan. Es ist ein Modul, das C ++ druckt, so dass möglicherweise ein guter Ausgangspunkt für Ihr Spielzeug Projekt sein.

Wie wäre es etwas einfacher zu verstehen wie tiny-C oder Kleine C

Sehen Sie unsere C ++ Front End für einen voll funktionsfähige C ++ Parser: baut Äste, Symboltabellen, tut Namen und Typ Auflösung. Sie können sogar den Präprozessor analysieren und behalten Richtlinien. Die C ++ Frontend ist oben auf der DMS Software Reengineering Toolkit , die Sie diese Informationen verwenden können beliebig auszuführen Änderungen am Quellcode unter Verwendung von Source-to-Source-Transformationen.

DMS ist der ideale Motor so einen Übersetzer für die Umsetzung.

Having said that, ich habe nicht viel Punkt in Ihrem vorgestellt Aufgabe sehen; Ich nicht siehe viel Wert bei dem Versuch, C ++ zu ersetzen, und Sie werden feststellen, Gebäude ein kompletter Übersetzer eine enorme Menge an Arbeit, vor allem, wenn IhrFormal Ziel ist eine „Spielzeug“ Sprache. Und es gibt wahrscheinlich wenig Sinn Parsen ++ C einen robusten Parser verwenden, wenn ihr einziger Zweck zu produzieren eine isomorph Version von C ++, die leichter zu analysieren (warten ist, postulierten wir eine robuste C ++ bereits!).

EDIT Mai 2012: DMS der C ++ Frontend verarbeitet jetzt GCC3 / gcc4 / C ++ 11, Microsoft VisualC 2005/2010. Kräftig.

EDIT Februar 2015:. Jetzt übernimmt C ++ 14 in GCC und MS Dialekten

EDIT August 2015:. Jetzt analysiert und erfaßt sowohl der Code und die Präprozessordirektiven in einem einheitlichen Baum

Vor einer Weile mir ein Tool zu schreiben versucht, die Unit-Tests für c-Dateien automatisch generieren wird.

Für preprosessing habe ich die Dateien durch GCC. Der Ausgang ist hässlich, aber man kann leicht in die im ursprünglichen Code aus der vorverarbeiteten Datei verfolgen. Aber für Ihre Bedürfnisse Sie könnte somthing anderes brauchen.

Ich benutzte Meter als Basis für eine C Parser. Es ist Open-Source und nutzt lex und yacc. Dies machte es leicht, ohne sie vollständig zu verstehen lex & yacc in kurzer Zeit aufstehen und laufen.

Ich schrieb auch einen C-App, da die lex & yacc Lösung kann mir nicht helfen, Funktionalität über Funktionen zu verfolgen und die Struktur der gesamten Funktion in einem Durchgang zu analysieren. Es wurde wartbaren in kurzer Zeit und wurde aufgegeben.

Was ist ein Tool wie GNU CFlow , das kann den Code analysieren und produzieren Charts von Call-Graphen, hier ist es, was die Opengroup (man page) hat über cflow zu sagen. Die GNU-Version von cflow kommt mit Source und Open-Source auch ...

Hope, das hilft, Freundliche Grüße, Tom.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top