llvm-clang: инкрементный или онлайн-парсер? - PullRequest
11 голосов
/ 18 февраля 2010

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

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

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

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

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

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

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

Когда я писал этот проект, я также думал о инкрементном синтаксическом анализаторе C ++, но не нашел подходящего решения. Для решения проблемы интеллигенции в C ++ я использовал обычный синтаксический анализатор C ++ из GCC. Однако, чтобы замедлить анализ файла после каждого запроса завершения кода (Ctrl + Пробел), просто попробуйте включить boost :: spirit. Чтобы заставить этот проект работать должным образом, я анализировал файлы в фоновом режиме и после каждого запроса завершения кода сравнивал текущий файл с его предыдущей версией (через diff), чтобы обнаружить изменения, сделанные после последнего анализа. Имея эти изменения, я обновил синтаксическое дерево, в основном, добавляя или удаляя переменные.

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

Другая проблема - различия в синтаксических анализаторах / компиляторах C ++. Допустим, я использую работу в Visual Studio и в своем коде я использовал конструкцию, специфичную для компилятора VC ++. Clang Parser не сможет правильно его проанализировать.

0 голосов
/ 11 января 2013

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

...