Я работаю над проектом анализатора исходных текстов на C++, и кажется, что clang - хороший кандидат для работы синтаксического анализа. Проблема в том, что clang сильно зависит от проекта инфраструктуры «llvm», Как настроить его, чтобы получить чистый интерфейс без какого-либо конкретного ориентированного на машину компьютера? Как и LCC, они предоставляют «нулевой» бэкэнд для людей, которые сосредоточены на деталях парсера. Любое предложение оценивается.Как сделать чистый clang front-end?
ответ
Я недавно сделал это на Windows.
Скачайте источник clang и llvm с here.
Установить 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
И следовать windows build instructions с шага 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.
Чтобы начать использовать лязг вам нужно что-то вроде:
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
}
Спасибо arx! Я пробую ваш подход. –
Да, он отлично работает. –
К сожалению, вы не можете получить «чистый» передний конец без машиннозависимых деталей. C/C++ - это, по сути, машинные языки. Подумайте о препроцессоре и встроенных определениях, размерах встроенных типов и т. Д. Некоторые из них можно абстрагировать, но не, например, препроцессор.
Помимо нескольких библиотек поддержки (которые предоставляют некоторые служебные классы и независимый от ОС код) вам не нужен полный LLVM. Какие библиотеки Clang вы используете? –
Я собираюсь использовать цельный исполняемый файл clang, но с фиктивным контентом. –
Ты знаешь что-нибудь о 'libclang'? Это C-библиотека (с гарантированным стабильным интерфейсом), которая может выставить Clang AST. Это намного легче. В противном случае вы можете просто использовать библиотеки C++ (остерегайтесь того, что интерфейс не стабилен), исполняемый файл встраивает материал, который не будет вам действительно полезен, я думаю. –