Я работаю над проектом анализатора исходных текстов на С++, и кажется, что clang - хороший кандидат на синтаксический анализ. Проблема в том, что clang сильно зависит от проекта инфраструктуры "llvm", Как настроить его, чтобы получить чистый интерфейс без какого-либо конкретного ориентированного на машину компьютера? Как и LCC, они предоставляют "нулевой" бэкэнд для людей, которые сосредотачиваются на деталях парсера. Любое предложение оценивается.
Как сделать чистый clang front-end?
Ответ 1
Я недавно сделал это в Windows.
Загрузите источник clang и llvm из здесь.
Установите cmake и Python (вопреки документам, вам нужен Python только для создания clang, по крайней мере, cmake отказывается, если он не может найти среду выполнения Python).
Вам также нужны VS2008 или VS2010.
Одна вещь, которая не совсем очевидна, - это требуемая структура каталогов:
projectRoot
build <- intermediate build files and DLLs, etc. will go here
llvm <- contents of llvm-3.0.src from llvm-3.0.tar go here
tools
clang <- contents of clang-3.0.src from clang-3.0.tar go here
И следуйте инструкциям инструкции по созданию окон с шага 4 и далее. Не пытайтесь использовать графический интерфейс cmake, это ужас; просто используйте команды, указанные в инструкциях по сборке.
Как только сборка завершена (требуется некоторое время), вы будете иметь:
projectRoot
build
bin
Release <- libclang.dll will be here
lib
Release <- libclang.lib will be here
llvm
tools
clang
include
clang-c <- Index.h is here
Index.h определяет API для доступа к информации о вашем исходном коде; он содержит довольно немного документации об API.
Чтобы начать использовать clang, вам нужно что-то вроде:
CXIndex index = clang_createIndex(1, 1);
// Support Microsoft extensions
char *args[] = {"-fms-extensions"};
CXTranslationUnit tu = clang_parseTranslationUnit(index, "mySource.c", args, ARRAY_SIZE(args), 0, 0, 0);
if (tu)
{
CXCursor cursor = clang_getTranslationUnitCursor(tu);
// Use the cursor functions to navigate through the AST
}
Ответ 2
К сожалению, вы не можете получить "чистый" интерфейс без деталей, специфичных для машины. C/С++ - это, по сути, машинные языки. Подумайте о препроцессоре и встроенных определениях, размерах встроенных типов и т.д. Некоторые из них можно абстрагировать, но не, например, Препроцессор.