Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чем парсить С/С++ код? 
V
    Опции темы
boostcoder
Дата 22.11.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



baldina, вы точно меня не правильно поняли.
PM WWW   Вверх
baldina
Дата 22.11.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



читал
Цитата

пишу метагенератор для своего проекта

может и не понял. поясните плиз.
как я понимаю, метагенератор нужен для преобразования чего-то в С++
тут два варианта:
1. метакод генерируется автоматически (например, программой-визуальным конструктором). зачем тогда генерить метакод, если можно сразу С++
2. метакод пишется вручную (т.е. полагается, что метакод проще и выразительней). в этом случае предлагаю рассмотреть языковые возможности С++ как альтернативу метакоду

Добавлено через 4 минуты и 12 секунд
(есть еще третий вариант, когда метакод генерится не Вами. тогда странно, что генерилка не комплектуется искомым генератором)

Это сообщение отредактировал(а) baldina - 22.11.2010, 17:17
PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(baldina @  22.11.2010,  17:16 Найти цитируемый пост)
метакод пишется вручную

ага.

Цитата(baldina @  22.11.2010,  17:16 Найти цитируемый пост)
в этом случае предлагаю рассмотреть языковые возможности С++ как альтернативу метакоду

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

из того фрагмента что я привел, генерируется 841 строка smile 
ощущаете разницу? smile 
PM WWW   Вверх
baldina
Дата 22.11.2010, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

ощущаете разницу?

ощущаю. 
в boost::spirit грамматика записывается например так:
Код

template <typename Iterator>
    struct calculator : qi::grammar<Iterator, ascii::space_type>
    {
        calculator() : calculator::base_type(expression)
        {
            using qi::uint_;

            expression =
                term
                >> *(   ('+' >> term)
                    |   ('-' >> term)
                    )
                ;

            term =
                factor
                >> *(   ('*' >> factor)
                    |   ('/' >> factor)
                    )
                ;

            factor =
                uint_
                |   '(' >> expression >> ')'
                |   ('-' >> factor)
                |   ('+' >> factor)
                ;
        }

        qi::rule<Iterator, ascii::space_type> expression, term, factor;
    };

это не требует комментариев и занимает столько же, сколько та же грамматика для yacc например.
и, конечно, все это разворачивается в до черта строчек кода.
абстракцию и инкапсуляцию для того и придумали, что бы скрывать сложность.
впрочем, спорить не буду. Если Вам проще писать метагенератор - удачи

Добавлено через 2 минуты и 10 секунд
ЗЫ: начните с макросов, тут ваще ниче писать не надо.
PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



baldina, мне знаком спирит. но в том, что пытаюсь сделать я, спирит мне сильно не поможет. посмотрите внимательней на мой пример синтаксиса, и скажите, чем спирит мне поможет, кроме как извлекать лексемы?

Добавлено через 20 секунд
или я чего-то не понимаю...или второе..
PM WWW   Вверх
baldina
Дата 22.11.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



я не предлагал использовать spirit. я предлагал вместо отдельной программы-метагенератора написать классы, шаблоны и т.п. для расширения функций языка под свои нужды. как мог бы выглядеть результат "для конечного пользователя" я привел.
а spirit и signals всего лишь примеры такого подходя к решению задач, а не решение Вашей
PM MAIL   Вверх
xvr
Дата 22.11.2010, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Лично я для таких целей использую bison. Но у любого генератора парсеров есть некоторый порог вхождения  smile 
Но в любом случае сначала нужна грамматика, MAKCim абсолютно прав.

В вашем случае (для bison'а) она будет выглядеть как то так (это только кусок, не вся грамматика):
Код

%token tCLASS
%token tCLIENT_SIDE
%token tSERVER_SIDE
%token tSERVICE

%token vID
%token vNUM
%token vSTR

%%

parser: class_def | parser class_def ;
class_def: tCLASS vID ':' kind '{' class_body '}' ';' ;
kind: tCLIENT_SIDE | tSERVER_SIDE | tSERVICE '(' vSTR ')' ;
class_body: | class_body class_body_item ;
class_body_item: constructor | member  ;

constructor: и т.д. и т.п.

member: и т.д. и т.п.

Если у вас используется большое подмножество С++ - то проще будет сразу застрелится  smile 

PM MAIL   Вверх
baldina
Дата 22.11.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



вы сделали вывод 
Цитата

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

тут одно из двух, либо Вы правы, либо недостаточно представляете возможности С++  smile 
PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(baldina @  22.11.2010,  18:01 Найти цитируемый пост)
я предлагал вместо отдельной программы-метагенератора написать классы, шаблоны и т.п. для расширения функций языка под свои нужды

в результате получится что я напишу еще один спирит smile 
испорченный телефон...я вам о том, что мне нужно распарсить мой синтаксис чтоб из него сгенерировать с++ код. вы же мне предлагаете написать классы+шаблоны для этого...невъезжаю smile 
Цитата(baldina @  22.11.2010,  18:05 Найти цитируемый пост)
либо недостаточно представляете возможности С++

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


ладно..пока общались, написал.
всем спасибо.

Добавлено через 1 минуту и 56 секунд
xvr, отдельное спасибо за помощь.
PM WWW   Вверх
baldina
Дата 22.11.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



boostcoder, Вы не поняли. Не для распарсивания Вашего синтаксиса, а для отказа от него. (щас пойдем плясать по кругу)
ладно, решили задачу - и хорошо. хотя жаль...
PM MAIL   Вверх
mes
Дата 22.11.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(baldina @  22.11.2010,  17:23 Найти цитируемый пост)
 Не для распарсивания Вашего синтаксиса, а для отказа от него..

поддерживаю smile

Это сообщение отредактировал(а) mes - 22.11.2010, 18:25


--------------------
PM MAIL WWW   Вверх
xvr
Дата 22.11.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



2 ТС - а почему бы не взять стандартный для RPC синтакс (IDL) и не изобретать велосипед?

PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  22.11.2010,  18:28 Найти цитируемый пост)
а почему бы не взять стандартный для RPC синтакс (IDL) и не изобретать велосипед?

в этом-то и смысл - поизобретать охота smile

Добавлено через 2 минуты и 36 секунд
Цитата(baldina @  22.11.2010,  18:23 Найти цитируемый пост)
Не для распарсивания Вашего синтаксиса, а для отказа от него.

я только ЗА!
но к пониманию того что нужно писать метагенератор я не с фонаря пришел smile 
давайте пообщаемся на эту тему. наверное я что-то недопонимаю..
PM WWW   Вверх
baldina
Дата 22.11.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



тогда опишите задачу - во что (в общем, конечно  smile ) преобразуется 
Код

class test_service: service("statistic service")

Код

void for_inkom_method()
      :incoming[
         client_impl::set_string,
         client_impl::get_int
      ];

и
Код

void for_outgo_method(): outgoing;

?
PM MAIL   Вверх
mes
Дата 22.11.2010, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



и две конечные точки общения (два простых класса между которыми происходит общение без учета возможной реализации) [как раз на этом мы вроде остановились в прошлой теме]

Это сообщение отредактировал(а) mes - 22.11.2010, 18:59


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1036 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.