Ответ 1
Вот несколько указателей:
в tools/clang/lib/Driver/Types.cpp
у вас есть lookupTypeForExtension
, который определяет "тип" скомпилированного кода на основе расширения. Например, для расширения .m
он возвращает TY_ObjC
. У вас также есть предикат isObjC
, который определяет, принадлежит ли данный тип объекту C.
Что касается того, как синтаксический анализатор знает, какой язык он анализирует... Он знает его через Preprocessor
, который имеет член LangOptions
. Последний имеет множество опций, определенных в include/clang/Basic/LangOptions.def
. Например, ObjC1
и ObjC2
. Они установлены в CompilerInvocation::setLangDefaults
, который в конечном итоге вызывается из CompilerInvocation::CreateFromArgs
.
Помните, что драйвер clang вызовет интерфейс clang как "подпроцесс", передав ему дополнительные аргументы командной строки. Драйвер gcc-совместим, и интерфейс можно увидеть как clang.
Кроме того, ИМХО, было бы неприятно добавить дополнительный парсер для clang. Хотя все модульное, нужно много работать, чтобы создать и связать все вместе. Если ваш язык расширяет ObjC, просто используйте существующий синтаксический анализатор. Если язык - это нечто совершенно иное, то clang не может быть хорошим вариантом для вас.