Есть некоторый синтаксически корректный исходник (cpp или h файл)
Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.
Пример:
Есть исходник вида
namespace aaaa
{
class bbbb
{
public:
template<typename XXX, class YYY>
class ccc
{
private:
int x;
public:
float y;
protected:
int func(float param1, char * param2,...);
}
}
}
Нужен, например, XML (можно любой другой удобный формат) вида
Здравствуйте, adontz, Вы писали:
A>Есть некоторый синтаксически корректный исходник (cpp или h файл) A>Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.
думаю проще всего будет на boost::spirit'e зафигачить...
готового подобного парсера не видел, да и если есть, врядли он будет в удобном к использованию виде (имеется ввиду что-то либо-образное). скорее всего придется много и геморно работать напильником и то не ясно что в конце получится.
так что проще на spirit-e imho
Здравствуйте, adontz, Вы писали:
A>Есть некоторый синтаксически корректный исходник (cpp или h файл) A>Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.
Здравствуйте, yxiie, Вы писали:
Y>думаю проще всего будет на boost::spirit'e зафигачить...
Я с ним не работал никогда, да и опыта написания парсеров нету. Есть ли какие-нибудь примеры?
Y>готового подобного парсера не видел, да и если есть, врядли он будет в удобном к использованию виде (имеется ввиду что-то либо-образное). скорее всего придется много и геморно работать напильником и то не ясно что в конце получится.
Есть doxygen, генерирует XML, но по файлу на класс + индекс. Это не очень удобно. К тому же он работает не очень быстро — оно и понятно, ведь его основная задача это генерация документации, скорость не так важна, зато выполняется много лишней работы не нужной мне.
Y>так что проще на spirit-e imho
Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, yxiie, Вы писали:
Y>>думаю проще всего будет на boost::spirit'e зафигачить... A>Я с ним не работал никогда, да и опыта написания парсеров нету. Есть ли какие-нибудь примеры?
вместе со спиритом есть готовые примеры парсеров Cи, паскаля и XML, также есть лексер С++.
в последней версии буста 1.32.0 я их правда не нашел, но в 1.30.2 точно были. поэтому наверное придется качнуть отдельный дистрибутив спирита.
Y>>готового подобного парсера не видел, да и если есть, врядли он будет в удобном к использованию виде (имеется ввиду что-то либо-образное). скорее всего придется много и геморно работать напильником и то не ясно что в конце получится.
A>Есть doxygen, генерирует XML, но по файлу на класс + индекс. Это не очень удобно. К тому же он работает не очень быстро — оно и понятно, ведь его основная задача это генерация документации, скорость не так важна, зато выполняется много лишней работы не нужной мне.
doxygen и gccxml как раз входят в эту "напильникотребующую" категорию
Y>>так что проще на spirit-e imho A>Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал.
Здравствуйте, yxiie, Вы писали:
Y>>>так что проще на spirit-e imho A>>Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал. Y>есть прекрасный повод попробовать
Повод ужасный, получение дерева Си++ классов это всего лишь сопутсвующая задача и писать Си++ парсер я вовсе не хочу
Здравствуйте, yxiie, Вы писали:
Y>>>так что проще на spirit-e imho A>>Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал. Y>есть прекрасный повод попробовать
Скачал Boost, Spirit и Wave. Wave не скомпилировался — облом.
Здравствуйте, adontz, Вы писали:
A>Есть некоторый синтаксически корректный исходник (cpp или h файл) A>Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.
Если gcc-xml не подходит и есть желание самому поработать напильником, то можно посмотреть еще и в таких направлениях:
— ANTLR. Для него я видел готовые правила лексического и синтаксического анализа C/C++;
— в интернете можно поискать готовые граматики для yacc (bison) и описания для lex (flex) для C/C++;
— если нет желания работать с doxygen, то это не единственный инструмент для выделения документации по C++ коду. Есть еще, например, CcDoc. Да и на самом сайте www.doxygen.org были ссылки на аналогичные инструменты -- можно выбрать что-нибудь.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>- ANTLR. Для него я видел готовые правила лексического и синтаксического анализа C/C++; E>- в интернете можно поискать готовые граматики для yacc (bison) и описания для lex (flex) для C/C++; E>- если нет желания работать с doxygen, то это не единственный инструмент для выделения документации по C++ коду. Есть еще, например, CcDoc. Да и на самом сайте www.doxygen.org были ссылки на аналогичные инструменты -- можно выбрать что-нибудь.
сразу хочу предупредить adontz насчет lex\yacc\bison — эта вещь может потрбеовать очень много времени чтобы разобраться. думаю не стоит соблазнятся, хотя можно взять готовую EBNF грамматику под yacc, обрезать и переделать под спирит.
Здравствуйте, yxiie, Вы писали:
Y> мы вас внимательно слушаем, мистер "минус"...
За написание парсера C++ на Spirit'е нужно сразу ставить памятник с золотой табличкой, как мученику. К тому же зачем это делать когда есть куча готовых(в основном "почти") парсеров: GCC, OpenC++. На базе OpenC++ есть даже проект ориентированный на автоматическое создание документации. Кроме gcc ничего действительно "хорошего" в этой области нет и я думаю не будет уже никогда.
Вот поэтому и минусы. За полное незнание реальной ситуации и за навязывание собственных беспочвенных иллюзий людям. В данном случае единственный выход — доработка существующих решений.
Кстати можно еще взглянуть на Swig. Но и в этом случае бюез напильника не обойтись.
Здравствуйте, uw, Вы писали:
uw>Здравствуйте, yxiie, Вы писали:
Y>> мы вас внимательно слушаем, мистер "минус"...
uw>За написание парсера C++ на Spirit'е нужно сразу ставить памятник с золотой табличкой, как мученику.
обрати внимание, что парсер нужен не *всей* грамматики С++.
uw>К тому же зачем это делать когда есть куча готовых(в основном "почти") парсеров: GCC, OpenC++. На базе OpenC++ есть даже проект ориентированный на автоматическое создание документации. Кроме gcc ничего действительно "хорошего" в этой области нет и я думаю не будет уже никогда.
uw>Вот поэтому и минусы. За полное незнание реальной ситуации и за навязывание собственных беспочвенных иллюзий людям.
голословные заявления, тебе не кажется? тем более, что я никому ничего не навязывал.
uw>В данном случае единственный выход — доработка существующих решений.
uw>Кстати можно еще взглянуть на Swig. Но и в этом случае бюез напильника не обойтись.
хотел бы я посмотреть как ты будешь доводить до ума вышепреведенные примеры, на сколько времени это у тебя займет по сравнению с простым парсером иерархии классов на спирите.
Здравствуйте, adontz, Вы писали:
Y>>думаю проще всего будет на boost::spirit'e зафигачить... A>Я с ним не работал никогда, да и опыта написания парсеров нету. Есть ли какие-нибудь примеры?