2010-02-17 2 views
11

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

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

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

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

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

Спасибо!

+0

Кто-то хочет сделать клон Visual Studio [для обнаружения ошибок перед компиляцией] :) – Earlz

+0

Интересный проект. Некоторое время я ждал, чтобы кто-то написал IDE на основе Clang. Если вы создадите полноценную среду IDE, рассмотрите возможность использования CMake в качестве своей системы/файлов проекта. – Tronic

+3

Возможно, libclang's ['clang_reparseTranslationUnit()'] (http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a) может удовлетворить ваши потребности? – bames53

ответ

3

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

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

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

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

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

0

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

+0

Проблема в том, что очень трудно получить парсер C++. Все, что вы пишете, скорее всего, не будет иметь точное поведение реального компилятора. В идеале, и это одна из целей проекта clang, одна и та же библиотека, используемая для сборки компилятора, может быть повторно использована IDE для получения согласованных результатов. – bames53