ここにいくつかのポインタがあります:
では、拡張子に基づいてコンパイルされたコードの「タイプ」を決定しますtools/clang/lib/Driver/Types.cpp
。lookupTypeForExtension
たとえば、.m
拡張子の場合は が返されますTY_ObjC
。isObjC
また、指定された型が Objective C に属しているかどうかを判断する述語もあります。
パーサーが解析している言語をどのように認識するかについては...メンバーPreprocessor
を持つ を介して認識します。LangOptions
後者には、 で定義された多くのオプションがありますinclude/clang/Basic/LangOptions.def
。たとえば、ObjC1
とObjC2
. これらは で設定されCompilerInvocation::setLangDefaults
、最終的に から呼び出されCompilerInvocation::CreateFromArgs
ます。
clang ドライバーは、clang フロントエンドを「サブプロセス」として呼び出し、追加のコマンドライン引数を渡すことに注意してください。ドライバーは gcc と互換性があり、フロントエンドは clang 自体と見なすことができます。
また、私見では、clangに追加のパーサーを追加するのは非常に面倒です。すべてがモジュール化されていますが、すべてを作成して結び付けるには、多くの作業を行う必要があります。言語が ObjC を拡張する場合は、既存のパーサーを使用してください。言語がまったく異なる場合、clang は適切なオプションではない可能性があります。