Возможно ли вообще разобрать С++ с неполными объявлениями с clang с его существующим API-интерфейсом libclang? То есть parse.cpp файл без включения всех заголовков, выводя объявления на лету. так, например, Следующий текст:
A B::Foo(){return stuff();}
Будет обнаружен неизвестный символ A, вызовите мой обратный вызов, который вычитает A, - это класс, используя мою магическую эвристику, затем вызывайте этот обратный вызов так же, как и B, и Foo и прочее. В конце концов, я хочу иметь возможность сделать вывод, что я видел член Foo класса B, возвращающий A, а материал - это функция. Или что-то в этом роде. context: Я хочу посмотреть, могу ли я сделать разумную подсветку синтаксиса и анализ кода мух без синтаксического разбора всех заголовков очень быстро.
[EDIT] Чтобы уточнить, я ищу очень сильно ограниченный синтаксический анализ С++, возможно, с некоторой эвристикой, чтобы снять некоторые ограничения.
С++ грамматика полна зависимостей контекста. Является ли Foo() вызовом функции или конструкцией временного класса Foo? Является ли Foo <Bar> материал; шаблон Foo <Bar> создание экземпляра и объявление переменной вещи, или это странные 2 обращения к перегруженному оператору < и оператоp > ? Это возможно только в контексте, и контекст часто возникает из разбора заголовков.
То, что я ищу, - это способ подключить мои правила пользовательских конвенций. Например. Я знаю, что я не перегружаю символы Win32, поэтому могу смело предположить, что CreateFile всегда является функцией, и я даже знаю ее подпись. Я также знаю, что все мои классы начинаются с большой буквы и являются существительными, а функции обычно являются глаголами, поэтому я могу разумно предположить, что Foo и Bar являются именами классов. В более сложном сценарии я знаю, что я не пишу без побочных эффектов, таких как <b> c; поэтому я могу предположить, что a всегда является экземпляром шаблона. И так далее.
Итак, вопрос в том, можно ли использовать Clang API для обратного вызова каждый раз, когда он встречает неизвестный символ, и дать ему ответ, используя мою собственную эвристику, отличную от С++. Если моя эвристика терпит неудачу, то, разумеется, разбор не выполняется. И я не говорю о разборе библиотеки Boost:) Я говорю о очень простом С++, возможно, без шаблонов, ограниченном некоторым минимумом, который может обрабатывать в этом случае clang.