LINUX.ORG.RU

Парсинг и добывание имен С/С++ функций в исходнике (CLANG?)

 , ,


0

3

Вот у меня есть сорцы на С/С++, мне нужно написать консольную программу, которая будет получать имена всех функций из файла. Сначала я хотел использовать регулярку, но в срр слишком сложный синтаксис, функции могут быть объявлены как ты хочешь, разным макаром, плюс шаблоны и перегрузки. Как можно решить эту проблему? Я читал что есть библиотеки типа Clang, которые можно для этих задач использовать. Только я с ними никогда не работал. Какие еще пути решения есть? И есть ли простенькие примеры на силанг, потому что мануал довольно обширный.

функции могут быть объявлены как ты хочешь, разным макаром

ну и какие разные макары ты знаешь? TITS OR GTFO!

anonymous
()

Я читал что есть библиотеки типа Clang, которые можно для этих задач использовать.

Сам спросил - сам ответил.

Какие еще пути решения есть?

Больше никаких, парсер С++ за вечер не пишется, нормальные реализации есть только в gcc и clang. Из первого парсер не выдрать при всем желании, в то время как второй специально писался максимально модульно, дабы можно было использовать в тулзах вроде твоей. Открывай документацию/примеры и начинай изучать.

anonymous
()
Ответ на: комментарий от anonymous

int function< type >( type A ) ... int function( Class< std::string> str )

Еще методы могут быть по-разному объявлены. В общем слишком много тонкостей чтобы регекспом обойтись, не?

freelsd
() автор топика
Ответ на: комментарий от anonymous

Ну я поэтому и спросил, что кроме clang ничего не слышал. Может тут еще кто-нибудь посоветует чего.

freelsd
() автор топика
Ответ на: комментарий от freelsd

поверь, это конечное множество паттернов объявления функций и функций членов. тебе сначала надо найти объявление, а потом уже парсить. копни открытые среды, типа kdevelop, они умеют показывать навигатор по функциям в коде.

anonymous
()
Ответ на: комментарий от anonymous

В смысле «умеют показывать навигатор»? Мне же нужна либа или класс, которая парсит С++файл и выдает имена функций, так было бы проще. Ну или на крайняк список регекспов, я не знаю.

freelsd
() автор топика
Ответ на: комментарий от tailgunner

Посони, мне нужно утилиту самому такую сделать, из стороннего софта я могу только классы какие-нибудь использовать или хедеры.

freelsd
() автор топика
Ответ на: комментарий от freelsd

из стороннего софта я могу только классы какие-нибудь использовать или хедеры

Ну, у LLVM есть библиотечный интерфейс для того, что тебе нужно. Используй упомянутый выше PCX как пример, и напиши свое.

tailgunner ★★★★★
()
Ответ на: комментарий от freelsd

Там ещё и XML, если б gccxml вместо это объектную модель строило в плюсах было бы круто. А так я, конечно, clang не люблю, но для подобной фигни он годится, можно тут глянуть пример, там в принципе мало кода и всё что он делает так это обходит объявления/определения всех функций (ещё в виде текста есть может проще будет прочитать). И да, там для методов классов надо будет матчеров добавить.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

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

простейший способ - натравить что-нить типа http://ctags.sourceforge.net/index.html на сорц и разобрать выхлоп.

MKuznetsov ★★★★★
()
Ответ на: комментарий от tailgunner

Да, я прочел, только так и не нашел как его на студию 2008 поставить. Где-то написано было, что нужна > 2012. Охеренеть теперь.

freelsd
() автор топика
Ответ на: комментарий от anonymous

TITS OR GTFO!

ПНХ! Как минимум, вызов функции и прямой вызов конструктора класса схожи до неразличимости, даже по контексту не всегда можно сообразить. Далее, в классе может быть объявлен operator (), что тоже добавляет ада к распознаванию кто где. Это что вот прям щас вспомнилось.

one_more_hokum ★★★
()
Ответ на: комментарий от one_more_hokum

Далее, в классе может быть объявлен operator ()
кйонструктора класса

их объявления кардинально отличаются от объявлений простых функций

next_time ★★★★★
()
Ответ на: комментарий от one_more_hokum

Что ты там не можешь сообразить?

Class object();

object();

не умеешь парсить строку где объект создается, а где дергается вызов функции? GTFO!

anonymous
()
Ответ на: комментарий от freelsd

Какую студию? Ты больной, что ли? И зачем тебе для standalone утилиты что-то кроме Питона?

Кроме того, API в cindex прозрачное, на Си перенести то же самое тривиально (если ты не совсем дебил).

anonymous
()
Ответ на: комментарий от freelsd

Зачем? По глупости, или еще какая религия?

anonymous
()
Ответ на: комментарий от freelsd

Ну так и перепиши с питона на си, если ты действительно настолько упертый и глупый. Кто мешает? API в libclang тривиальное.

anonymous
()
Ответ на: комментарий от anonymous

не умеешь парсить строку где объект создается, а где дергается вызов функции?

Внезапно, первое может быть совмещено со вторым:

Class();

one_more_hokum ★★★
()
Ответ на: комментарий от Chaser_Andrey

Хорошо, я гляну, только штоб под mcvs юзать, там кроме заголовков нужно что-то установить в систему, не?

freelsd
() автор топика
Ответ на: комментарий от Chaser_Andrey

для сборки требуется ликовка со следующим набором библиотек: clangLex, clangBasic, clangAST, clangSerialization, clangEdit, clangAnalysis, clangFrontend, clangSema, clangDriver, clangParse, LLVMCore, LLVMMC, и LLVMSupport. При сборке под Windows также требуется добавить advapi32 и shell32.

freelsd
() автор топика
Ответ на: комментарий от freelsd

Пиши под Linux или FreeBSD, если тебя утомляет сборка под винду, в чём проблема? А потом уже как-нибудь соберешь и под винду.

Chaser_Andrey ★★★★★
()
Последнее исправление: Chaser_Andrey (всего исправлений: 1)
Ответ на: комментарий от Chaser_Andrey

Да нет, меня не утомляет, просто нужно под win сделать, а опыта у меня довольно мало, если честно. Но в любом случае, в треде информации к изучению прилично, и, наверное, сначала нужно с ней ознакомиться, а потом по мере надобности еще темы создавать.

freelsd
() автор топика
Ответ на: комментарий от one_more_hokum

умница, съехал с темы о различии синтаксиса вызова конструктора и оператора вызова функции на тему действий в конструторе. не интересен.

anonymous
()

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

*facepalm.jpg*

Я читал что есть библиотеки типа Clang, которые можно для этих задач использовать.

Их и нужно. Вот простой пример https://github.com/loarabia/Clang-tutorial/blob/master/CItutorial2.cpp, чтобы въехать.

anonymous
()

А ctags не подойдет?

hibou ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.