Как сделать чистый лягушатник? - PullRequest
22 голосов
/ 09 ноября 2011

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

Ответы [ 2 ]

8 голосов
/ 14 февраля 2012

Я недавно сделал это на 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
}
1 голос
/ 16 февраля 2012

К сожалению, вы не можете получить «чистый» интерфейс без специфических для машины деталей.C / C ++ по своей сути являются машинно-связанными языками.Подумайте о препроцессоре и встроенных определениях, размерах встроенных типов и т. Д. Некоторые из них могут быть абстрагированы, но не, например, препроцессор.

...