2010-02-17 4 views
11

Est-il possible d'utiliser l'analyseur llvm-clang de manière incrémentielle/en ligne? Dites que j'écris un éditeur et que je veux être capable d'analyser le code C++ que j'ai en face de moi. Je ne veux pas écrire mon propre parser piraté.llvm-clang: analyseur incrémental ou en ligne?

Je voudrais utiliser quelque chose de complet, comme llvm-clang.

Existe-t-il un moyen facile de détourner l'analyseur llvm-clang? (Et est-ce assez rapide pour l'exécuter en continu en arrière-plan)?

Merci!

+0

Quelqu'un veut faire un clone Visual Studio [pour détecter les erreurs avant la compilation] :) – Earlz

+0

Projet intéressant. J'ai attendu un moment pour quelqu'un d'écrire un IDE basé sur Clang. Si vous construisez un IDE complet, pensez à utiliser CMake comme fichier de système/projet de construction. – Tronic

+3

Peut-être que libclang's ['clang_reparseTranslationUnit()'] (http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a) peut répondre à vos besoins? – bames53

Répondre

3

Je ne pense pas que clang peut analyser progressivement les fichiers C++, mais il est l'un de ces objectifs du projet: http://clang.llvm.org/features.html

J'ai écrit quelque chose de similaire pour mon projet de fin d'année. Ce n'était pas un éditeur C++, mais un plugin Visual Studio, dont la tâche principale consistait à améliorer C++ intellisense (comme Visual Assist X). Lorsque j'écrivais ce projet, je pensais aussi à l'analyseur incrémental C++, mais je n'ai trouvé aucune solution appropriée. Pour résoudre le problème C++ IntelliSense, j'ai utilisé l'analyseur C++ normal de GCC. Cependant, il fallait ralentir, pour analyser le fichier après chaque requête d'achèvement de code (ctrl + espace), essayez simplement d'inclure boost :: spirit. Pour que ce projet fonctionne correctement, j'ai analysé les fichiers en arrière-plan et après chaque demande d'achèvement de code, j'ai comparé le fichier actuel avec sa version précédente (via diff) pour détecter les changements effectués lors de la dernière analyse. Ayant ces changements, j'ai mis à jour l'arbre de syntaxe, principalement en ajoutant ou en supprimant des variables. Excepté l'analyse incrémentielle, il existe également un autre problème avec des projets comme celui-ci.

La plupart du temps, vous allez analyser du code C++ qui est en cours de modification, c'est donc un code invalide. Étant donné la grammaire C++ complexe, parfois l'analyseur ne pourra pas récupérer à partir d'erreurs de syntaxe, il ne détectera donc pas correctement certains symboles dans le code.

Un autre problème concerne les différences entre les analyseurs C++/compilateurs. Disons que je travaille avec Visual Studio et que j'ai utilisé une construction spécifique au compilateur VC++ dans mon code. Clang parser ne sera pas capable de l'analyser correctement.

0

Pour écrire quelque chose de similaire à IntelliSense, je vous conseille d'écrire votre propre analyseur en utilisant l'algorithme d'analyse LALR. Puisque vous pouvez sauvegarder son état dans chaque ligne, vous n'avez pas besoin d'analyser le fichier entier quand un fichier a été édité, ce qui est très rapide!
Notez que C++ ne peut pas être entièrement exprimé en BNF, mais je pense que vous pourriez aller assez loin avec quelques ajustements. C'est beaucoup plus de travail que d'utiliser l'interface de Clang, mais vous pouvez toujours utiliser Clang pour analyser les fichiers d'en-tête en collaboration avec votre propre analyseur écrit.

+0

Le problème est qu'il est vraiment difficile d'obtenir un parseur C++ correct. Tout ce que vous écrivez est susceptible de ne pas avoir le comportement exact du compilateur réel. Idéalement, et c'est l'un des objectifs du projet clang, la même bibliothèque utilisée pour compiler le compilateur peut être réutilisée par l'EDI pour obtenir des résultats cohérents. – bames53