Llvm-clang: инкрементный или онлайн-парсер?

Можно ли использовать парсер llvm-clang в инкрементном/онлайн-режиме?

Скажем, я пишу редактор, и я хочу, чтобы я смог проанализировать код С++, который у меня передо мной.

Я не хочу писать собственный взломанный парсер.

Я хотел бы использовать что-то полнофункциональное, например llvm-clang.

Есть ли простой способ захватить парсер llvm-clang? (И достаточно ли он достаточно быстро, чтобы запустить его в фоновом режиме)?

Спасибо!

Ответ 1

Я не думаю, что clang может инкрементно анализировать файлы С++, но это одна из целей этого проекта: http://clang.llvm.org/features.html

Я написал что-то подобное для моего проекта в прошлом году. Это был не С++-редактор, а плагин Visual Studio, главной задачей которого было улучшение С++ intellisense (например, Visual Assist X).

Когда я писал этот проект, я также думал о инкрементном парсере С++, но я не нашел подходящего решения. Чтобы решить проблему С++ intellisense, я использовал обычный синтаксический анализатор С++ из GCC. Тем не менее, это было медленным, чтобы проанализировать файл после каждого запроса завершения кода (ctrl + space), просто попробуйте включить boost:: spirit. Чтобы этот проект работал правильно, я разбирал файлы в фоновом режиме, и после каждого запроса завершения кода я сравнивал текущий файл с предыдущей версией (через diff) для обнаружения изменений, сделанных в результате последнего разбора. После этих изменений я обновил синтаксическое дерево, в основном путем добавления или удаления переменных.

Кроме инкрементного синтаксического анализа, возникает и другая проблема с такими проектами. В основном вы будете анализировать код С++, который редактируется, чтобы он недействительный код. Учитывая сложную грамматику С++, иногда синтаксический анализатор не сможет восстановить синтаксические ошибки, поэтому он не будет корректно определять некоторые символы в коде.

Другая проблема - различия в синтаксических анализаторах/компиляторах С++. Скажем, я использую работу в Visual Studio, и я использовал некоторые компиляторы VС++ в моем коде. Анализатор Clang не сможет правильно разобрать его.

Ответ 2

Чтобы написать что-то похожее на IntelliSense, я бы посоветовал вам написать собственный парсер, используя алгоритм анализа LALR. Так как вы можете сохранить свое состояние в каждой строке, так что вам не придется переписывать весь файл, когда файл был изменен, что очень быстро!
Обратите внимание, что С++ не может быть полностью выражен в BNF, но я думаю, вы могли бы получить довольно далеко с некоторыми настройками. Это, конечно, намного больше, чем использование интерфейса Clang, но вы все равно можете использовать Clang для анализа файлов заголовков в сотрудничестве с вашим собственным письменным парсером.