2012-12-26 4 views
10

特別なファイルが終了したファイルに対して、追加のパーサーでClangを拡張するにはどうすればよいですか?つまり、「おい!構文ツリー(clang::ASTContext?) "?追加のパーサーでClangを拡張するには?

私は約clang::FrontendActionclang::Parserclang::driver::Driver読んだが、私はどこで、私は現在のパーサを拡張(追加のパーサとコンパイラを拡張することができるようにクランを拡張ないべきかを把握することができていません)。 tools/clang/lib/Driver/Types.cpp

あなたはlookupTypeForExtensionを持って、拡張子に基づいてコンパイルされたコードの「タイプ」を決定します。ここでは

+1

拡張言語はC/C++/Objective-Cに似ていますか? Clangはこれらの種類の言語のフロントエンドです。バックエンド(最適化など)を再利用したい場合は、LLVMだけが必要です。 –

+0

言語はObjective-C++に似ています(構文ではなくセマンティクス)。プリプロセッサは同じです。 – finnsson

+0

私はClangについてよく知りません。しかし、ObjCにトランスコンパイルするのはどうですか? –

答えて

1

はいくつかのポインタです。たとえば、.m拡張子の場合はTY_ObjCを返します。また、特定のタイプが、パーサーが、それはそれはLangOptions部材を有するPreprocessor、経由でそれを知っている...解析していますどの言語を知っているかについては客観C.

に属しているかどうかを決定するisObjC述語を持っています。後者は多くのオプションがinclude/clang/Basic/LangOptions.defで定義されています。たとえば、ObjC1およびObjC2です。これらはCompilerInvocation::setLangDefaultsに設定され、最終的にCompilerInvocation::CreateFromArgsから呼び出されます。

clangドライバはclangフロントエンドを「サブプロセス」として呼び出し、追加のコマンドライン引数を渡します。ドライバはgccと互換性があり、フロントエンドはclangと見なすことができます。

また、IMHOの場合、追加のパーサーを追加するのは難しいでしょう。すべてがモジュール化されていますが、すべてをまとめて結びつけるためには、多くの作業を行う必要があります。あなたの言語がObjCを拡張している場合は、既存のパーサーを使用してください。もしあなたが言語がまったく違うなら、あなたには良い選択肢ではないかもしれません。

関連する問題