Подтвердить что ты не робот

Как сделать чистый clang front-end?

Я работаю над проектом анализатора исходных текстов на С++, и кажется, что clang - хороший кандидат на синтаксический анализ. Проблема в том, что clang сильно зависит от проекта инфраструктуры "llvm", Как настроить его, чтобы получить чистый интерфейс без какого-либо конкретного ориентированного на машину компьютера? Как и LCC, они предоставляют "нулевой" бэкэнд для людей, которые сосредотачиваются на деталях парсера. Любое предложение оценивается.

4b9b3361

Ответ 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/С++ - это, по сути, машинные языки. Подумайте о препроцессоре и встроенных определениях, размерах встроенных типов и т.д. Некоторые из них можно абстрагировать, но не, например, Препроцессор.