Иерархия классов из исходника
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.01.05 12:42
Оценка: :)
Есть некоторый синтаксически корректный исходник (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 (можно любой другой удобный формат) вида
<scope type="namespace" name="aaaa" access="public">
    <scope type="class" name="bbbb" access="public">
        <scope type="class" name="ccc" access="public">
            <argument type="typename" name="XXX"/>
            <argument type="class" name="YYY"/>
            <member type="int" name="x" access="private"/>
            <member type="float" name="y" access="public"/>
            <scope type="function" name="func" access="protected">
                <argument type="int" name="[return]"/>
                <argument type="float" name="param1"/>
                <argument type="char *" name="param2"/>
                <argument type="..." name="[unnamed]"/>
            </scope>
        </scope>
    </scope>
</scope>



02.01.05 20:38: Перенесено из 'C/C++'
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Иерархия классов из исходника
От: yxiie Украина www.enkord.com
Дата: 01.01.05 16:47
Оценка: -2 :)
Здравствуйте, adontz, Вы писали:

A>Есть некоторый синтаксически корректный исходник (cpp или h файл)

A>Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.

думаю проще всего будет на boost::spirit'e зафигачить...
готового подобного парсера не видел, да и если есть, врядли он будет в удобном к использованию виде (имеется ввиду что-то либо-образное). скорее всего придется много и геморно работать напильником и то не ясно что в конце получится.
так что проще на spirit-e imho
... << RSDN@Home 1.1.3 stable >>
Re: Иерархия классов из исходника
От: _AK_ Россия  
Дата: 01.01.05 19:25
Оценка: -1
Здравствуйте, adontz, Вы писали:

A>Есть некоторый синтаксически корректный исходник (cpp или h файл)

A>Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.

[...]

www.gccxml.org
Re[2]: Иерархия классов из исходника
От: uw  
Дата: 01.01.05 19:40
Оценка: -2
Здравствуйте, _AK_, Вы писали:

_AK>www.gccxml.org


Никак не отражает присутствие шаблонов. В приведенном примере был шаблон.
Re[2]: Иерархия классов из исходника
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.01.05 19:48
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>думаю проще всего будет на boost::spirit'e зафигачить...


Я с ним не работал никогда, да и опыта написания парсеров нету. Есть ли какие-нибудь примеры?

Y>готового подобного парсера не видел, да и если есть, врядли он будет в удобном к использованию виде (имеется ввиду что-то либо-образное). скорее всего придется много и геморно работать напильником и то не ясно что в конце получится.


Есть doxygen, генерирует XML, но по файлу на класс + индекс. Это не очень удобно. К тому же он работает не очень быстро — оно и понятно, ведь его основная задача это генерация документации, скорость не так важна, зато выполняется много лишней работы не нужной мне.

Y>так что проще на spirit-e imho


Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Иерархия классов из исходника
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.01.05 20:10
Оценка:
Здравствуйте, uw, Вы писали:

uw>Никак не отражает присутствие шаблонов. В приведенном примере был шаблон.


Да, параметры шаблона мне действительно нужны.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Иерархия классов из исходника
От: yxiie Украина www.enkord.com
Дата: 01.01.05 21:07
Оценка: -1 :)
Здравствуйте, 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>Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал.

есть прекрасный повод попробовать
... << RSDN@Home 1.1.3 stable >>
2 uw
От: yxiie Украина www.enkord.com
Дата: 01.01.05 22:13
Оценка: +1 -1 :))
мы вас внимательно слушаем, мистер "минус"...
... << RSDN@Home 1.1.3 stable >>
Re[4]: Иерархия классов из исходника
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.01.05 23:26
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>>>так что проще на spirit-e imho

A>>Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал.
Y>есть прекрасный повод попробовать

Повод ужасный, получение дерева Си++ классов это всего лишь сопутсвующая задача и писать Си++ парсер я вовсе не хочу
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Иерархия классов из исходника
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 00:17
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>>>так что проще на spirit-e imho

A>>Может оно и так, но я сам парсеры таких сложных языков как Си++ никогда не писал.
Y>есть прекрасный повод попробовать

Скачал Boost, Spirit и Wave. Wave не скомпилировался — облом.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Иерархия классов из исходника
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.01.05 09:09
Оценка:
Здравствуйте, adontz, Вы писали:

A>Есть некоторый синтаксически корректный исходник (cpp или h файл)

A>Нужен парсер (библиотека или программа выдающая всё в приемлемом для дальнейшей обработки формате) который по исходнику выдаст мне иерархию классов и список членов класса.

Если gcc-xml не подходит и есть желание самому поработать напильником, то можно посмотреть еще и в таких направлениях:

ANTLR. Для него я видел готовые правила лексического и синтаксического анализа C/C++;
— в интернете можно поискать готовые граматики для yacc (bison) и описания для lex (flex) для C/C++;
— если нет желания работать с doxygen, то это не единственный инструмент для выделения документации по C++ коду. Есть еще, например, CcDoc. Да и на самом сайте www.doxygen.org были ссылки на аналогичные инструменты -- можно выбрать что-нибудь.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Иерархия классов из исходника
От: yxiie Украина www.enkord.com
Дата: 02.01.05 09:33
Оценка: -1
Здравствуйте, 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, обрезать и переделать под спирит.
... << RSDN@Home 1.1.3 stable >>
Re: 2 uw
От: uw  
Дата: 02.01.05 12:27
Оценка: +1 -2
Здравствуйте, yxiie, Вы писали:

Y> мы вас внимательно слушаем, мистер "минус"...


За написание парсера C++ на Spirit'е нужно сразу ставить памятник с золотой табличкой, как мученику. К тому же зачем это делать когда есть куча готовых(в основном "почти") парсеров: GCC, OpenC++. На базе OpenC++ есть даже проект ориентированный на автоматическое создание документации. Кроме gcc ничего действительно "хорошего" в этой области нет и я думаю не будет уже никогда.

Вот поэтому и минусы. За полное незнание реальной ситуации и за навязывание собственных беспочвенных иллюзий людям. В данном случае единственный выход — доработка существующих решений.


Кстати можно еще взглянуть на Swig. Но и в этом случае бюез напильника не обойтись.
Re[3]: Иерархия классов из исходника
От: uw  
Дата: 02.01.05 12:33
Оценка: -2
Здравствуйте, uw, Вы писали:

uw>Никак не отражает присутствие шаблонов. В приведенном примере был шаблон.


<?xml version="1.0"?>
<GCC_XML>
  <Namespace id="_1" name="::" members="_3 " mangled="_Z2::"/>
  <Namespace id="_2" name="std" context="_1" members="" mangled="_Z3std"/>
  <Namespace id="_3" name="aaaa" context="_1" members="_4 " mangled="_Z4aaaa"/>
  <Class id="_4" name="bbbb" context="_3" mangled="N4aaaa4bbbbE" location="f0:4" file="f0" line="4" members="_5 _6 _7 _8 " bases=""/>
  <Field id="_5" name="a" type="_9" context="_4" mangled="_ZN4aaaa4bbbb1aE" location="f0:18" file="f0" line="18"/>
  <Field id="_6" name="b" access="private" type="_9" context="_4" mangled="_ZN4aaaa4bbbb1bE" location="f0:20" file="f0" line="20"/>
  <Constructor id="_7" name="bbbb" artificial="1" throw="" context="_4" mangled="_ZN4aaaa4bbbbC1ERKS0_ *INTERNAL* " location="f0:4" file="f0" line="4">
    <Argument name="_ctor_arg" type="_10"/>
  </Constructor>
  <Constructor id="_8" name="bbbb" artificial="1" throw="" context="_4" mangled="_ZN4aaaa4bbbbC1Ev *INTERNAL* " location="f0:4" file="f0" line="4"/>
  <FundamentalType id="_9" name="int"/>
  <ReferenceType id="_10" type="_4c"/>
  <CvQualifiedType id="_4c" type="_4" const="1"/>
  <File id="f0" name="simple.cpp"/>
</GCC_XML>
Re[2]: 2 uw
От: yxiie Украина www.enkord.com
Дата: 02.01.05 13:34
Оценка: -1
Здравствуйте, uw, Вы писали:

uw>Здравствуйте, yxiie, Вы писали:


Y>> мы вас внимательно слушаем, мистер "минус"...


uw>За написание парсера C++ на Spirit'е нужно сразу ставить памятник с золотой табличкой, как мученику.


обрати внимание, что парсер нужен не *всей* грамматики С++.

uw>К тому же зачем это делать когда есть куча готовых(в основном "почти") парсеров: GCC, OpenC++. На базе OpenC++ есть даже проект ориентированный на автоматическое создание документации. Кроме gcc ничего действительно "хорошего" в этой области нет и я думаю не будет уже никогда.


uw>Вот поэтому и минусы. За полное незнание реальной ситуации и за навязывание собственных беспочвенных иллюзий людям.


голословные заявления, тебе не кажется? тем более, что я никому ничего не навязывал.

uw>В данном случае единственный выход — доработка существующих решений.


uw>Кстати можно еще взглянуть на Swig. Но и в этом случае бюез напильника не обойтись.


хотел бы я посмотреть как ты будешь доводить до ума вышепреведенные примеры, на сколько времени это у тебя займет по сравнению с простым парсером иерархии классов на спирите.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Иерархия классов из исходника
От: What Беларусь  
Дата: 02.01.05 23:23
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>думаю проще всего будет на boost::spirit'e зафигачить...


Откуда у Вас такая информация?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[3]: Иерархия классов из исходника
От: dwl  
Дата: 04.01.05 13:15
Оценка:
Здравствуйте, adontz, Вы писали:

Y>>думаю проще всего будет на boost::spirit'e зафигачить...

A>Я с ним не работал никогда, да и опыта написания парсеров нету. Есть ли какие-нибудь примеры?

cpp_lexer
cpp_to_html
wave
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.