2011-11-09 4 views
21

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

+1

Помимо нескольких библиотек поддержки (которые предоставляют некоторые служебные классы и независимый от ОС код) вам не нужен полный LLVM. Какие библиотеки Clang вы используете? –

+0

Я собираюсь использовать цельный исполняемый файл clang, но с фиктивным контентом. –

+12

Ты знаешь что-нибудь о 'libclang'? Это C-библиотека (с гарантированным стабильным интерфейсом), которая может выставить Clang AST. Это намного легче. В противном случае вы можете просто использовать библиотеки C++ (остерегайтесь того, что интерфейс не стабилен), исполняемый файл встраивает материал, который не будет вам действительно полезен, я думаю. –

ответ

8

Я недавно сделал это на 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 
} 
+0

Спасибо arx! Я пробую ваш подход. –

+0

Да, он отлично работает. –

1

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