ここにいくつかのポインタがあります:
では、拡張子に基づいてコンパイルされたコードの「タイプ」を決定します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 は適切なオプションではない可能性があります。