2010-02-17 4 views
11

Gibt es überhaupt eine Möglichkeit, den llvm-clang Parser inkrementell/online zu verwenden?llvm-clang: inkrementeller oder Online-Parser?

Angenommen, ich schreibe einen Editor und möchte den C++ - Code, den ich vor mir habe, parsen können.

Ich möchte nicht meinen eigenen gehackten Parser schreiben.

Ich möchte etwas mit vollem Funktionsumfang verwenden, wie llvm-clang.

Gibt es eine einfache Möglichkeit, den llvm-clang Parser zu entführen? (Und ist es schnell genug, um es kontinuierlich im Hintergrund laufen zu lassen)?

Danke!

+0

Jemand möchte einen Visual Studio-Klon machen [um Fehler vor dem Kompilieren zu erkennen] :) – Earlz

+0

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

+3

Vielleicht kann libclangs ['clang_reparseTranslationUnit()'] (http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a) Ihren Bedarf erfüllen? – bames53

Antwort

3

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.

0

Zum Schreiben etwas Similair zu IntelliSense, würde ich Ihnen empfehlen, Ihre eigenen Parser mit dem LALR-Parsing-Algorithmus zu schreiben. Da Sie den Status in jeder Zeile speichern können, müssen Sie nicht die gesamte Datei analysieren, wenn eine Datei bearbeitet wurde, was sehr schnell geht!
Beachten Sie, dass C++ nicht vollständig in BNF ausgedrückt werden kann, aber ich denke, dass Sie mit einigen Anpassungen ziemlich weit kommen könnten. Es ist natürlich viel mehr Arbeit als das Clang-Frontend, aber Sie können Clang immer noch für die Analyse von Header-Dateien in Zusammenarbeit mit Ihrem eigenen geschriebenen Parser verwenden.

+0

Das Problem ist, dass es wirklich schwer ist, einen C++ Parser richtig zu machen. Was auch immer Sie schreiben, ist wahrscheinlich nicht das genaue Verhalten des tatsächlichen Compilers. Im Idealfall, und dies ist eines der Ziele des Clang-Projekts, kann dieselbe Bibliothek, die zum Erstellen des Compilers verwendet wird, von der IDE wiederverwendet werden, um konsistente Ergebnisse zu erhalten. – bames53