Там должен так или иначе использовать синтаксический анализатор llvm-лязга возрастающим/онлайн способом?
Скажите, что я пишу, что редактор и я хотим смочь проанализировать код C++, который я имею передо мной.
Я не хочу писать свой собственный изрубленный синтаксический анализатор.
Я хотел бы использовать что-то полнофункциональное, как llvm-лязг.
Существует ли простой способ угнать синтаксический анализатор llvm-лязга? (И это достаточно быстро для выполнения его непрерывно в фоновом режиме)?
Спасибо!
Я не думаю, что clang может постепенно анализировать файлы C ++, но это одна из целей этого проекта: http://clang.llvm.org/features.html
Я написал нечто подобное для своего финала Это был не редактор C ++, а плагин Visual Studio, основной задачей которого было улучшение C ++ intellisense (например, Visual Assist X).
Когда я писал этот проект, я тоже думал насчет инкрементного синтаксического анализатора C ++, но я не нашел подходящего решения. Для решения проблемы intellisense C ++ я использовал обычный синтаксический анализатор C ++ от GCC. Однако это было слишком медленно, чтобы анализировать файл после каждого запроса на завершение кода (ctrl + пробел), просто попробуйте включить boost :: spirit. Чтобы этот проект работал правильно, я анализировал файлы в фоновом режиме и после каждого запроса на завершение кода сравнивал текущий файл с его предыдущей версией (через diff), чтобы обнаружить изменения, сделанные в результате последнего анализа. После этих изменений я обновил синтаксическое дерево, в основном путем добавления или удаления переменных.
Кроме инкрементного синтаксического анализа, у подобных проектов есть еще одна проблема. В основном вы будете разбирать код C ++, который редактируется, чтобы он был недействительным. Учитывая сложную грамматику C ++, иногда синтаксический анализатор не может восстановить синтаксические ошибки, поэтому он некорректно обнаруживает некоторые символы в коде.
Еще одна проблема - различия парсеров / компиляторов C ++. Скажем, я работаю в Visual Studio, и я использовал в своем коде некоторую конструкцию, специфичную для компилятора VC ++. Парсер Clang не сможет правильно его разобрать.