12

特別なファイル末尾を持つファイル用の追加のパーサーを使用して Clang を拡張するにはどうすればよいですか。つまり、FrontendAction「やあ、ファイル末尾が '.lorem' のすべてのファイルを処理し、抽象構文ツリーを返す ( clang::ASTContext?)"?

について読んだclang::FrontendActionことがclang::Parserありclang::driver::Driverますが、追加のパーサーを使用してコンパイラーを拡張できるように Clang をどこでどのように拡張する必要があるかを理解できませんでした (現在のパーサーを拡張しません)。

4

1 に答える 1

1

ここにいくつかのポインタがあります:

では、拡張子に基づいてコンパイルされたコードの「タイプ」を決定しますtools/clang/lib/Driver/Types.cpplookupTypeForExtensionたとえば、.m拡張子の場合は が返されますTY_ObjCisObjCまた、指定された型が Objective C に属しているかどうかを判断する述語もあります。

パーサーが解析している言語をどのように認識するかについては...メンバーPreprocessorを持つ を介して認識します。LangOptions後者には、 で定義された多くのオプションがありますinclude/clang/Basic/LangOptions.def。たとえば、ObjC1ObjC2. これらは で設定されCompilerInvocation::setLangDefaults、最終的に から呼び出されCompilerInvocation::CreateFromArgsます。

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

また、私見では、clangに追加のパーサーを追加するのは非常に面倒です。すべてがモジュール化されていますが、すべてを作成して結び付けるには、多くの作業を行う必要があります。言語が ObjC を拡張する場合は、既存のパーサーを使用してください。言語がまったく異なる場合、clang は適切なオプションではない可能性があります。

于 2013-01-06T14:01:58.097 に答える