Как ускорить парсинг кода C ++ с помощью libclang? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть проект, который необходимо проанализировать перед исходной компиляцией. Это нужно для размышлений. Короче говоря, я хочу проверить отредактированные файлы .h на наличие некоторых атрибутов в коде и собрать информацию об этом для создания определенных c включаемых файлов. Например, отражаемые классы / поля / методы будут отмечены как META(parameters...). Этот макрос будет определен следующим образом: #define META(...) __attribute__(annotate("reflectable")).

Код должен выглядеть следующим образом (аналогично Qt QObject или Unreal Engine 4):

1.

// --- macros outside of header to parse ---

// Marks declaration as reflectable (with some metadata), empty for base compiler, useful for clang
#ifdef __clang__
    #define META(...) __attribute__(annotate("reflectable"))
#else
    #define META(...)
#endif

// Injects some generated code after parsing step, empty for clang, useful for base compiler
#ifdef __clang__
    #define GENERATED_REFLECTION_INFO
#else
    #define GENERATED_REFLECTION_INFO GENERATE_CODE(__FILE__, __LINE__)
#endif
// --- reflectable class ---

META(Serializable, Exposed, etc)
class MyReflectableClass : public BaseReflectableClass
{
    GENERATED_REFLECTION_INFO
    
public:
    // Fields examples
    
    META()
    int32 MyReflectableField;

    META(SkipSerialize)
    float MySecondaryReflectableField;

    // Methods example

    META(RemoteMethod)
    void MyReflectableMethod(int32 Param1, uint8 Param2);
};

libclang использовался для этой цели. Но когда проект включает в себя что-то вроде <string> или <memory>, это приводит к долгому синтаксическому анализу длинной цепочки зависимостей в стандартной библиотеке.

Также, если в проекте много заголовков, может произойти аналогичная ситуация.

Как избежать парсинга полной стандартной библиотеки? Возможно, какие-то кеши, которые я мог бы использовать в libclang?

Или, возможно, есть способы пропустить анализ этих включений и убедить синтаксический анализатор, что неизвестные типы приемлемы?

Итак, как я могу оптимизировать приложение, чтобы сократить время парсинга?

1 Ответ

3 голосов
/ 02 августа 2020

C ++ как язык не очень поддается спекулятивному синтаксическому анализу из-за анализа, зависящего от типа. Например, токен < может иметь разные значения в зависимости от того, предшествует ли ему шаблон или нет.

Однако libclang поддерживает предварительно скомпилированные заголовки , которые позволяют кэшировать стандартную библиотеку. заголовки.

...