Как расширить Clang с помощью дополнительного анализатора?

Как я могу расширить Clang с помощью дополнительного парсера для файлов со специальным окончанием файла, то есть я могу разработать FrontendAction, который гласит: "Эй, я позабочусь обо всех файлах с файлом, заканчивающимся".lorem "и вернуть абстрактное синтаксическое дерево (clang::ASTContext?)"?

Я читал о clang::FrontendAction, clang::Parser и clang::driver::Driver, но мне не удалось выяснить, где и как я должен расширить Clang, чтобы иметь возможность расширять компилятор с помощью дополнительного синтаксического анализатора (не расширяя текущий синтаксический анализатор).

Ответ 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 не может быть хорошим вариантом для вас.