Ich glaube nicht klappern kann C++ Dateien inkrementell analysieren, aber es ist eines dieser Projektziele: http://clang.llvm.org/features.html
Ich habe etwas Ähnliches geschrieben für meine Diplomarbeit. Es war kein C++ - Editor, sondern ein Visual Studio-Plugin, dessen Hauptaufgabe darin bestand, C++ intellisense zu verbessern (wie Visual Assist X).
Als ich dieses Projekt schrieb, habe ich auch über C++ inkrementellen Parser nachgedacht, aber ich habe keine geeignete Lösung gefunden. Um das C++ - intellisense-Problem zu lösen, habe ich den normalen C++ - Parser von GCC verwendet. Allerdings war es zu langsam, Dateien nach jeder Code-Vervollständigungs-Anfrage (Strg + Leerzeichen) zu analysieren, versuchen Sie einfach boost :: spirit. Um dieses Projekt richtig arbeiten zu lassen, analysierte ich Dateien im Hintergrund und nach jeder Codevervollständigungsanfrage verglich ich die aktuelle Datei mit der vorherigen Version (via diff), um Änderungen zu erkennen, die beim letzten Parsing vorgenommen wurden. Mit diesen Änderungen habe ich den Syntaxbaum aktualisiert, meistens durch Hinzufügen oder Entfernen von Variablen.
Außer dem inkrementellen Parsing gibt es auch ein anderes Problem mit Projekten wie diesem. Meistens werden Sie C++ - Code analysieren, der bearbeitet wird, so dass es ungültiger Code ist. Angesichts der komplexen C++ - Grammatik kann der Parser manchmal nicht von Syntaxfehlern profitieren, sodass einige Symbole im Code nicht korrekt erkannt werden.
Ein anderes Problem sind C++ Parser/Compiler Unterschiede. Nehmen wir an, ich benutze in Visual Studio arbeiten und ich habe einige VC++ Compiler-spezifische Konstruktion in meinem Code verwendet. Der Clang-Parser kann sie nicht korrekt analysieren.
Jemand möchte einen Visual Studio-Klon machen [um Fehler vor dem Kompilieren zu erkennen] :) – Earlz
Interessantes Projekt. Ich habe eine Weile gewartet, bis jemand eine Clang-basierte IDE geschrieben hat. Wenn Sie am Ende eine vollständige IDE erstellen, sollten Sie CMake als Buildsystem/Projektdateien verwenden. – Tronic
Vielleicht kann libclangs ['clang_reparseTranslationUnit()'] (http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a) Ihren Bedarf erfüllen? – bames53