インクリメンタル/オンラインでllvm-clangパーサーを使用する方法はありますか?
エディターを書いていて、目の前にある C++ コードを解析できるようにしたいとします。
私は独自のハッキングされたパーサーを書きたくありません。
llvm-clang のようなフル機能のものを使用したいと思います。
llvm-clang パーサーを乗っ取る簡単な方法はありますか? (そして、バックグラウンドで継続的に実行するのに十分な速さですか)?
ありがとう!
私は、clang が C++ ファイルを段階的に解析できるとは思わないが、それはこのプロジェクトの目標の 1 つである: http://clang.llvm.org/features.html
私は最終年度のプロジェクトに似たようなものを書きました。これは C++ エディターではなく、Visual Studio プラグインであり、主なタスクは C++ インテリセンス (Visual Assist X など) を改善することでした。
このプロジェクトを書いていたとき、C++ インクリメンタル パーサーについても考えていましたが、適切な解決策が見つかりませんでした。C++ インテリセンスの問題を解決するために、GCC の通常の C++ パーサーを使用しました。ただし、各コード補完要求 (ctrl + スペース) の後にファイルを解析するのは遅かったので、boost::spirit を含めてみてください。このプロジェクトを適切に機能させるために、バックグラウンドでファイルを解析し、各コード補完要求の後、現在のファイルを以前のバージョンと比較して (diff を介して) 最後の解析からの変更を検出しました。これらの変更により、主に変数を追加または削除して、構文ツリーを更新しました。
インクリメンタル解析を除いて、このようなプロジェクトには別の問題もあります。ほとんどの場合、編集中の C++ コードを解析するため、無効なコードになります。複雑な C++ 文法を考えると、パーサーが構文エラーから回復できないことがあるため、コード内の一部のシンボルを正しく検出できません。
もう 1 つの問題は、C++ パーサーとコンパイラの違いです。Visual Studio で作業していて、自分のコードで VC++ コンパイラ固有の構造を使用したとします。Clang パーサーは正しく解析できません。
IntelliSense に似たものを作成するには、LALR 解析アルゴリズムを使用して独自のパーサーを作成することをお勧めします。各行の状態を保存できるため、ファイルが編集されたときにファイル全体を再解析する必要がなく、非常に高速です!
C++ は BNF で完全には表現できないことに注意してください。もちろん、Clang のフロントエンドを使用するよりもはるかに多くの作業が必要ですが、独自に作成したパーサーと連携してヘッダー ファイルを分析するために Clang を使用することもできます。