Clang для нечеткого разбора C++

Возможно ли вообще анализировать C++ с неполными объявлениями с помощью clang с его существующим API libclang? т.е. анализировать файл .cpp, не включая все заголовки, выводя объявления на лету. так, напр. Следующий текст:

A B::Foo(){return stuff();}

Обнаружит неизвестный символ A, вызовет мой обратный вызов, который выводит A как класс, используя мою магическую эвристику, затем вызовет этот обратный вызов таким же образом с B и Foo и прочее. В конце концов, я хочу иметь возможность сделать вывод, что я видел, как член Foo класса B возвращает A, а материал — это функция.. Или что-то в этом роде. контекст: я хочу посмотреть, смогу ли я сделать разумную подсветку синтаксиса и анализ кода на лету без очень быстрого разбора всех заголовков.

[EDIT] Чтобы уточнить, я ищу очень сильно ограниченный анализ C++, возможно, с некоторой эвристикой для снятия некоторых ограничений.

Грамматика C++ полна контекстных зависимостей. Является ли Foo() вызовом функции или конструкцией временного класса Foo? Является ли Foo материалом; экземпляр шаблона Foo и объявление переменных материала, или это странно выглядящие 2 вызова перегруженного оператора < и оператора > ? Это можно сказать только в контексте, а контекст часто исходит из разбора заголовков.

То, что я ищу, - это способ подключить мои пользовательские правила соглашения. Например.Я знаю, что не перегружаю символы Win32, поэтому могу с уверенностью предположить, что CreateFile — это всегдафункция, и я даже знаю ее сигнатуру. Я также знаю, что все мои классы начинаются с заглавной буквы и являются существительными, а функции обычно представляют собой глаголы, поэтому я могу разумно предположить, что Foo и Bar — это имена классов. В более сложном сценарии я знаю, что не пишу выражения без побочных эффектов, такие как a < b > c; поэтому я могу предположить, что a всегда является экземпляром шаблона. И так далее.

Итак, вопрос в том, можно ли использовать Clang API для обратного вызова каждый раз, когда он встречает неизвестный символ, и давать ему ответ, используя мою собственную эвристику, отличную от C++. Если моя эвристика терпит неудачу, то синтаксический анализ, очевидно, терпит неудачу. И я не говорю о парсинге библиотеки Boost :) Я говорю об очень простом C++, возможно, без шаблонов, ограниченном каким-то минимумом, с которым в данном случае может справиться clang.

17
задан Sergiy Migdalskiy 21 June 2012 в 18:02
поделиться