Ist es überhaupt möglich, C++ mit unvollständigen Deklarationen mit Clong mit seiner vorhandenen libclang API zu analysieren? I.e. Analysieren Sie die .cpp-Datei, ohne alle Header einzubeziehen, und schließen Sie die Deklarationen direkt ab. so z.B. Der folgende Text:Clang für Fuzzy-Analyse C++
A B::Foo(){return stuff();}
Werden unbekanntes Symbol A erkennt, meinen Rückruf anrufen, die abzieht A ist eine Klasse, meine Magie Heuristik, dann rufen Sie diese auf die gleiche Weise mit B und Foo und Sachen Rückruf. Am Ende möchte ich schließen können, dass ich ein Mitglied Foo der Klasse B gesehen habe, das A zurückgibt, und das ist eine Funktion. Oder etwas in diesem Sinne. Kontext: Ich möchte sehen, ob ich sinnvolle Syntaxhervorhebung und on-the-fly-Code-Analyse tun kann, ohne alle Header sehr schnell zu analysieren.
[EDIT] Um zu klären, ich suche sehr stark eingeschränkt C++ Parsing, möglicherweise mit einigen Heuristik, einige der Einschränkungen zu heben.
C++ - Grammatik ist voll von Kontextabhängigkeiten. Ist Foo() ein Funktionsaufruf oder eine Konstruktion eines Temporären der Klasse Foo? Ist Foo <Bar> Zeug; eine Vorlage Foo <Bar> Instanziierung und Deklaration von Variablen Zeug, oder ist es komisch aussehende 2 Anrufe zu überladenen Operator < und Operator>? Es ist nur möglich, im Kontext zu sagen, und der Kontext kommt oft von der Analyse der Header.
Was ich suche, ist eine Möglichkeit, meine benutzerdefinierten Regeln zu verbinden. Z.B. Ich weiß, dass ich Win32-Symbole nicht überlasten, also kann ich sicher annehmen, dass CreateFile immer eine Funktion ist, und ich kenne sogar seine Signatur. Ich weiß auch, dass alle meine Klassen mit einem Großbuchstaben beginnen und Substantive sind, und Funktionen sind normalerweise Verben, so dass ich vernünftig raten kann, dass Foo und Bar Klassennamen sind. In einem komplexeren Szenario weiß ich, dass ich keine side-effekt-freien Ausdrücke wie < b> c schreibe; also kann ich annehmen, dass a immer eine Template Instanziierung ist. Und so weiter.
Also die Frage ist, ob es möglich ist, Clang API zu verwenden, um jedes Mal zurückzurufen, wenn es auf ein unbekanntes Symbol trifft, und es eine Antwort zu geben, die meine eigene Nicht-C++ - Heuristik verwendet. Wenn meine Heuristik fehlschlägt, dann scheitert offensichtlich das Parsen. Und ich spreche nicht von Parsing Boost-Bibliothek :) Ich spreche über sehr einfache C++, wahrscheinlich ohne Vorlagen, auf ein Minimum beschränkt, das in diesem Fall Clam umgehen kann.
Sie können CLang jederzeit direkt ändern. Ich bin nicht sicher, wie leicht es wäre, da es viele Male gibt, wenn Nachschlagen legal dazu führen kann, dass nichts gefunden wird (zB abhängige Kontexte, ADL). –
Brauchen Sie unbedingt Klang? Wenn nicht, macht es vielleicht Sinn, andere Lösungen zu versuchen? Es kann passieren, dass sie besser funktionieren. –
Ja, ich habe mir antlr angeschaut, und es ist machbar, obwohl ich vermute, dass es härter und weniger leistungsfähig sein würde. Tatsächlich benutze ich antlr, um ein begrenztes C++ zu parsen, also wäre es mir vertraut. Gibt es andere echte Alternativen? –